2014-12-02 382 views
3

在Liang的第9版介绍Java编程它声明“静态方法不能访问类的实例成员”(第312页)。我明白为什么一个类的实例成员需要访问一个方法(可能是静态的),但为什么一个方法需要访问一个实例成员?对我而言,“访问”意味着“通过点运算符访问”。换句话说:静态方法不能访问类的实例成员

Class myClass = new Class(); 
myClass.someStaticMethod(); 

是有道理的,而:

someNonStaticMethod.myClass 

someStaticMethod.myClass 

没有。是否允许someNonStaticMethod.myClass语法?我不相信我见过这种格式。如果不允许,为什么提到静态方法不能访问类的实例成员?

请帮助解除我的困惑。

-DI

+3

它谈论的代码* *内的静态方法,例如'public static void someStaticMethod(){someInstanceMethod(); }'无效。 – 2014-12-02 15:25:08

+0

@Digital:顺便说一句,访问静态方法的首选方法是使用你的例子'Class.someStaticMethod()',而不是通过类的实例(即你的'myClass.someStaticMethod();') – GriffeyDog 2014-12-02 15:50:59

+0

@Griffey Dog myClass.someStaticMethod()甚至可能吗? – 2014-12-02 17:10:57

回答

3

访问一个实例成员装置访问字段或属性实例的,而不是实例本身因为这不会编译。点并不意味着以您想象的方式“访问”,我想这是您有困惑的根源。该点用于调用某个对象上的方法(请参阅此link)或访问对象的字段(或者如果该字段是静态的,则为类)。

例如,假设类被定义如下:

class MyClass { 

    private int x; 

    static void foo() { 
     ... // foo cannot access member x 
    } 
} 

所以在方法foo,不能引用x,因为它是被绑定到的实例MyClass成员字段MyClass

另请参阅Understanding Class Members以了解静态成员和实例成员之间的区别。

0

静态方法不能引用类的非静态实例字段。

如果你想明白为什么:一个静态方法可以被调用,而不需要一个类的实例,因此当该方法被调用时,非静态不会存在。

0

据谈论这个:

public MyClass 
{ 
    private String test; 

    public static String getTest() 
    { 
     return this.test; //this is not possible because a static method cannot access an instance variable or method 
    } 

} 

原因静态方法不能访问实例变量,因为静态引用类而不是类的特定实例,所以没有实例变量访问。只有当使用new MyClass时,测试才会存在,现在测试会存在。但是如果我调用静态方法MyClass.getTest(),则不会创建test实例变量。

0

您无法从静态方法访问实例变量。

public class Example { 
    private Object instanceVariable; 
    public static void staticMethod() { 
     // Cannot use this in a static context 
     this.instanceVariable = null; 
    } 
} 

您可以从实例方法访问实例变量。

public class Example { 
    private Object instanceVariable; 
    public void instanceMethod() { 
     this.instanceVariable = null; 
    } 
} 

您不应使用实例方法使用this访问静态变量。

public class Example { 
    private static Object staticVariable; 
    public void instanceMethod() { 
     // The static field Example.staticVariable should be accessed in a static way 
     this.staticVariable = null; 
    } 
} 

您可以随时访问静态变量。你应该使用类名。

public class Example { 
    private static Object staticVariable; 
    public void instanceMethod() { 
     Example.staticVariable = null; 
    } 
} 
-1

可以通过创建对象来访问静态方法实例变量

public class Test { 
int x =10; 

public static void main(String[]args) 
{ 
    Test t1 = new Test(); 
    System.out.println(t1.x); 
} 

}

+0

这不是问题。提问者对访问类实例的方法感到困惑。 – Matt 2017-02-07 11:37:08

相关问题