/** * 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