由于不太了解JAVA 冒昧问一下
判断以下JAVA代码Teacher类的main方法的运行结果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 t 1 = new Teacher ();
Teacher t2 = new Teacher(3);
}
}
class Person {
public Person () { func(); }
public void func() { System.out.println("1, "); }
}
判断以下JAVA代码Teacher类的main方法的运行结果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 t 1 = new Teacher ();
Teacher t2 = new Teacher(3);
}
}
class Person {
public Person () { func(); }
public void func() { System.out.println("1, "); }
}
第二个首先运行父类默认构造函数,然后直接调用构造函数的单参重载版本所以最后输出 2, 2, 3
public class Teacher extends Person {
public Teacher(){
super(); // 1
}
public Teacher(int a){
super(); //2
System.out.println(a); //3
}
public void func(){
System.out.print("2, ");//4
}
public static void main(String[] args){
Teacher t1 = new Teacher(); //5
Teacher t2 = new Teacher(3); //6
}
}
class Person {
public Person(){
func();//7
}
public void func(){
System.out.println("1, ");//8
}
}
执行顺序:
-->5-->1-->7-->4;
-->6-->2-->7-->4-->3;
说明:
1,子类方法会覆盖掉父类中的非private修饰的同名同参数的方法;
因此,这里的父类func()被覆盖,不可能执行代码8;
2,子类构造方法初始化时,如果不指定父类构造方法,那么默认使用不带参数的构造方法,即super();
因此,super()可以省略不写;