class Instrument { private String instrumentName; Instrument(){ instrumentName = "instrument"; } public String toString() {return instrumentName;} } class Wind extends Instrument{ Wind(){ instrumentName = "Wind"; } } public class Music3{ public static void main(String[] args){ Instrument ii = new Instrument(); System.out.println("I am "+ ii); Instrument ww = new Wind(); System.out.println("I am "+ ww); } }
结果:编译不通过,编译错误,子类无法访问父类的private成员instrumentName。
修改一:
class Instrument { protected String instrumentName; Instrument(){ instrumentName = "instrument"; } public String toString() {return instrumentName;} } class Wind extends Instrument{ Wind(){ instrumentName = "Wind"; } } public class Music3{ public static void main(String[] args){ Instrument ii = new Instrument(); System.out.println("I am "+ ii); Instrument ww = new Wind(); System.out.println("I am "+ ww); } }
结果:java Music3
I am instrument
I am Wind
分析:执行java Music3时发生以下动作:
1. main()函数执行,先new一个Instrument对象,调用其构造函数将instrumentName设置为“instrument”;
2. 紧接着prinln打印 I am + instrument,这里定义toString()为打印instrumentName成员,这里是“instrument”;所以最终打印I am instrument;
3. new 一个Wind对象,并赋值给Instrument 对象ww,发生向上转型;
3.1 Wind继承自Instrument,先调用Instrument构造函数,将instrumentName设置为"instrument";
3.2 接着调用Wind的构造,再把instrumentName 设置(实际上是修改了)为“Wind”
4. 通过System.out.println("I am "+ ww)打印,此时toString还是父类的那个toString,instrumentName还是父类的,但是已经被Wind子类对象修改为"Wind"
所以打印出I am Wind
class Instrument { private String instrumentName; Instrument(){ instrumentName = "instrument"; } public String toString() {return instrumentName;} } class Wind extends Instrument{ private String instrumentName; Wind(){ instrumentName = "Wind"; } public String toString() {return ("son:"+instrumentName);} } public class Music3{ public static void main(String[] args){ Instrument ii = new Instrument(); System.out.println("I am "+ ii); Instrument ww = new Wind(); System.out.println("I am "+ ww); } }
运行结果:
结果:java Music3
I am instrument
I am son:Wind
子类重载了父类的成员变量和方法。