Fork me on Github

构造函数中的this和super

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()是当前对象构造方法中去调用自己父类的构造方法。

 

posted @ 2022-06-26 09:22  昂昂呀  阅读(166)  评论(0)    收藏  举报