引用静态方法java中的实例变量

时间:2014-08-08 09:02:21

标签: java reference static

Line 1:  public class C { 
Line 2:      public static void main(String[] args) { 
Line 3:         // method2();
Line 4:      }
Line 5: 
Line 6:      
Line 7:      Circle c = new Circle();
Line 8:      public static void method2() { 
Line 9:          // Circle c = new Circle();
Line 10: 
Line 11:        System.out.println("What is radius "+ c.getRadius()); //compile error : non-static variable c cannot be referenced from a static context.  Why? here "c" is a instance variable. 
Line 12:     }
Line 13: 
Line 14:    
Line 15:  }
Line 16:  
Line 17:   class Circle
Line 18:  {
Line 19:    public  int getRadius()
Line 20:    {
Line 21:        return 3;
Line 22:    }
Line 23:  }

问题:在第11行,编译错误说,非静态变量c不能从静态上下文引用。为什么?在这里" c"是一个实例变量。但是下面的代码没问题。为什么呢?

如果我从第8行更改为12

public static void method2() { 
    Circle c = new Circle();
    System.out.println("What is radius "+ c.getRadius()); 
}

或者:

Circle c = new Circle();
public void method2() { 
    System.out.println("What is radius "+ c.getRadius());
}

7 个答案:

答案 0 :(得分:1)

使用static关键字创建方法时,它是静态方法或类方法。这意味着它对于对象的每个实例都是相同的,因此您无法从其中访问实例变量。从静态方法内部,您只能访问静态变量或调用类的静态方法。

答案 1 :(得分:0)

static方法中创建实例并且在方法外部是不同的。

当您在静态方法中访问它们时,变量,引用必须是静态的,或者它们必须是该静态方法的本地。

案例1

当您在方法外部定义Circle c = new Circle();时,它将成为实例成员,您无法在静态方法中访问它。

案例2:

public static void method2() { 
    Circle c = new Circle();
    System.out.println("What is radius "+ c.getRadius()); 
}

在这种情况下,c是该方法的本地实例,实例成员永远不会进入图片。此方法的所有内容都是本地的。

道德:您无法在静态方法中访问实例成员。

答案 2 :(得分:0)

静态成员可以在没有类实例的情况下使用,但是只有在实例化类后,c变量才会开始存在。编译器会检查您的代码是否可以'运行,在实例化之前,可以调用静态方法,但该实例不是。

第二个块是可以的,因为method2是一个实例方法,与第一次尝试一样,method2仍然是静态的。

其他解决方案是:使c成为静态变量,或使其成为method2中的局部变量。

答案 3 :(得分:0)

来自documentation

Not all combinations of instance and class variables and methods are allowed:

- Instance methods can access instance variables and instance methods
  directly.
- Instance methods can access class variables and class methods
  directly.
- Class methods can access class variables and class methods directly.
- Class methods cannot access instance variables or instance methods
  directly—they must use an object reference. Also, class methods
  cannot use the this keyword as there is no instance for this to refer to.

基于以上所述:

  • 您的原始代码有一个尝试访问实例的类方法 变量是不允许的。
  • 在更改后的代码的第一个示例中,您声明了变量 静态方法中的c ,以便可以访问该变量 整个方法。
  • 在第二个更改的示例中,该方法是一个实例方法, 试图访问一个实例变量,这也是允许的。

答案 4 :(得分:0)

在您的第一个示例中,Circle c是成员变量。 在创建类C的实例时,可以创建此类的实例。 当您在静态方法中调用该方法时,没有Circle c的实例。

您的第二个示例有效,因为您在方法中创建了实例并在那里调用它。

您的第3个示例有效,因为它是成员变量和成员方法,因此java可以确保在调用Circle c之前它是method2()的实例。

我希望我能提供帮助。

答案 5 :(得分:0)

在OP中,似乎对静态的意义存在一些混淆。

静态函数是在没有任何封闭实例的情况下可用的函数。这意味着可以根据语法Class.function调用它。非静态函数要求您创建对象的实例

Object instance = using new Object{}
instance.method()

为了实现这一点,静态函数应该是无状态的必要条件。也就是说,唯一的变量访问要么作用于函数,要么是方法参数,或者是封闭类的静态成员。因此,禁止静态方法尝试更改其封闭类的任何非静态成员。

所以:

public class Demo{
    public static int staticCounter = 0;
    public int instanceCounter = 0;

    public static int getStaticCounter(){
        return staticCounter++;
    }

    public int getInstanceCounter(){
        staticCounter++;
        return instanceCounter++;
    }
}

所以我可以通过以下代码@

调用这些函数
public class widget{
    public static void main(String arg[]){
        System.out.println(demo.getStaticCounter()); // returns zero 
        //Node that I can access the static method before creating any object;
        Demo widget = new Demo();
        System.out.println(widget.getInstanceCounter()); //returns zero
        System.out.println(widget.getInstanceCounter()); //returns one


        System.out.println(widget.getStaticCounter()); // returns 2.
        // note that its generally considered bad practice to call a static method via an instance. Call Demo.getStaticCOunter() instead.

        Demo anotherWidget = new Demo();
        System.out.println(anotherWidget.getInstanceCounter()); //returns zero
        System.out.println(anotherWidget.getInstanceCounter()); //returns one
        //since these get a new copy of the instance variable...
        System.out.println(Demo.getStaticCounter()); // returns 5.
        //but share their static variable.
    }
}

答案 6 :(得分:0)

您正在使用实例方法,因此您需要该类的对象来访问它。只有当您拥有该类的对象时,您才能访问实例方法(如果方法或变量中没有 static 关键字) ,它是实例方法或变量) 但是对于静态方法,您不需要创建该类的对象。

相关问题