[JAVA基础] 了解构造器Constructor |
您所在的位置:网站首页 › java中构造器和构造方法一样吗 › [JAVA基础] 了解构造器Constructor |
Person p1 = new Person(“张三”, 18); System.out.println(“两个参数的构造器初始化结果为:”); System.out.println(“姓名:” + p1.name); System.out.println(“身份证号:” + p1.idNum); System.out.println(“年龄:” + p1.age); // 调用三个参数的构造器 Person p2 = new Person(“李四”, “6666666”, 20); System.out.println(“三个参数的构造器初始化结果为:”); System.out.println(“姓名:” + p2.name); System.out.println(“身份证号:” + p2.idNum); System.out.println(“年龄:” + p2.age); } } class Person { String name; String idNum; int age; // 有两个参数的构造器 Person(String myName, int myAge) { this.name = myName; this.age = myAge; } // 有三个参数的构造器 Person(String myName, String myIdNum, int myAge) { // 通过this调用两个参数的构造器 this(myName, myAge); this.idNum = myIdNum; } } 输出结果为: 两个参数的构造器初始化结果为: 姓名:张三 身份证号:null 年龄:18 三个参数的构造器初始化结果为: 姓名:李四 身份证号:6666666 年龄:20 通过this调用有一点需要注意: 使用this调用另一个重载的构造器只能在构造器中使用,且必须作为构造器执行体的第一条语句 可能有人会问:如果在有三个参数的构造器里面不用this指针,而是直接把上一个构造器的代码复制过来不行吗? 当然可以,但是不建议;我们得知道为什么要存在this这个调用构造器的方法,它不是无缘无故存在的;在软件开发时有一个原则:不要把相同代码重复写两次以上;因为一旦一个构造器内的初始代码需要修改,那么很有可能其他的构造器初始代码也要跟着修改,如果构造版本多的话是非常麻烦的;而使用this恰恰可以避免这个问题,只需要修改一个地方,其他几个构造器就随着更改了;这样的代码不仅更加简洁,而且降低了维护成本; 子类构造器调用父类构造器 继承有一个规则是:当继承发生后,子类不会获得父类的构造器; 但是子类的构造器可以通过一定方法区调用父类构造器,类似于通过this引用调用重载的构造器; 而子类构造器调用父类的构造器不用this关键字,这里有一个新的关键字:super super和this用法差不多,使用它就可以实现子类构造器调用父类的构造器; 看个代码就明白了: 测试代码: class Person { String name; int age; // 父类的构造函数 Person(String myName, int myAge) { this.name = myName; this.age = myAge; } } public class Kids extends Person{ String school; // 子类的构造函数 Kids(String myName, int myAge, String mySchool) { // 通过super来调用父类构造器初始化过程 super(myName, myAge); this.school = mySchool; } public static void main(String[] args) { Kids k = new Kids(“张三”, 5, “奥特曼小学”); System.out.println(“name:” + k.name); System.out.println(“age:” + k.age); System.out.println(“school:” + k.school); } } 输出结果为: name:张三 age:5 school:奥特曼小学 通过代码可以看出来super确实和this非常像,无非就是super调用父类构造器,this调用同一个类的重载的构造器; 且使用super也需要注意: super调用父类构造器也必须在子类构造器执行体的第一行,所以this和super不会同时出现; 构造器的调用顺序 这里先看一个代码: class Creature { Creature() { System.out.println(“Creature的无参构造器的调用”); } } class Person extends Creature { Person(String name) { System.out.println(“Person的一个参数构造器的调用”); } Person(String name, int age) { // this调用同一个类中重载的构造器 this(name); System.out.println(“Person的两个参数构造器的调用”); } } public class Kids02 extends Person { Kids02() { // 显式调用父类的两个参数的构造器 super(“张三”, 18); System.out.println(“Kids02的无参构造器的调用”); } public static void main(String[] args) { // 创建一个Kids02对象 new Kids02(); } } 这个代码中,Person类继承了Creature类,Kids02类继承了Person类,Perosn类中又通过this调用同一个类中重载的构造器, Kids02类中用super 显式调用父类的两个参数的构造器; 那么输出是什么呢?到底先调用的是谁的构造器,最后调用的谁的构造器? 输出如下: Creature的无参构造器的调用 Person的一个参数构造器的调用 Person的两个参数构造器的调用 Kids02的无参构造器的调用 通过这个代码和结果,可以总结出来,父类构造器总在子类构造器之前执行,或者可以说: 创建任何对象总是从该类所在继承树最顶层类的构造器开始执行的,然后依次向下执行; 对于this和super也是一样; 这个代码好好理解一下,就会对构造器间的关系体会更深; 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化! 由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新! 如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取) ![]() 面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典 Java核心知识整理Java核心知识 Spring全家桶(实战系列)Step3:刷题 既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。 以下是我私藏的面试题库:
[外链图片转存中…(img-UfVBrMZZ-1712697155143)] Step3:刷题 既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。 以下是我私藏的面试题库: [外链图片转存中…(img-h1ngBlSB-1712697155143)] 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |