父类强制转换为子类的作用
父类强制转换为子类
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思想的文章。