`
涛涛饭
  • 浏览: 10479 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

继承里面构造器的调用,程序怎么执行,详解3

 
阅读更多

    这次是第三篇写关于继承的东西了,之前本人我感觉把程序怎么跑的搞懂了,就感觉自己继承学的差不多了,就感觉自己继承可以拿出手了,直到碰到这个坑,才感觉自己其实差的太多了,自己还需要不断的差缺补漏,继承的世界很丰富。

    如果看过这篇的文章学了点知识,感觉继承还不是特别清楚,我是建议大家再去看下我之前那两篇关于继承的文章,我个人觉得那对于想搞清楚程序是怎么执行的人还是有帮助的。

 

 下面给出本篇文章的内容

父类

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的值。

 

分享到:
评论

相关推荐

    JavaScript继承的特性与实践应用深入详解

    3. 构造器调用模式与`new`操作符: 当使用`new`操作符调用构造函数时,它会创建一个新的对象,其`[[Prototype]]`链接到构造函数的`prototype`属性所引用的对象。接着,构造函数内部的`this`会被绑定到新创建的对象...

    java扫雷代码详解

    构造函数中首先调用父类的构造函数,创建一个新的扫雷程序窗口,然后获取扫雷程序的内容面板,设置扫雷程序的大小和位置,最后初始化扫雷程序的组件。 扫雷程序的事件处理 扫雷程序的事件处理是通过ActionListener...

    Java继承(超详解)

    3. 构造器与继承 - 子类没有自动调用父类的构造器,需要通过`super()`语句显式调用,确保父类的初始化。 - 如果子类没有定义构造器,编译器会为它添加一个默认构造器,这个构造器会自动调用父类的无参构造器。 4....

    Microsoft.NET框架程序设计 手打版9

    3. **调用实例构造器**:通过实例构造器设置对象的初始状态。 在实例构造器被调用前,新分配的内存会被设置为0值(即所有位清零)。这意味着所有未明确赋值的字段都将默认为0或`null`。 如果没有显式定义实例构造...

    详解JavaScript中的构造器Constructor模式

    2. 然后,`A`的构造器调用`doSomething()`,由于`B`覆盖了这个方法,所以调用了`B`的方法,此时`Bvar`尚未初始化,所以默认为0,输出`Bvar=0`。 3. 接下来,`B`的构造器执行,初始化`Bvar`为`2222`,输出`BBB`。 4. ...

    Vue.extend构造器的详解

    Vue.extend构造器的详解 Vue.extend构造器是Vue.js中一个功能强大且灵活的工具,用于创建一个“子类”,它返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue的实例构造器。下面将详细介绍Vue.extend构造...

    新版C++程序设计详解

    新版的C++程序设计详解将深入探讨以下几个关键知识点: 1. **C++语言基础**: - **变量与数据类型**:C++支持基本数据类型(如int, float, char)以及自定义的数据结构,变量是存储数据的容器。 - **运算符**:...

    Java面向对象之继承练习题.doc

    12. **方法重写**:在Java中,当子类继承父类并重写父类方法时,如果在子类中直接调用这个方法,将执行子类的版本。因此,程序将输出`Test---&gt;print`,选择B。 通过上述练习,可以深入理解Java中的继承机制,如何...

    Java构造器使用方法及注意事项

    在Super的构造器中,我们调用了override()方法,而在Sub的构造器中,我们初始化了date变量。 现在,我们执行main方法,控制台将打印出什么呢?答案是先打印出null,然后打印出具体的date值。这是因为,在使用new来...

    java期末复习资料与习题

    如果父类没有无参构造器,那么子类必须显式调用父类的构造器。 5. **默认导入的包**: Java中默认导入的包是`java.lang.*`,包含了基本的类和对象,如`String`, `Integer`等。 6. **GUI组件与布局管理器**: - `...

    java---- 封装,接口,继承,覆盖,构造过程,多态,static、this、super、final用法

    - **自动调用父类构造器:** 如果子类没有显式地调用父类的构造器,则会自动调用父类的默认构造器。 - **实例化对象:** 构造器的主要目的是用于初始化对象的初始状态。 #### 五、多态 (Polymorphism) **定义:** ...

    JAVA基础第4章继承与多态-练习题.docx

    当子类实例化时,首先调用基类的构造器,然后执行子类的构造器。静态变量则在类加载时初始化,不依赖于对象的存在。 5. **final关键字**:`final`关键字用于声明不可变的类、变量或方法。若将类声明为`final`,则该...

    关于super详解

    - `this`可以调用当前类的其他构造器,而`super`只能调用父类的构造器。 - `this`可以访问当前类的成员变量和方法,而`super`可以访问父类的成员变量和方法。 3. **`super`与`this`的联系**: - 它们都用于引用...

    详解Java的初始化与清理

    3. 接着,执行当前类的非静态初始化,包括当前类的构造器。 4. 最后,执行实例初始化块(如果存在)。 以下是一个例子,展示了这个顺序: ```java class Insect { private int i = 9; protected int j; private...

    PHP面向对象程序设计之构造方法和析构方法详解

    在PHP面向对象程序设计中,构造方法和析构方法是两个非常关键的特殊成员方法,它们各自在对象生命周期的不同阶段被自动调用,分别用来执行初始化和清理工作。 构造方法是在对象创建时自动调用的方法,通常用于初始...

    java继承与多态

    当子类继承父类时,需要通过显式调用父类的构造器来初始化父类中的数据成员。这通常通过`super()`关键字完成。 **2.5 多层继承** Java支持多层继承,即一个类可以从另一个类继承,而这个父类本身也可以从另一个...

    JAVA2_类_详解

    如果子类没有定义构造器,Java会自动提供一个调用父类无参数构造器的构造器。如果子类定义了自己的构造器,可以使用`super()`调用父类的构造器。 13. **抽象类和接口的比较** 抽象类可以包含抽象方法和非抽象方法...

Global site tag (gtag.js) - Google Analytics