1.this
this关键字用来表示当前对象本身,或当前类的一个实例,通过this可以调用对象本身的所有方法和属性。
-
可以使用this来区分同名变量
当成员变量与方法内部的变量重名时,而在方法内部希望能够调用成员变量,这个时候我们就可以用this来解决。
public class Demo1 {
public String name;
public int age;
public Demo1(String name,int age){
this.name = name;
this.age = age;
}
public void say(){
System.out.println("大家好!我叫"+this.name+",今年"+this.age+"岁了。");
}
public static void main(String[] args){
Demo1 demo = new Demo1("猿小毛",21);
demo.say();
}
}
运行结果:大家好!我叫猿小毛,今年21岁了。
在上面的Demo1中可以看出成员变量和形参重名,如果不使用this的话,那么访问到的就是局部变量name和age,而不是成员变量。
-
可以用作方法名来初始化对象
相当于调用本类的其他构造方法。
public class Demo2 {
public String name;
public int age;
//无参构造方法
public Demo2(){
this("猿小毛",21);
}
//带参构造方法
public Demo2(String name,int age){
this.name = name;
this.age = age;
}
public void say(){
System.out.println("大家好!我叫"+this.name+",今年"+this.age+"岁了。");
}
public static void main(String[] args){
Demo2 demo = new Demo2();
demo.say();
}
}
运行结果:大家好!我叫猿小毛,今年21岁了。
需要注意的是:
- 在构造方法中调用另一个构造方法时必须作为构造方法的第一句。
- 在一个构造方法内只能调用一个构造方法。
- 不能再构造方法以外的任何方法内调用构造方法。
-
可以作为参数传递
需要在某些没有关联的类中调用另一个方法,并将当前对象的一个引用作为参数传递时。
public class Demo3 {
public static void main(String[] args){
B b = new B(new A());
}
}
class A{
public A(){
new B(this).print(); //匿名对象
}
public void print(){
System.out.println("这是A!");
}
}
class B{
A a;
public B(A a){
this.a = a;
}
public void print(){
a.print();
System.out.println("这是B!");
}
}
运行结果:
这是A!
这是B!
2.super
super关键字与this类似,this用来表示当前类的实例,super用来表示父类。
super可以用在子类中,通过点号来获取父类的成员变量和方法。super也可用在子类的子类中,java能自动向上层类追溯。
-
调用隐藏变量和被覆盖的方法
public class Demo4 {
public static void main(String[] args){
Student stu = new Student();
stu.speak();
}
}
class People{
private String str = "我是一个People类";
public String getStr(){
return str;
}
public void speak(){
System.out.println("我是People类中的speak方法");
}
}
class Student extends People{
public void speak(){
System.out.println("我是Student中的speak方法");
//调用父类的方法
super.speak();
//通过getter方法调用父类隐藏变量
System.out.println("Student:"+super.getStr());
}
}
运行结果: 我是Student中的speak方法
我是People类中的speak方法
Student:我是一个People类
-
调用父类的构造方法
在多数情况下,使用默认构造方法来对父类对象进行初始化,当然也可以用super来显式调用父类的构造方法。
public class Demo5 {
public static void main(String[] args){
Teacher tea = new Teacher("猿小毛","老师");
tea.say();
}
}
class Peoson{
String name;
public Peoson(String name){
this.name = name;
}
}
class Teacher extends Peoson{
String job;
public Teacher(String name,String job){
//调用父类构造方法
super(name);
this.job = job;
}
public void say(){
System.out.println("我的名字叫"+name+",我是一名"+job+"!");
}
}
运行结果: 我的名字叫猿小毛,我是一名老师!
注意:无论是super()还是this(),都必须放在构造方法的第一行。
如果编写一个构造方法,即没有调用super()也没有调用this(),编译器会自动插入一个调用到父类构造方法中,而且不带参数。