无名 发表于 2022-5-8 18:41:26

【HC】转型对象(Java)


定义如果A类继承自B类,即B为A的父类,那么当使用A的构造方法实例化一个B的对象时,所产生的b对象即为上转型对象。例:class B {}public class A extends B {       public static void main(String[] args) {B b = new A(); }        }123456特点所谓上转,即范围小的类(子类)转为范围大的类(父类),所实例化的对象类型依然是父类,不过使用的是①父类构造方法 + ②子类构造方法所实例化的。此对象具有父类的属性与方法(非private声明的)以及子类重写(override)后的属性与方法(访问权限修饰符级别不能高于父类的),显然,此对象不能调用子类新增的方法。例:public class A extends B{A(){System.out.println("子类构造方法"); } public void Aprint() {System.out.println("子类新增方法"); } public void Bprint() {System.out.println("子类覆盖父类方法"); }public static void main(String[] args) {B b = new A();b.Bprint();//编译正确b.Aprint();//编译错误 }}class B { B(){s = 1;System.out.println("父类构造方法"); } public void Bprint() {System.out.println("子类新增方法"); }}12345678910111213141516171819202122232425输出结果:父类构造方法子类构造方法子类覆盖父类方法123应用public class Person { public void mine() {   System.out.println("我是一个人"); } public static void main(String[] args) {Person per1 = new Chinese();Person per2 = new Korean();Person per3 = new Thai();Person per4 = new American();per1.mine();per2.mine();per3.mine();per4.mine(); }} class Chinese extends Person { public void mine() {System.out.println("我是中国人"); }}class Korean extends Person { public void mine() {System.out.println("我是韩国人"); }}class Thai extends Person { public void mine() {System.out.println("我是泰国人"); }}class American extends Person { public void mine() {System.out.println("我是美国人"); }}12345678910111213141516171819202122232425262728293031323334输出结果:我是中国人我是韩国人我是泰国人我是美国人1234介绍:虚拟方法调用(多态情况下) 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。http://cdn.u1.huluxia.com/g3/M00/36/DC/wKgBOV3H0UiACbWhAAD0AC7PdBU132.jpg
前提: Person类中定义了mine()方法,各个子类重写了mine()。执行: 多态的情况下,调用对象的mine()方法, 实际执行的是子类重写的方法。如有不正,欢迎批评指出。http://cdn.u1.huluxia.com/g3/M00/36/DC/wKgBOV3H0UmAaRCZAAB7c6R6rKQ151.jpg
页: [1]
查看完整版本: 【HC】转型对象(Java)