踩坑日常
代码
public class Test1123 {
public static void main(String[] args) {
new A1();
new B();
}
}
class A1{
int i=7;
public A1(){
setI(20);
System.out.println("i from A is"+i);
}
public void setI(int i){
this.i=2*i;
}
}
class B extends A1{
public B(){
System.out.println("i from B is"+i);
}
public void setI(int i){
this.i=i*3;
}
}
输出
解释
子类中的方法都是继承自父类,当一个子类的对象被实例化的时候,new
A1();先会访问到声明类的构造函数,即class A1{},A1是默认继承自Object类的,所以要访问Object类的无参构造函数,而Object类中的无参构造函数为空,所以不进行操作,返回到子类A1中,接下来执行setI(20),
因为A1类中有setI方法,所以20 * 2=40,这个对象A1中的i就是40。并在System.out.println(“i from A is”+i)中输出。在返回到主函数中,执行new B(),先回找到B类的构造函数,发现B是继承自A1类的,所以在执行System.out.println(“i from B is”+i)之前会先访问A1类的构造函数,而A1又是默认继承自Object类,访问Object类,并没有什么操作,返回到A1类中,执行setI(20),又因为在B类中setI被重写,所以执行的setI是子类中的setI方法,20*3=60,并在接下来的输出中,输出的是i from A is60,因为现在还在父类的构造方法中,输出后就会返回到B的构造方法中,执行System.out.println(“i from B is”+i),这个就是B这个对象实例中的i,已经在刚才被计算成60了,所以输出i from B is60。
总结
1.当调用子类的构造方法是会首先调用他的父类的无参构造方法,这是在默认情况下,要是在子类的构造函数第一行就指明了子类调用的是哪个父类构造方法,JVM就会调用指定的构造方法,若是没有指定,JVM就会默认调用父类的无参构造方法。若是父类没有无参构造方法就会编辑错误,因此最好在编写代的时候给一个类加上无参构造方法。
2.父类中调用的一些方法,若是在子类中被重写,那么就会调用子类重写的方法。