文章目录
1.this关键字的概念
this代表本类对象的一个引用对象
2.this关键字的形式
this.name = name;
3.this关键字的功能
3.1 功能一:
当局部变量与成员变量同名时,可以使用this关键字,指定本类的成员变量
练习: this练习之变量名相同时使用
package partTwo;
/*
本类用于this关键字的学习
*/
public class TestThis {
public static void main(String[] args) {
Pig p =new Pig();
p.eat();
}
}
//1.创建一个小猪类
class Pig{
//2.定义成员变量
int sum = 20;
int count = 999;
//3.定义一个普通方法
public void eat(){
//4.定义一个局部变量
int a = 5;
int sum = 200;
System.out.println(a);
//变量有一个就近原则,离谁近,使用谁,所以输出sum结果为200;
System.out.println(sum);
//this功能一:当局部变量与成员变量同名时,可以使用this关键字,指定本类的成员变量
System.out.println(this.sum); //指定输出为成员变量
System.out.println(count);
}
}
3.2 功能二:
this(参数); 在类的构造函数中,可以调用另一构造函数;
注意,this不能同时出现在俩个互相调用的方法语句中,会死循环
this调用构造方法的语句,必须在构造方法的第一行
package partTwo;
/*
本类用于this第二个功能测试
*/
public class TestThis2 {
public static void main(String[] args) {
Apple a = new Apple(); //创建对象,触发被动调用无参构造
//Apple a1 = new Apple("红富士"); //创建对象,触发被动调用含参构造
a.clean();
//a.Apple(); 不允许,会报错,不能直接写出调用,只能被动调用
// a.Apple("红富士"); 不允许,会报错,不能直接写出调用,只能被动调用
}
}
//1.创建类Apple
class Apple{
//创建类的无参构造
public Apple(){
/* this(参数); 表示在本构造中,调用本类的对应参数的构造方法
* main中调用无参构造,无参构造中第一句为含参构造,所以输出含参后再输出无参,均调用
* this调用构造方法的语句,不能来回互相调用,会死循环,只能选一个执行
* this调用构造方法的语句,必须在构造方法的第一行*/
this("青苹果");
System.out.println("无参构造");
}
//创建类的含参构造
public Apple(String s){
/* this();表示在本构造方法中调用本类的无参构造*/
//this();
System.out.println("含参构造");
}
//创建普通方法
public void clean(){
System.out.println("测试调用");
}
}
2.super关键字的概念
可以通过这个关键字使用父类的内容,Super代表的是父类的一个引用对象
注意:在构造方法里,出现的调用位置必须是第一行
2.1 super关键字的功能
package partTwo;
/*
* 本类我们用于测试super关键字的作用
* */
public class TestSuper {
public static void main(String[] args) {
B b = new B();
b.getName();
}
}
class A {
private String nameA="A";
public void getName() {
System.out.println("父类"+nameA);
}
}
class B extends A{
private String nameB="B";
@Override
public void getName() {
System.out.println("子类"+nameB);
super.getName();
}
}
2.2 代码分析
在子类B中,我们重写了父类的getName方法,如果在重写的getName方法中我们去调用了父类的相同方法,必须要通过super关键字显示的指明出来。
如果不明确出来,按照子类优先的原则,相当于还是再调用重写的getName()方法,此时就形成了死循环,执行后会报java.lang.StackOverflowError异常。如下图所示:
其实在继承关系中,子类会默认调用父类的无参构造,其就是靠super关键字实现的。
因为super关键字更多依赖继承关系出现,所以关于super关键字更多的内容将在下一节继承中进行更多的代码实例介绍。
3.this与super的区别
- this代表的是本类对象的引用,我们可以把this看作是Cat this = new Cat();
- super代表的是父类对象的引用,我们可以把super看作是Father super = new Father();
当本类的成员变量与父类的成员变量同名时,需要使用super变量名指定父类的成员变量 - this可以实现调用本类构造方法的功能
this(); 表示调用本类的无参构造 this(参数);表示调用本类的对应参数的构造;
super也可以实现调用父类构造方法的功能 - 注意:super的使用前提是继承,没有父子类关系,就没有super
- 注意:this调用构造方法或者super调用构造方法,都必须出现在构造方法的第一行
- 注意:如果父类没有无参构造,需要手动在子类构造方法的第一行调用其他的含参构造
- 拓展:如果子类重写了父类的方法以后,可以使用super.方法名(参数列表)来再次调用父类的方法