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

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

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

父类强制转换为子类

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

目录
相关文章
|
前端开发 JavaScript 应用服务中间件
Https网站中请求Http内容
Https网站中无法请求Http资源(静态资源、接口等) 分析 解决方法
Https网站中请求Http内容
|
监控 Java
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
391 0
|
9月前
|
API 文件存储 数据安全/隐私保护
python 群晖nas接口(一)
这段代码展示了如何通过群晖NAS的API获取认证信息(SID)并列出指定文件夹下的所有文件。首先,`get_sid()`函数通过用户名和密码登录NAS,获取会话ID(SID)。接着,`list_file(filePath, sid)`函数使用该SID访问FileStation API,列出给定路径`filePath`下的所有文件。注意需替换`yourip`、`username`和`password`为实际值。
681 19
|
编译器 API C#
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
|
Java 数据库连接 数据库
【Mybatis】mybatis 是否支持延迟加载?
【Mybatis】mybatis 是否支持延迟加载?
|
存储 Java API
开源对象存储服务(MinIO),正在备受欢迎!
本文介绍了MinIO,一个高性能、开源的对象存储服务器,兼容Amazon S3 API,适合存储大量非结构化数据。文章详细讲解了MinIO在Java中的使用方法,包括添加依赖、初始化客户端、基本操作(创建桶、上传/下载/删除对象)和高级功能(设置桶策略、使用预签名URL),并提供了Spring Boot集成MinIO的示例。
1167 4
|
算法 Java Sentinel
限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现
> 本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示例。 > 代码是按照自己的理解写的,很简单的实现了功能,还请大佬们多多交流找bug。
1950 0
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
2009 0
|
小程序 前端开发 API
马上2024年了,现在去开发一款App需要投入多少资金?
随着2024年的来临,你是否想知道开发一款App要多少成本呢。对于初次涉足App开发的人来说,资金投入是一个重要的考虑因素。