父子对象之间的转换分为了向上转型和向下转型,它们区别如下:
- 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
- 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换
模板:A a = new A();
首先确定a属于A类型,在new给A()分配内存时,需要先确认A()中的A属于一般类还是继承类,A()中的A属于一般类,那么会将A类中的变量和方法放入A()分配的本类内存中。
模板:A a = new B();
首先确定a属于A类型,在new给B()分配内存时,需要先确定B()中的B属于一般类还是继承类,B()中的B继承A,那么会将分配给B()的内存分为两块,一块是(super)父类空间,存放父类A的变量和方法,另一块是(this)本类空间,存放本类B的变量和方法
因为a属于A类型,所以能用A类(父类)中的变量和方法,无法使用B类(子类)中的变量和独有的方法,但是如果A类(父类)中的方法被B类(子类)重写了,那么a调用的方法将会是B类(子类)的方法,即a使用的是A类(父类)中的变量和A∩B=B(A与B共有,但是使用的是B)中的方法
成员方法:编译看左,左边有方法,运行看右,运行重写后的方法
B是A的子类,凡是A与B相同的成员方法都会被B重写。编译时(或写代码时)调用的是A类(父类),运行时(或使用代码)真正调用的是B类(子类)
成员变量:编译看左,运行看左
而对于成员变量来说,B类(子类)不会重写A类(父类)的成员变量,所以编译时(或写代码时)调用的是A类(父类),运行时(或使用代码)调用的也是A类(父类)
作者本人所有随笔仅为学习笔记,仅供参考