java中的静态和非静态上下文中的问题

时间:2014-08-14 12:46:31

标签: java

示例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执行时没有任何错误!为什么?有人可以解释一下吗?

6 个答案:

答案 0 :(得分:0)

因为您没有在静态上下文中引用next()。您通过实例调用它,因此它的上下文是调用它的对象(sc.next())。

答案 1 :(得分:0)

确定。

  1. 在第一种情况下,getangle方法是类的实例方法,但您尝试从类的static方法调用它。 因此,作为static上下文的错误无法知道同一类的实例。
  2. 在第二种情况下,您正在调用在Object方法的上下文中初始化的static的实例方法,因此调用其实例方法是完全合法的。
  3. 换句话说......

    1. 给定类的static方法和语句无法访问给定类的实例字段和方法。
    2. 任何上下文中初始化的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来访问其任何公共实例方法。