先贴上代码
<pre name="code" class="java">package com.ray.object;
/**
* 父类引用子类对象
*
* @author ray
* @since 2015-04-30
* @version 1.0
*
*/
public class Test {
class Person {
public void say() {
System.out.println("i am a person");
}
}
class Man extends Person {
@Override
public void say() {
System.out.println("i am a man");
}
}
class Woman extends Person {
@Override
public void say() {
System.out.println("i am a woman");
}
}
public Person getType(Person person) {
return person;
}
public static void main(String[] args) {
Person person = new Test().getType(new Test().new Person());
//好处:
//1.解耦,person所对应的子类发生改变,但是下面这一句person.say();一直是不变的
//2.代码复用
person.say();
person = new Test().getType(new Test().new Man());
person.say();
person = new Test().getType(new Test().new Woman());
person.say();
}
}
输出:
i am a person
i am a man
i am a woman
在上面的例子我们可以看到,父类引用子类对象,参数虽然变化了,但是下面的代码却没有改变,这就是解耦,降低耦合性,当然还有代码的复用
如果再扩展一下,我们会说到接口、说到简单工厂的设计模式,但是这里暂时不聊,等后面学到了再详细展开
---------------------------------------分割线----------------------------------------------------
下面回答读者的问题:
我大概明白读者想问什么,我把Person person = new Test.getType(new Test().newMan())的分解步骤写给你估计应该可以解答你的疑问。
步骤:
1.new Test().newMan(),这里因为我使用了内部类,因此必须用这种方式来new一个Man的对象,具体你看以查看http://blog.csdn.net/raylee2007/article/details/49765265
和http://blog.csdn.net/raylee2007/article/details/49786805;
2.通过getType函数返回Man对象的引用,赋值给person变量,也就是person变量指向Man对象的内存地址
3.最后person.say()其实执行的是Man对象的say()方法
所谓的父类引用子类对象,其实就是通过子类的向上转型而得到的。具体可以看http://blog.csdn.net/raylee2007/article/details/49563279