多态复习笔记-3

缺陷:域与静态方法

域的缺陷:

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()
  • 如果一个方法是静态的,那么他的行为就不具有多态性