JAVA向上转型和向下转型
一、简述
- 向上转型:将子类对象转为父类对象,此处父类对象可以是接口。
- 向下转型:把父类对象转为子类对象。
主要是用在继承和接口实现的场景。
二、向上转型
向上转型后的父类引用只能调用父类的属性,若子类重写了父类的方法,则通过父类引用调用的是子类重写后的方法(即 override),该调用过程即为“动态绑定”。
public static void main(String[] args) {
B b = new B();
A a = b;
System.out.println(a.i);
a.func();
a.funcA();
System.out.println("============");
System.out.println(b.i);
b.func();
b.funcB();
}
}
class A{
public int i = 1;
public void func(){
System.out.println("A的方法");
}
public void funcA(){
System.out.println("A独有的方法");
}
}
class B extends A{
public int i = 2;
public void func(){
System.out.println("B重写A的方法");
}
public void funcB(){
System.out.println("B独有的方法");
}
输出结果如下:
1
B重写A的方法
A独有的方法
============
2
B重写A的方法
B独有的方法
综上,有如下结论:
- 向上转型后的父类引用只能调用父类的属性。
- 若子类重写了父类的方法,则通过父类引用调用的是子类重写后的方法(即 override),该调用过程即为“动态绑定”。
- 父类引用变量无法调用子类特有的方法。
- 使用场景:方法中(父类为参数),调用时传入子类对象。
三、向下转型
并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型,在向下转型前,通过instanceof 判断某对象是否是某类的实例。此外,大部分情况下,不推荐进行向下转型。
public static void main(String[] args) {
A a = new B();//向上转型
B b = (B)a;//向上转型之后才能向下转型
/* A a1 = new A();
B b1 = (B)a1;*/
// 不安全的向下转型,编译无错但会运行会出错,java.lang.ClassCastException
System.out.println(a.i);
a.func();
a.funcA();
System.out.println("============");
System.out.println(b.i);
b.func();
b.funcB();
}
}
class A{
public int i = 1;
public void func(){
System.out.println("A的方法");
}
public void funcA(){
System.out.println("A独有的方法");
}
}
class B extends A{
public int i = 2;
public void func(){
System.out.println("B重写A的方法");
}
public void funcB(){
System.out.println("B独有的方法");
}
结果如下:
1
B重写A的方法
A独有的方法
============
2
B重写A的方法
B独有的方法
====================注释部分运行结果====================
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
at Markdown.main(Markdown.java:7)
参考列表:
[1]: https://blog.csdn.net/dj1540225203/article/details/124122278 “java --向上转型和向下转型.csdn.dj1540225203”
[2]: https://www.runoob.com/w3cnote/java-transformation-problem.html “Java 转型问题.菜鸟教程”