这节我们主要是区分this 和 super这两个关键字的用法
起初我根本弄不清楚this 和 super这两个关键字的用法,也不明白在代码实例中为什么既用this又用super,下面就是原因:
1.在Java中,this通常指当前对象,super则指父类的。
*当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数。
区分和掌握它们两个
2.this关键字的用法:
最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是
“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会
知道你要调用的是那一个。见实例3.1
实例3.1
1 /*定义类DomeThis*/
2 public class DomeThis {
3 public String name; //声明属性,成员变量
4 public int age;
5 public DomeThis(String name,int age){ //声明构造函数
6 this.name = name; //将构造函数中的name值赋给对象的name
7 this.age = age; //这里可以不加this
8 this.print();
9 }
10
11 public void print(){ //声明打印方法
12 System.out.println("姓名"+name+" 年龄"+age); //这里的name和aga可以加this也可以不加
13 }
14
15 public static void main(String[] args) {
16 DomeThis test = new DomeThis("zhang",3);
17 }
18 }
运行结果:
3.关键字super的用法:
1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量;
2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值;
3)整个调用的过程和递归调用函数有点类似,不断充气球,直到整个气球膨胀起来,不断的深层递进,遇到停止标记,逐层的跳出来。
见实例3.2
1 /*定义父类Tiger*/
2 public class Tiger {
3
4 int age; // 年龄
5 int hight; // 身体高度
6
7 public Tiger(int age) { //定义构造函数
8 this.age = age;
9 print();
10 }
11 public void print() {
12 System.out.println("I'am a " + age + "岁 " + hight + "厘米高 的tiger!");
13 }
14 }
下面例子类JavanTiger 中的构造函数中的 super()可以不写,JAVA会默认调用父类的无参数的构造函数,但如果父类没有定义无参数的构造函数,没有语法错误,程序会自动退出,没有任何打印语句,这时候你需要手动调用其他父类的构造函数
1 /*定义子类查看super的用法*/
2 public class JavanTiger extends Tiger {
3 public JavanTiger() {
4 super(1); // 调用父类有参数的构造函数
5 }
6 public static void main(String[] args) {
7 new JavanTiger();
8 }
9 }
运行结果:
这段代码中的 super(1)必须要写进去,否则编译器会报错。简单的总结一下,“this()是调用自己其他的构造函数,super()是调用自己继承的父类的构造函数“,如果只想调
用默认无参数的父类构造函数,不用在子类的构造函数当中写出来,但是实际编程的时候,总是会忽略这一点。
那么这两个关键字能不能同时出现在子类的一个构造函数当中纳?答案肯定是不能。先说下自己的理解:
1)在新建一个基类的时候,不论递归调用几次自身的构造函数,最终你都会去调用父类的构造函数,(不是显式调用的话,系统会调用默认无参数的父类构造函数);
2)JAVA 中规定使用 this 和 super 时必须放在构造函数第一行,只有一个第一行。见图1