美文网首页java
java 继承 子类强转父类 父类强转子类

java 继承 子类强转父类 父类强转子类

作者: Sraindy | 来源:发表于2019-07-23 11:07 被阅读0次

Java 继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java 子类强转父类

父类引用指向子类对象:
java中子类强转父类,实际上依然是子类;
该引用只能调用父类中定义的方法和变量;
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

// A是父类,B是子类
A a = new A();
a.setName("a1");
a.sayA(); // sayA

B b = new B();
b.setName("b1");
b.setSex(true);
b.sayA(); // sayA from B
b.sayB(); // sayB

// Java中的对象进行类型提升,依然保持其原有的类型。
A a2 = (A) b; // 子类强转父类,其实仍然是子类
System.out.println(a2.toString()); // B [name=b1, age=0, sex=true]
// 该引用只能调用父类中定义的方法和变量; 
// a2.sayB(); // The method sayB() is undefined for the type A 报错
// 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
a2.sayA(); // sayA from B a2其实是B,调用的是B方法

Java 父类强转子类

只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

// B b2 = (B) a; // atest.A cannot be cast to atest.B a是A,转不成B
// 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
B b2 = (B) a2; // a2其实是B,可以转成B
System.out.println(b2.toString()); // B [name=b1, sex=true]
b2.sayA(); // sayA from B
b2.sayB(); // sayB
public class TestObjectConvert {
    public static void main(String[] args) {
        test1();
        test2();
    }

    private static void test1() {
        Fruit fruit1 = new Fruit();
        Apple apple1 = new Apple();
        apple1 = (Apple) fruit1; // java.lang.ClassCastException
    }

    private static void test2() {
        Fruit fruit1 = new Apple();
        Apple apple1 = new Apple();
        apple1 = (Apple) fruit1;
    }

    static class Fruit {

    }

    static class Apple extends Fruit {

    }

}


结果是:
test1:报类转异常;
test2:转换正常。

所以,想让父类强制转换成子类,不是没有可能,除非父类是子类构造出来的实例,不然是不能强转的。为什么呢?如上代码,如果父类实例出来的对象是Orange,Orange当然不能强制转成Apple,所以说父类只有该子类对应的实例才能强转。


以上内容只为记录,地址来源如下:
[Java父类强制转换子类原则](https://blog.csdn.net/youanyyou/article/details/78990290)
[java 子类强转父类 父类强转子类](https://www.cnblogs.com/ooo0/p/9308583.html)

相关文章

  • java 继承 子类强转父类 父类强转子类

    Java 继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法...

  • 父类强转子类,子类强转父类

    结论: 根据 LSP : 里氏代换原则(Liskov Substitution Principle)父类出现的地方...

  • .Net基础10

    1、里氏转换 1)、子类可以赋值给父类2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象 2、类型转...

  • scala 调用java通过父类调用子类方法实现

    scala 调用java通过父类调用子类方法实现 java 父类 A 抽象类: java 子类 B 继承A类,并...

  • 里氏转换

    里氏转换的特点 父类引用指向子类对象 如果父类引用指向的是子类对象,那么可以将这个父类强转为子类对象 将父类强转为...

  • python 继承和多态

    继承 子类继承父类 子类继承父类,并覆盖父类 多态 动态语言

  • Java 面向对象

    JAVA继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,...

  • netty中builder模式-链式调用

    简化如下 该设计非常巧妙 在父类中巧用泛型解决了子类调用父类方法强转的问题

  • 2.类与对象

    子类继承父类,子类继承父类的方法,即子类会自动获得父类的功能 子类从父类继承的方法可以由子类重新定义、改变或延伸 ...

  • iOS9新特性之泛型 和__kindof

    泛型:限制类型 __covariant(协变):用于泛型数据强转类型,可以向上强转,子类 可以转成 父类__con...

网友评论

    本文标题:java 继承 子类强转父类 父类强转子类

    本文链接:https://www.haomeiwen.com/subject/ecqolctx.html