多态

继承是对是一种关系的建模,子类对象可以认为是父类对象的一种.
多态就是在使用父类对象的地方可以使用子类对象,父类型的变量可以引用子类型的对象.

根据多态的含义,下面的代码是正确的

Object o=new GemometricObject();
System.out.println(o.toString());

在运行时调用的是Object类还是 GemometricObject类中的toString()方法呢?

声明类型和实际类型:Object是声明类型,Gem是实际类型
方法匹配和方法绑定:
在编译时,方法匹配由声明类型决定,如果不能在声明类型中找到相应方法就会报编译错误.
方法绑定是在JVM虚拟机在运行中,由实际类型决定,先在实际类型中寻找是否重写了该方法,没有则沿着继承链向上找.

例子转自

public class A {
	 public String s = "123";
	
	 public void show(A obj){
		 System.out.println("A and A");
	 }
	 
	 public void show(D obj){
		 System.out.println("A and D");
	 }
}
 
class B extends A{
	public String s = "456";
	
	public void show(A obj){
		System.out.println("B and A");
	}
	
	public void show(B obj){
		System.out.println("B and B");
	}
	
	public void show(E obj){
		System.out.println("B and E");
	}
}
 
class C extends B{	
}
 
class D extends B{
}
 
class E{
}

public class Test {
	public static void main(String[] args){
		A a1 = new A();
		A a2 = new B();
		
		B b = new B();
		C c = new C();
		D d = new D();
		E e = new E();
		
		a1.show(b);
		a1.show(c);
		a1.show(d);
		System.out.println(a1.s);
		
		a2.show(b);
		a2.show(c);
		a2.show(d);
		//a2.show(e);//这句编译不过
		System.out.println(a2.s);
		
		b.show(b);
		b.show(c);
		b.show(d);
		b.show(e);
		System.out.println(b.s);
	}
}

A and A
A and A
A and D
123
B and A
B and A
A and D
123
B and B
B and B
A and D
B and E
456

对象转换和instanceof运算符

Object o=new Student();
Student b=o;

以上语句会报编译错误,因为父类变量可以引用子类变量但是不可逆,即使o的实际类型是Student
可以用显示转换,在显示转换中要保证要转换的对象是子类的一个实例,可以用instanceof关键字

if(o instanceof Student)
Student b=(Student)o;
posted @ 2019-03-27 20:36  少年留不住  阅读(92)  评论(0编辑  收藏  举报