`
涛涛饭
  • 浏览: 10090 次
  • 性别: 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的值。

 

分享到:
评论

相关推荐

    【04-面向对象(上)】

    •初始化块和构造器:初始化块总在构造器之前执行,初始化块不能接受形参。 静态初始化块 •用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块 , ...

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

    本文详细讲述了JavaScript继承的特性与实践应用。...当一个函数被创建时,Function 构造器产生的函数对象会运行这样类似的代码: this.prototype = {constructor : this}; 新的函数对象新增了一个 pr

    C#方法的总结详解

    C#方法1:实例构造器和类2:实例构造器和结构3:类型构造器4:操作符重载方法5:转换操作符方法6:扩展方法7:部分方法1:实例构造器和类构造器是允许将类型的实例初始化为良好状态的一种特殊方法,创建一个引用类型...

    疯狂JAVA讲义

    学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 ...

    Scala程序设计(第2版)

    8.8 调用父类构造器(与良好的面向对象设计) 226 8.9 嵌套类型 230 8.10 本章回顾与下一章提要 232 第9章 特征 233 9.1 Java 8中的接口 233 9.2 混入trait 234 9.3 可堆叠的特征 238 9.4 ...

    Java入门教程(微学苑)-part1

    4.4 调用父类的构造方法 64 4.5 继承中的方法的覆盖和重载 65 4.6 多态和动态绑定 66 4.7 动态绑定 69 4.8 instanceof 运算符 70 4.9 多态对象的类型转换 71 4.10 Java static关键字以及Java静态变量和静态方法 72 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    【05-面向对象(下)】

    抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而让其子类调用这些构 造器来完成属于抽象类的初始化操作。 •接口里不能包含初始化块,但抽象类则完全可以包含初始化块。 •一个类最多只能有一个...

    java基础案例与开发详解案例源码全

    5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法调用140 5.6.8 方法参数及其传递问题144 5.6.9 理解main方法语法及命令行参数147 5.6.1 0递归算法147 5.7 this关键字148...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    JavaScript详解(第2版)

     14.9.3 继承和上下文选择器   14.10 定位元素和层   14.10.1 绝对定位   14.10.2 〈div〉容器   14.10.3 绝对定位   14.10.4 相对定位   14.10.5 z索引和三维   14.11 如何与JavaScript融合...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    4.1.3 引用调用机制详解 95 4.1.4 常量引用参数 97 4.1.5 混合参数列表 99 4.2 重载与默认实参 104 4.2.1 重载简介 104 4.2.2 分辨重载的准则 107 4.2.3 默认实参 109 4.3 测试及调试函数 111 4.3.1 assert...

Global site tag (gtag.js) - Google Analytics