Java多态
来源:互联网 发布:win10网络图标不能运行 编辑:程序博客网 时间:2024/06/05 09:18
public class test { public static void main(String args[]) { A a = new A(); System.out.println("------------------"); B b = new B(); System.out.println("------------------"); A c = new B(); System.out.println("------------------"); System.out.println("a.a=:"+a.a+" b.a=:"+b.a+" c.a=:"+c.a); System.out.println("------------------"); a.get(); b.get(); c.get(); System.out.println("------------------"); b = (B) c; c.get(); b.get();}class A { int a = 1; A() { System.out.println("构造A"); } public void get() { System.out.println("A中a=" + this.a); }}class B extends A { int a = 2; B() { System.out.println("构造B"); } public void get() { System.out.println("B中a=" + this.a); }}
执行结果:
构造A------------------构造A构造B------------------构造A构造B------------------a.a=:1 b.a=:2 c.a=:1------------------A中a=1B中a=2B中a=2------------------B中a=2B中a=2
那么问题来了
一、A a = new B();是a的引用指向了b的空间,为什么会打印出a.a=1而在调用get方法后打印出的是b的结果
二、将a强制类型转换成b并将a的引用赋给b后,a,b指向同一块地址空间为什么打印出的a.a=1 而b.a=2
一、A a = new B();a的引用指向B的空间,a.a=1但是调用a.get()=2;当new B()时,调用继承自父类的构造方法 并创建了一个变量a=1,然后调用了自己的构造方法并重新创建了空间创建了自己的变量a=2,由debug模式可以看到实例a当中拥有两个a变量,A a取变量a的值时先从自己的变量当中找到1,调用get()方法时优先调用子类重写过的方法,执行子类的方法取到了子类当中自己的变量a=2;
二、将a转型赋给b后,虽然指向同一地址,但是a,b类型不同.两个对象各自取到自己类型的变量,调用方法时a执行被重写的方法,b执行自己的方法取值为2;
三、由此,A a = new B();a的引用指向B的空间时,调用a对象被子类重写的方法时,会执行B当中的方法.
阅读全文
0 0
- Java学习 java -- 多态
- java多态
- java多态
- java多态
- java多态
- Java多态
- java多态
- JAVA@多态
- Java多态
- java 多态
- Java多态
- java多态
- [Java] 多态
- JAVA多态
- Java多态
- java多态
- java 多态
- java多态
- iOS之强大的sscanf
- [Leetcode] 501. Find Mode in Binary Search Tree 解题报告
- 553. Optimal Division
- B+/-Tree原理及mysql的索引分析
- RPM强制安装
- Java多态
- Kaggle Titanic 模型优化提升第三弹
- 欢迎使用CSDN-markdown编辑器
- Centos搭建ceph+++七、准备OSD
- web.xml文件详解
- xposed 5.0以上资源地址
- 当自定义网络库遇上Rxjava2
- JAVA设计模式——单例模式
- java就业分析