这次是第三篇写关于继承的东西了,之前本人我感觉把程序怎么跑的搞懂了,就感觉自己继承学的差不多了,就感觉自己继承可以拿出手了,直到碰到这个坑,才感觉自己其实差的太多了,自己还需要不断的差缺补漏,继承的世界很丰富。
如果看过这篇的文章学了点知识,感觉继承还不是特别清楚,我是建议大家再去看下我之前那两篇关于继承的文章,我个人觉得那对于想搞清楚程序是怎么执行的人还是有帮助的。
下面给出本篇文章的内容
父类
public class Person {
int a;
Person(){
System.out.println("父类的的无参构造方法");
a=10;
}
Person(int b){
System.out.println("父类的有参构造器");
System.out.println(a);
a=20;
System.out.println("父类有参构造方法中的a:"+a);
System.out.println("我是父类有参构造方法下面的");
}
}
子类
public class Student extends Person{
Student(){
}
Student(int b){
Person p = new Person(b);
System.out.println(this.a+"<>"+v.a);
}
public static void main(String[] args) {
int c =0;
Student st1 = new Student(c);
System.out.println(st1.a);
}
}
可以先不看运行结果,自己先琢磨一下。
运行结果:
父类的的无参构造方法
父类的有参构造器
0
父类的有参构造方法中的a:20
我是父类有参构造方法下面的
10<>20
10
这里要讲的是关于继承的一个坑,在子类中Student st1 = new Student(c) new了一个子类对象,那么系统会默认调用父类的无参构造器的,这里需要说明一下对父类的构造器的调用是怎么回事:如果在子类中没有用super显示调用父类的那个构造器,那么不管是子类的哪个构造器,都会默认的去调用父类的无参构造器的。
这里之所以运行父类的有参构造器是因为在子类的构造器里面new了一个父类的对象(Person p = new Person(b);
),调用了父类的有参构造器。也输出了a的值确实为20,那么现在问题来了,最后为什么就成了10呢?其实我程序的测试结果或许已经给大家很多提示了。程序确实是跑到了父类的有参构造方法,a的值也确实被赋值成了20,但是我们要知道程序为什么会跑到父类的构造器里面?,是因为new了一个父类对象是吧,那么这个对象就有了自己的属性a,它被赋值是20,那么最后为什么又了10 了呢?我看看程序的最后的输出是输出谁?那是输出子类对象的属性a的值,说到这里想必大家都恍然大悟吧。这里的坑主要是搞懂那两个a的值是两个不同对象的不同属性值,是互不干扰的。那个10是子类对象属性a的值,20是父类对象属性a的值。