Java多态,Java多态的深入学习


public class TestAB {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		a.setS("[aa]");
		b.setS("[bb]");
		//把b强制转换为a,父类引用指向子类对象
		a = b;
		//b转换为A类型后,其属性s被隐藏,能看见的为A类型中的属性s
		System.out.println(a.s);
		//直接读取b的s
		System.out.println(b.s);
		//由于类B从类A继承,并重写了类A的getS方法,同时a是从b转换后得来(父类引用指向子类对象)所以,这里使用了java的多态
		System.out.println(a.getS());
		//直接调用b的方法getS
		System.out.println(b.getS());
	}

}
//定义类A
class A{
	String s = "a";
	public void setS(String s){
		this.s = s;
	}

	public String getS(){
		return this.s;
	}
}
//定义类B从类A中继承,并重写其方法setS和方法getS
class B extends A{
	String s = "b";
	//重写方法setS
	public void setS(String s){
		this.s = s;
	}
	//重写方法getS
	public String getS(){
		return this.s;
	}
}
 
 
 
 
这个小例子的答案是:a、[bb]、[bb]、[bb],为什么会是这个答案,很多人会认为第一个输出会是[bb],觉得b转换成A后赋给了a,a就具有了b的全部属性和方法,其实A是B的父类,当b转换成A类型后赋给a,类B中的属性s已经被隐藏起来,能看到的只有其父类中的属性s,所以应该为a,而第三个输出中,类B重写了类A中的getS方法,所以获得的是类B中的s,这里需要注意的是,类B中的属性s只是被隐藏了起来,依然存在于类B中,并没有丢失


你可能感兴趣的:(java,String,Class)