向上转型向下转型
向上转型
语法:父类 父类引用 = 子类对象
1.父类引用不能调用子类特有的方法,但是如果是重写方法,在向下转型后是可以的
public class Test { public static void main(String[] args) { A a = new B();//当给引用赋值时,是受编译类型的影响 a.a();//此时要想知道调用的是哪个类中的a方法,则要看父类引用的运行类型,这里运行类型是B,所以调用B的a方法 } } class A { int age; int num; public void a() { System.out.println("aaa"); } } class B extends A { String name; public void a() { System.out.println("bbb"); } }
同样,父类引用不能调用子类特有的属性,但如果想访问子类和父类的重名属性,则需要用子类的方法
public class Test { public static void main(String[] args) { A a = new B(); a.a();//运行结果是1,这条语句调用的a方法也证明了运行类型确实是B,因为这里a方法的age是B类的age System.out.println(a.age);//此处运行结果是0 } } class A { int age; int num; public void a() { System.out.println("aaa"); } } class B extends A { int age = 1; String name; public void a() { System.out.println(age); } }
向下转型
语法:子类 子类引用 = (子类)父类引用
1.只能强转父类引用,不能强转父类对象。
2.父类引用必须指向的是当前目标类型的对象。如果是当前目标类型的父类对象则不行,虽然写的时候编译器不会报错,但运行时或者调用属性和方法时就会出错了。
ps:如果父类引用指向的是当前目标类型子类的对象,那其实是向上转型。