标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。