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

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

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

父类强制转换为子类

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

目录
相关文章
|
30天前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
42 0
|
7月前
|
C#
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
1月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
39 1
|
7月前
|
Java
父类与子类的上下类型转换
父类与子类的上下类型转换
60 0
|
9月前
|
程序员
为什么子类会调用父类无参的构造函数
为什么子类会调用父类无参的构造函数
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
本章我们继续讲解面向对象三大特性,上一章我们讲解了继承,本章我们讲解多态。从多态的概念一步步讲解,介绍构成多态的必要条件和两个例外。还会顺带讲解一下 C++11 更新的两个和多态有关系的关键字 final 和 override。上一章我们讲解了虚函数,本章会先补充纯虚函数的概念,然后再引入抽象类的概念。本章我们只学习C++多态的基础知识,至于多态的原理(VTBL、决议等)的难度相对较大,我们单独放到下一章去做专门讲解。
202 0
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
|
Java C++
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
159 0