java-多态-之疑惑

第一题

父类.java

public class Hero {
	public String name = "来自父类的字段";
	public void effect(){
		System.out.println("来自父类的方法");
	}
	
}

子类.java

public class ADHero extends Hero {

	public String name = "来自子类的字段";
	public void effect(){
		System.out.println("来自子类的方法");
	}
	

}

test.java

输出结果:

第二题

子类 , 父类 和上面保持不变

test.java

	public static void main(String[] args) {
		Hero  hero = new Hero();
		ADHero adHero = new ADHero();
		System.out.println("父类地址是:"+hero);
		System.out.println("子类地址是:"+adHero);
		System.out.println(hero.name);
		hero=adHero ; 
		System.out.println("赋值后父类地址是:"+hero);
		System.out.println(hero.name);
}

输出结果

第三题

父类.java

public class Hero {
	public String name = "来自父类的字段";
	public void effect(){
		System.out.println("来自父类的方法");
	}
	
}

子类.java

public class ADHero extends Hero {

	//public String name = "来自子类的字段";   //注意 注释掉了
	public void effect(){
		System.out.println("来自子类的方法");
	}
	

}

test.java

public static void main(String[] args) {
		Hero  hero = new Hero();
		ADHero adHero = new ADHero();
		System.out.println("父类地址是:"+hero);
		System.out.println("子类地址是:"+adHero);
		System.out.println(hero.name);
		hero=adHero ; 
		System.out.println("赋值后父类地址是:"+hero);
		System.out.println(hero.name);
}

输出结果

第4题

test.java

public static void main(String[] args) {
		Hero  hero = new Hero();
		ADHero adHero = new ADHero();
		System.out.println("父类地址是:"+hero);
		System.out.println("子类地址是:"+adHero);
		adHero.name="来自222";  //注意 增加了这句
		System.out.println(hero.name);
		hero=adHero ; 
		System.out.println("赋值后父类地址是:"+hero);
		System.out.println(hero.name);
		
}

 不行的话,请看第5题         

输出结果

总结

adHero.name =“来自222”。这句话改的是父类中的name 还是 自己的name 。 因为题目中 子类没有定义过name的,
答:从结果来推测,这句话改的是父类中的name 。
因为多态的规则: 运行的时候,总是运行的是父类中的变量

真正的继承并不是父类声明有的属性,然后子类就会自动声明有。 而是 子类和父类是共同体,子类假如没有定义这个属性的话,它就直接拿父类的属性来用
假如父类有一个同名属性,子类也声明一个同名属性,那么父类的这个同名属性就会被自动隐藏。

posted @ 2018-04-26 14:54  Pororo  阅读(176)  评论(0编辑  收藏  举报