示例1
public class HelloWorld
{
static double angle=10.0; //or non-static
public double getangle(){
return angle;
}
public static void main(String []args)
{
System.out.println("Hello World "+getangle());
}
以上代码产生以下错误:
HelloWorld.java:7: error: non-static method getangle() cannot be referenced from a static context
示例2
import java.util.Scanner;
public class Myscanner
{
public static void main(String args[])
{
Scanner sc= new Scanner(System.in);
System.out.println("enter your name: ");
String name=sc.next();
System.out.println("enter your age: ");
int age=sc.nextInt();
System.out.println("enter your salary: ");
double sal= sc.nextDouble();
System.out.println("name is "+name+" age is "+age+" salary is "+sal);
}
}
在示例2中,'sc.next()'
是一个非静态方法,它是从静态上下文引用的,它是主要方法。但是示例2执行时没有任何错误!为什么?有人可以解释一下吗?
答案 0 :(得分:0)
因为您没有在静态上下文中引用next()
。您通过实例调用它,因此它的上下文是调用它的对象(sc.next()
)。
答案 1 :(得分:0)
确定。
getangle
方法是类的实例方法,但您尝试从类的static
方法调用它。
因此,作为static
上下文的错误无法知道同一类的实例。 Object
方法的上下文中初始化的static
的实例方法,因此调用其实例方法是完全合法的。换句话说......
static
方法和语句无法访问给定类的实例字段和方法。 Object
的实例字段和方法可在该上下文中访问(如果访问修饰符当然允许)。答案 2 :(得分:0)
非静态方法getangle()无法从静态上下文中引用
示例-1:
getAngle()
在实例级中为类HelloWorld
定义,因此,您需要HelloWorld
的实例才能访问它。
'sc.next()'是一个非静态方法,它是从静态上下文引用的,它是主要方法。但是示例2执行时没有任何错误!为什么?有人可以解释一下吗?
示例-2:
next()
方法在实例级中为Scanner
对象定义,并且您正在创建一个新的Scanner对象实例
Scanner sc= new Scanner(System.in);
并使用它:sc.next();
答案 3 :(得分:0)
案例1:
虽然该字段是静态的,但您调用的方法是非静态方法,需要访问该实例的实例。因此错误。
案例2:
您在静态上下文中有Scanner实例,您可以访问这些实例方法。所以没有错误。
答案 4 :(得分:0)
在示例1中,您试图在没有实例化任何getAngle
对象的情况下调用HelloWorld
,从而导致错误(因为getAngle
不是静态的)。
在示例2中,您实例化了一个名为Scanner
的{{1}}对象,因此如果sc
不是静态的,则调用sc.next()
事件没有任何错误。
答案 5 :(得分:0)
在示例1中,您没有引用任何HelloWorld
对象,因此无法访问其任何成员变量或方法。
在示例2中,您对sc
对象有一个引用Scanner
,因此可以使用sc
来访问其任何公共实例方法。