Java,静态方法、成员变量的静态绑定

 
 
 
 
/**
 * Title: SuperClass
 * Description:
 */
public class SuperClass {

    public String someVariable = "Some Variable in SuperClass";
    public static String someStaticVariable = "Some Static Variable in SuperClass";


    public void someMethod() {
        System.out.println("SomeMethod in SuperClass");
    }

    public  static void someStaticMethod() {
        System.out.println("someStaticMethod in SuperClass");
    }

}
/**
 * Title: SubClass
 * Description:
 */
public class SubClass extends SuperClass {

    public String someVariable = "Some Variable in SubClass";
    public static String someStaticVariable = "Some Static Variable in SubClass";

    public void someMethod() {
        System.out.println("SomeMethod in SubClass");
    }
}

Main类:

        SuperClass superClass1 = new SuperClass();
        SuperClass subClass1 = new SubClass();
        superClass1.someMethod(); // SomeMethod in SuperClass
        subClass1.someMethod(); // SomeMethod in SubClass

        SuperClass.someStaticMethod();//someStaticMethod in SuperClass
        SuperClass superClass2 = null;
        superClass2.someStaticMethod();//someStaticMethod in SuperClass
//        superClass2.someMethod();//NullPointerException

        System.out.println(superClass1.someVariable);//Some Variable in SuperClass
        System.out.println(subClass1.someVariable);//Some Variable in SuperClass

//        System.out.println(superClass2.someVariable);//NullPointerException
        System.out.println(superClass2.someStaticVariable);//Some Static Variable in SuperClass

        System.out.println(superClass1.someStaticVariable);//Some Static Variable in SuperClass
        System.out.println(subClass1.someStaticVariable);//Some Static Variable in SuperClass

//        空对象可以调用静态方法和静态变量(静态绑定),空对象调用非静态方法和非静态变量时会报空指针异常
//        对象调用静态方法和静态变量时,以声明的类的类型为准,而不是生成的类的类型,是调用声明的类里的静态方法和静态变量(静态绑定)
//        对象调用非静态成员变量时,以声明的类的类型为准,是调用声明的类里的非静态成员变量(静态绑定)
//        对象调用非静态方法时,以生成的类的类型为准,是调用生成的类里的非静态方法(动态绑定)

//        总结:
//        非空对象调用静态方法、静态变量、非静态成员变量时,以声明的类的类型为准(静态绑定)
//        非空对象调用非静态方法时,以生成的类的类型为准(动态绑定)

以上基于jdk1.8

如果编译器可以在编译阶段就完成绑定,就叫作静态绑定或前期绑定。基本上实例方法都在运行时绑定,所有的静态方法都在编译时绑定,所以静态方法是静态绑定的。因为静态方法是属于类的方法,可以通过类名来访问(我们也应该使用类名来访问静态方法,而不是使用对象引用来访问),所以要访问它们就必须在编译阶段就使用编译类型信息来进行绑定。
类似的,访问成员变量也是静态绑定的,因为Java不支持(实际上是不鼓励)成员变量的多态行为。
我们可以发现成员变量由对象引用声明的类型决定,是由编译器在编译阶段就知道的信息,所以是静态绑定。
更多可详见:http://www.importnew.com/7751.html  动态绑定 vs 静态绑定

Test1 t1=null; 
在t1中只有静态方法和静态数据成员,别的都没有
https://zhidao.baidu.com/question/415660914.html#replyask-50331078

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/79880187