ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

构造函数中的this和super

2022-06-26 09:32:25  阅读:120  来源: 互联网

标签:name 构造方法 age Cat super public 构造函数


this和super都只能在对象内部使用

this代表当前对象本身,super代表当前对象的父类型特征

this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中的对应的构造方法,目的是:代码复用

super()只能出现在构造方法的第一行,通过当前的构造方法去调用“父类”中的对应的构造方法,目的是:创建子类对象时,先初始化父类型特征

用通俗的话来讲,要想有儿子,得先有父亲

当子类的构造方法内第一行没有出现“super()”时,系统会默认给它加上无参数的"super()"方法

构造方法中“this()”和“super()”不能同时出现,也就是“this()”和“super()”都只能出现在构造方法的第一行

注:当子类构造方法的第一行执行super()无参数方法,那么父类中一定要有无参数构造方法,有的人可能会在父类中写了有参数的构造方法,却忽略了写无参构造方法,那么在子类构造方法内就会报错,因为在一个类中写了有参数的构造方法时,无参数构造方法就会不存在,需要自己补上无参数的构造方法,这是一个良好的编程习惯

无论子类构造方法有没有“this()”和“super()”方法,实例化子类对象一定一定会执行对应的父类构造方法,即不管实例化了一个怎样的孩子,它一定会先实例化一个对应的父亲

代码如下:

 1 public class MyTest {
 2     
 3     public static void main(String[] args) {
 4         new Cat(); 
 5     }
 6 }
 7 
 8 //父类,Animal类
 9 class Animal {
10     //构造函数
11     public Animal() {
12         super();
13         System.out.println("1:Animal类的无参数构造函数执行");
14     }
15     public Animal(int i) {
16         super();
17         System.out.println("2:Animal类的有int参数构造函数执行");
18     }
19 }
20 
21 //子类,Cat类
22 class Cat extends Animal{
23     //构造函数
24     public Cat() {
25         this("");
26         System.out.println("3:Cat类的无参数构造函数执行");
27     }
28     public Cat(String str) {
29         super(5);
30         System.out.println("4:Cat类的有String参数构造函数执行");
31     }
32 }

 

输出结果:

1 2:Animal类的有int参数构造函数执行
2 4:Cat类的有String参数构造函数执行
3 3:Cat类的无参数构造函数执行

 

super()什么时候用?

 1 public class MyTest {
 2     
 3     public static void main(String[] args) {
 4         Cat c1 = new Cat(3); 
 5         System.out.println("名字:" + c1.getName());
 6         System.out.println("年龄:" + c1.getAge());
 7     }
 8 }
 9 
10 //父类,Animal类
11 class Animal {
12     //私有属性:名字
13     private String name;
14     
15     //setter and getter
16     public void setName(String name) {
17         this.name = name;
18     }
19     public String getName() {
20         return name;
21     }
22     
23     //构造函数
24     public Animal() {
25         
26     }
27     public Animal(String name) {
28         this.name = name;
29     }
30 }
31 
32 //子类,Cat类
33 class Cat extends Animal{
34     //私有字段:年龄
35     private int age;
36     
37     //setter and getter
38     public void setAge(int age) {
39         this.age = age;
40     }
41     public int getAge() {
42         return age;
43     }
44     
45     //构造函数
46     public Cat() {
47         
48     }
49     public Cat(int age) {
50         this.age = age;
51     }
52 }

 

父类的name是私有属性,不能通过下面的方法进行赋值:

1 public Cat(String name, int age) {
2     this.name = name; //报错
3     this.age = age
4 }

 

如果是这样的话可以赋值:

1 public Cat(String name, int age) {
2     setName(name); // 因为父类的setName()方法是public的
3     this.age = age;
4 }

 

显然这样做的确可以做到给父类的name赋值,但这样做是不建议的,在构造方法中通常只调用构造方法,不会去调用实例方法,况且当不止一个变量时,用set

方法时,就要调用好多个实例方法去完成多个变量的赋值。这时候为什么不考虑使用super()方法呢?如下:

1 public Cat(String name, int age) {
2     super(name);
3     this.age = age;
4 }

 

这样就显得文雅,美观多了

 

总结:
1、this和super一样,都是对象内部的引用变量,只能出现在对象内部;

2、this指向当前对象自己,super指向当前对象的父类型特征,故this的东西比super多,也就是super是this的一部分;

3、this()和super()都只能出现在构造方法的第一行,故this()和super()方法不能共存,当一个类的构造方法第一行中没有this(),也没有super(),系统默认有super()方法;

4、this()是构造方法中调用本类其他的构造方法,super()是当前对象构造方法中去调用自己父类的构造方法。

 

标签:name,构造方法,age,Cat,super,public,构造函数
来源: https://www.cnblogs.com/ang0/p/16412967.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有