1.普通父类的静态变量和方法,可以通过子类的名称访问和调用 2.普通父类的静态变量和方法,可以通过子类的实例对象访问和调用 3.抽象父类的静态变量和方法,可以通过具体子类的名称访问和调用 4.抽象父类的静态变量和方法,可以通过具体子类的实例对象访问和调用 5.接口的静态变量,可以通过实现类的名称访问 6.接口的静态变量,可以通过实现类的实例对象访问 7.接口的静态方法,不可以通过实现类的名称调用 8.接口的静态方法,不可以通过实现类的实例对象调用 9.接口的静态方法,只能通过“接口名称.静态方法名”进行调用
注: 1.可以通过子类的名称访问父类的静态变量,这个语句在编译的时候会被替换成“父类名称.静态变量名” 2.可以通过子类的实例访问父类的静态变量,这个语句在编译的时候会被替换成“父类名称.静态变量名” 3.可以通过子类的实例访问父类的静态方法,这个语句在编译的时候会被替换成“父类名称.静态方法名”
总结: 为什么在继承关系中,可以通过子类的类名或者子类的对象去访问父类的静态变量和静态方法,因为继承关系属于单继承,所以可以明确地找到父类的静态变量和静态方法。但是接口的实现关系不是单继承关系,而是多继承关系,一个实现类可以同时实现多个不同的接口,如果不同接口存在相同的静态变量和静态方法,那么通过实现类的对象或者实现类的类名去调用接口类的静态方法,根本无法明确调用哪个方法,所以无法通过实现类的类名或者对象去调用接口的静态方法。
但是为什么可以通过实现类的类名和对象访问接口的静态变量呢?这点我也觉得很奇怪,但是多个接口存在相同静态变量的时候,也是报编译错误的,如果多个接口并没有存在相同的静态变量,则不会报编译错误。但是接口的静态方法则怎样都不行。