public class Teacher extends Person {
public Teacher() {
super();
} public Teacher(int a) {
System.out.println(a);
} public void func() {
System.out.print("2, ");
} public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher(3);
}
}class Person {
public Person() {
func();
} public void func() {
System.out.println("1, ");
}
}为什么运行结果是 2, 2, 3请高人指点~
public Teacher() {
super();
} public Teacher(int a) {
System.out.println(a);
} public void func() {
System.out.print("2, ");
} public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher(3);
}
}class Person {
public Person() {
func();
} public void func() {
System.out.println("1, ");
}
}为什么运行结果是 2, 2, 3请高人指点~
楼主【Dragon_sxw】截止到2008-07-19 14:42:25的历史汇总数据(不包括此帖):
发帖的总数量:5 发帖的总分数:140 每贴平均分数:28
回帖的总数量:164 得分贴总数量:96 回帖的得分率:58%
结贴的总数量:5 结贴的总分数:140
无满意结贴数:1 无满意结贴分:50
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:20.00 % 无满意结分率:35.71 %
敬礼!
这里创建Teacher类的对象,首先调用Test类的构造方法,这个过程首先调用父类的构造方法,父类构造方法中调用func(),因为子类覆盖了这个方法,所以实际调用的是子类中的func方法。所以输出2,Teacher t2 = new Teacher(3);
同样,首先调用Test的构造方法
public Teacher(int a) {
System.out.println(a);
}
虽然你没有显示调用super(),编译器会自动添加并调用父类的构造方法,同样,因为多态,调用子类的func(),输出2,然后调用
System.out.println(a);
输出3
所以结果是2,2,3关键是两点:
1.多态
2.父类构造方法的执行。如果你不显示添加,编译器也会添加。
package test;public class Teacher extends Person {
public Teacher() {
super();
} public Teacher(int a) {
System.out.println(a);
} public void func() {
System.out.print("2, ");
} public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher(3);
}
}class Person {
public Person() {
func();
func2();
} public void func() {
System.out.println("1, ");
} public void func2() {
System.out.println("test");
}
}通过在父类中添加下面的方法,你可以测试一下执行顺序,子类没有覆盖父类的改方法,所以调用的是父类的方法。
public void func2() {
System.out.println("test");
}
那么我的解释是当Teacher继承Person的时候.Teacher的无参构造中应该是
public Teacher(){
func();//隐含的调用.
}
然后在子类中进行了覆盖.所以在实例化的时候就调用的是子类的方法.当然就是2了.关键字super可被用来引用该类中的超类。它被用来引用超类的成员变量或方法。通常当覆盖一个方法时,实际目的不是要更换现有的行为,而是要在某种程度上扩展该行为。
期待高手解答,和纠正.
呵呵,按你的说法试了试, 即使去掉Teacher中的super()方法, 程序结果相同, super方法隐式的被调用了学习了, 3ks