父类强制转换为子类的作用

简介: 父类强制转换为子类的作用

父类强制转换为子类的作用

父类强制转换为子类

class A {
    public void f() {
        System.out.println("aaaaaa");
    }
}

class B extends A {
    public void f() {
        System.out.println("bbbbbb");
    }

    public void g() {
        System.out.println("gggggg");
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        A aa = new A();
        B bb = new B();
        aa=bb;// 父类多态
        bb=(B)aa;// 父类强制转换为子类
        bb.g();
    }
}

这段代码是我刚开始学java时记录的,当时我并不理解这个有什么用,我相信如果是刚学习java的同学看到这段代码也是这种感觉,但如果是已经学习过spring并理解了spring的ioc思想的同学一定会会心一笑。
我再举一个例子,我相信会对上面这段代码有更加深刻的认识。

不过在此之前我们先我们想一个需求:同一个类实例化的两个对象 如何在另一个类的方法中被调用 并输出被调用对象的值

解决方案

class A
{
    int x;
    public A(int x)
    {
        this.x=x;
    }
}

class B
{
    public void g(Object obj)
    {
        // 如果不使用这种父类强制转化
        // 则不可能实现在B类里调用aa1,aa2
        A aa=(A)obj;
        System.out.println(aa.x);
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        A aa1=new A(123);
        A aa2=new A(456);
        B bb=new B();
        bb.g(aa1);
        bb.g(aa2);
    }
}
结果

123

456

可以看出我们传递的对象如果是aa1输出的就是aa1有参构造赋的值123,如果传递的对象是aa2则输出的就是aa2有参构造赋的值456

实现的原理

我们来看一下实现的原理:

首先 我们在B类中创建的g()方法的参数类型是Object,我们又知道Object类是所有类的父类,此时我们传递A类的实例化对象aa1进去 相当于什么? 相当于obj=aa1 这是什么,这是多态,但我们又知道 父类无法调用子类的特有方法与属性 所以我们现在想要 输出aa1.x该怎么办? 这里我们的父类强制转换为子类就凸显出来作用了 我们在g()方法中 写了这么一句 A aa=(A)obj; 即把Object类强制换行为A类 而我们传递的本身就是A类 所以我们此时可以此时aa.x=aa1.x,同类我们也实现了aa.x =aa2.x,完成上述提出的问题

这个原理就是Spring中最重要的两个思想IOC与AOP中的IOC,IOC即控制翻转 使得我们的控制权可以完全交给控制层使得程序的耦合性降低 每一层更专注的干每一层的事,后续我会专门写一篇IOC思想的文章。

目录
相关文章
|
6月前
|
设计模式 Java 编译器
面向对象编程中的继承与多态:深入理解父类引用指向子类实例
面向对象编程中的继承与多态:深入理解父类引用指向子类实例
|
1月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
10 0
|
Java
父类与子类的上下类型转换
父类与子类的上下类型转换
83 0
|
存储 设计模式 安全
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
535 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
|
开发者 Python
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
|
Java C++
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
194 0