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

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

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

父类强制转换为子类

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思想的文章。

目录
相关文章
|
8月前
|
设计模式 Java 编译器
面向对象编程中的继承与多态:深入理解父类引用指向子类实例
面向对象编程中的继承与多态:深入理解父类引用指向子类实例
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
8月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
171 1
|
3月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
17 0
|
5月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
91 4
|
8月前
|
C++
C++ 类中静态成员和静态成员函数的继承覆盖
C++ 类中静态成员和静态成员函数的继承覆盖
107 0
|
Java
父类与子类的上下类型转换
父类与子类的上下类型转换
102 0
|
存储 设计模式 安全
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)