向上转型向下转型以及动态绑定机制机制
向上转型
语法:父类 父类引用 = 子类对象
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:如果父类引用指向的是当前目标类型子类的对象,那其实是向上转型。
动态绑定机制
动态绑定机制是在编译类型和运行类型有区分的时候才会体现出来的
1.当在对象方法A里调用对象方法B或者在向上转型后父类引用直接调用B方法时,因为实行动态绑定机制,父类引用运行时会被绑定到指向的对象的类型(可以理解为父类引用来到了子类的作用域,只是不能调用子类特有的属性和方法),所以将优先在运行类型里找B方法。
2.当在对象方法里调用对象属性时,没有动态绑定机制,调用属性的方法在哪个类就在哪个类找属性。
public class Test { public static void main(String[] args) { A a = new B(); System.out.println(a.b());//虽然a运行类型是B,但因为属性不会动态绑定,所以这个输出的age还是A类的age System.out.println(a.a());//a的运行类型是B,a()暂时绑定到B类,调用B类的b(),结果是3 } } class A { int age; int num; public int a() { return b() + 2; } public int b() { return age; } } class B extends A { int age = 1; String name; public int b() { return age; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!