缺陷:域与静态方法
域的缺陷:
package java_test1;
/*
* 2019/7/23
* 缺陷:域与静态方法
* */
class Super{
public int field=0;
public int getField() {return field;}
}
class Sub extends Super{
public int field=1;
public int getField() {return field;}
public int getSuperField() {return super.field;}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup=new Sub();
System.out.println("sup.field="+sup.field+
",sup.getField()="+sup.getField());
Sub sub=new Sub();
System.out.println("sub.field="+sub.field+
",sub.getField()="+sub.getField()+
",sub.getSuperField()="+sub.getSuperField());
}
}
//output:
//sup.field=0,sup.getField()=1
//sub.field=1,sub.getField()=1,sub.getSuperField()=0
当Sub对象转化为Super引用时候,任何域访问操作都将由编译器解析,因此不是多态的。当我们将域设置为public的时候,我们调用的field是依据他的引用类型,比如sup.field他是Sub对象赋给Super引用,那么调用她输出的就是0,这和我们的方法覆盖不一样。
- 通常我们将所有的域设置为private类型,然后我们调用方法访问他们
静态方法的缺陷:
package java_test1;
/*
* 2019/7/23
* 缺陷:域与静态方法
* */
class StaticSuper{
public static String staticGet(){
return "Base StaticGet()";
}
public String dynamicGet() {
return "Base dynamicGet()";
}
}
class StaticSub extends StaticSuper{
public static String staticGet(){
return "Derived StaticGet()";
}
public String dynamicGet() {
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism {
public static void main(String[] args) {
StaticSuper sup=new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
}
//output:
//Base StaticGet()
//Derived dynamicGet()
- 如果一个方法是静态的,那么他的行为就不具有多态性