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


你可能感兴趣的:(JAVA基础,java基础学习)