文章目录
- this
- 用法
- 普通的直接引用
- 区分形参与实参
- super
- 用法
- 普通的直接引用
- 区分子类与父类同名的属性或方法
- this和super 与 构造方法
- 总结
this
this引用表示当前对象对象的引用。
用法
普通的直接引用
public class Test {
int a ;
int b;
public Test() {
this.b = 0;
}
}
调用当前类的成员变量
区分形参与实参
class Student {
private String name = "用户为指定";
public Student() {
System.out.println("姓名:" + name);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class test1 {
public static void main(String[] args) {
Student Stu = new Student();
Stu.setName("张三");
System.out.println("Stu's name is " + Stu.getName());
}
}
运行结果:
姓名:用户为指定
Stu's name is 张三
name是构造方法的形参,this.name 是成员遍历
super
super可以理解为是指向自己父类对象的一个引用。
用法
普通的直接引用
class A {
int a;
public A(int a) {
this.a = a;
}
}
class B extends A {
int b ;
public B(int a,int b) {
super(a);
this.b = b;
}
}
public class Test {
public static void main(String[] args) {
B Ob = new B(1,2);
System.out.println(Ob.a + " " + Ob.b);
}
}
运行结果:
1 2
区分子类与父类同名的属性或方法
class Parent {
String name;
void name() {
name = "Dad";
}
}
class Son extends Parent {
String name;
// 重写父类的方法
@Override
void name() {
name = "Son";
super.name(); //调用父类的方法
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
Son c = new Son();
c.name();
}
}
运行结果:
Son
Dad
既调用了父类的方法,也调用了父类的变量。若不调用父类方法name(),只调用父类变量name的话,则父类name值为默认值null。
this和super 与 构造方法
super() 调用父类中的某一个构造函数(应该为构造函数中的第一条语句)
this() 调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)
this() 和 super() 在一个构造方法中不能同时存在
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("父类·无参数构造方法: " + "A Person.");
}//构造方法(1)
Person(String name) {
prt("父类·含一个参数的构造方法: " + "A person's name is " + name);
}//构造方法(2)
}
public class Chinese extends Person {
Chinese() {
super(); // 调用父类构造方法(1)
prt("子类·调用父类”无参数构造方法“: " + "A chinese coder.");
}
Chinese(String name) {
super(name);// 调用父类具有相同形参的构造方法(2)
prt("子类·调用父类”含一个参数的构造方法“: " + "his name is " + name);
}
Chinese(String name, int age) {
this(name);// 调用具有相同形参的构造方法(3)
prt("子类:调用子类具有相同形参的构造方法:his age is " + age);
}
public static void main(String[] args) {
Chinese cn = new Chinese();
cn = new Chinese("codersai");
cn = new Chinese("codersai", 18);
}
}
运行结果:
父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18
总结
this在不产生二义性的情况下,既可以调用父类的属性和方法,又可以调用子类的属性和方法。而super只能调用从父类继承下来的非静态属性和方法。
【相同点】
- 都是Java中的关键字
- 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
- 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
- this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
- 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
- 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
- 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有