这次是第三篇写关于继承的东西了,之前本人我感觉把程序怎么跑的搞懂了,就感觉自己继承学的差不多了,就感觉自己继承可以拿出手了,直到碰到这个坑,才感觉自己其实差的太多了,自己还需要不断的差缺补漏,继承的世界很丰富。
如果看过这篇的文章学了点知识,感觉继承还不是特别清楚,我是建议大家再去看下我之前那两篇关于继承的文章,我个人觉得那对于想搞清楚程序是怎么执行的人还是有帮助的。
下面给出本篇文章的内容
父类
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的值。
相关推荐
3. 构造器调用模式与`new`操作符: 当使用`new`操作符调用构造函数时,它会创建一个新的对象,其`[[Prototype]]`链接到构造函数的`prototype`属性所引用的对象。接着,构造函数内部的`this`会被绑定到新创建的对象...
构造函数中首先调用父类的构造函数,创建一个新的扫雷程序窗口,然后获取扫雷程序的内容面板,设置扫雷程序的大小和位置,最后初始化扫雷程序的组件。 扫雷程序的事件处理 扫雷程序的事件处理是通过ActionListener...
3. 构造器与继承 - 子类没有自动调用父类的构造器,需要通过`super()`语句显式调用,确保父类的初始化。 - 如果子类没有定义构造器,编译器会为它添加一个默认构造器,这个构造器会自动调用父类的无参构造器。 4....
3. **调用实例构造器**:通过实例构造器设置对象的初始状态。 在实例构造器被调用前,新分配的内存会被设置为0值(即所有位清零)。这意味着所有未明确赋值的字段都将默认为0或`null`。 如果没有显式定义实例构造...
2. 然后,`A`的构造器调用`doSomething()`,由于`B`覆盖了这个方法,所以调用了`B`的方法,此时`Bvar`尚未初始化,所以默认为0,输出`Bvar=0`。 3. 接下来,`B`的构造器执行,初始化`Bvar`为`2222`,输出`BBB`。 4. ...
Vue.extend构造器的详解 Vue.extend构造器是Vue.js中一个功能强大且灵活的工具,用于创建一个“子类”,它返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue的实例构造器。下面将详细介绍Vue.extend构造...
新版的C++程序设计详解将深入探讨以下几个关键知识点: 1. **C++语言基础**: - **变量与数据类型**:C++支持基本数据类型(如int, float, char)以及自定义的数据结构,变量是存储数据的容器。 - **运算符**:...
12. **方法重写**:在Java中,当子类继承父类并重写父类方法时,如果在子类中直接调用这个方法,将执行子类的版本。因此,程序将输出`Test--->print`,选择B。 通过上述练习,可以深入理解Java中的继承机制,如何...
在Super的构造器中,我们调用了override()方法,而在Sub的构造器中,我们初始化了date变量。 现在,我们执行main方法,控制台将打印出什么呢?答案是先打印出null,然后打印出具体的date值。这是因为,在使用new来...
如果父类没有无参构造器,那么子类必须显式调用父类的构造器。 5. **默认导入的包**: Java中默认导入的包是`java.lang.*`,包含了基本的类和对象,如`String`, `Integer`等。 6. **GUI组件与布局管理器**: - `...
- **自动调用父类构造器:** 如果子类没有显式地调用父类的构造器,则会自动调用父类的默认构造器。 - **实例化对象:** 构造器的主要目的是用于初始化对象的初始状态。 #### 五、多态 (Polymorphism) **定义:** ...
当子类实例化时,首先调用基类的构造器,然后执行子类的构造器。静态变量则在类加载时初始化,不依赖于对象的存在。 5. **final关键字**:`final`关键字用于声明不可变的类、变量或方法。若将类声明为`final`,则该...
- `this`可以调用当前类的其他构造器,而`super`只能调用父类的构造器。 - `this`可以访问当前类的成员变量和方法,而`super`可以访问父类的成员变量和方法。 3. **`super`与`this`的联系**: - 它们都用于引用...
3. 接着,执行当前类的非静态初始化,包括当前类的构造器。 4. 最后,执行实例初始化块(如果存在)。 以下是一个例子,展示了这个顺序: ```java class Insect { private int i = 9; protected int j; private...
在PHP面向对象程序设计中,构造方法和析构方法是两个非常关键的特殊成员方法,它们各自在对象生命周期的不同阶段被自动调用,分别用来执行初始化和清理工作。 构造方法是在对象创建时自动调用的方法,通常用于初始...
当子类继承父类时,需要通过显式调用父类的构造器来初始化父类中的数据成员。这通常通过`super()`关键字完成。 **2.5 多层继承** Java支持多层继承,即一个类可以从另一个类继承,而这个父类本身也可以从另一个...
如果子类没有定义构造器,Java会自动提供一个调用父类无参数构造器的构造器。如果子类定义了自己的构造器,可以使用`super()`调用父类的构造器。 13. **抽象类和接口的比较** 抽象类可以包含抽象方法和非抽象方法...