向上转型实现的父类的方法
向下转型实现的是子类和父类的方法
Father {
private String name;
public String getName() {
return this.name;
}
public void print() {
System.out.println("父亲被覆写的方法");
}
public void print1() {
System.out.println("父亲未被覆写的方法");
}
}
class Son extends Father {
private String name;
public void print() {
System.out.println("儿子覆写了的方法");
}
public void SonMethod() {
System.out.println("son独有的方法");
}
}
public class ReverObject {
public static void main(String[] args) {
//核心你使用的是哪一个子类(new在哪里),而且调用的方法是否被子类所覆写了。
//这个时候父类只能调用父类非私有的方法,如果被覆写了就输出覆写的方法
// 如果父类的方法没有被覆写的话输出的是父亲的方法
Father father = new Son();
father.print();//此时输出的是:"儿子覆写了的方法"
father.print1();//输出的是:“父亲未被覆写的方法”
//error 父类里面没有这个方法
//father.SonMethod();
//此时就继续向下转型,让父类可以调用子类的方法,也可以调用父类的方法
if (father instanceof Son) {
Son son = (Son) father;
son.SonMethod();// son独有的方法
son.print();//儿子覆写了的方法
son.print1();//父亲未被覆写的方法
}
}
}
Father father = new Son();
father可以访问的是
- 父类Father独有的public、protected方法,static修饰的方法可以访问,private方法不可以被访问
- Son独有的但是父类没有的都不可以被访问
- 本来要访问父类的方法,但是如果方法被Son覆写了那么father访问的就是覆写后的方法
private方法永远无法被外界直接访问,被覆写
总结:
- 对象多态性的核心在于方法的覆写。
- 通过对象的向上转型可以实现接收参数的统一,向下转型可以实现子类扩充方法的调用(一般不操作向下转型,有安全隐患)。
- 两个没有关系的类对象是不能够进行转型的,在转型之前先进行instanceof看能否转型的判断一定会产生ClassCastException。