多态
继承是对是一种关系的建模,子类对象可以认为是父类对象的一种.
多态就是在使用父类对象的地方可以使用子类对象,父类型的变量可以引用子类型的对象.
根据多态的含义,下面的代码是正确的
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;