this和super关键字的介绍
- this:存储的“当前对象”的引用;
- this可以访问:本类的成员属性、成员方法、构造方法;
- super:存储的“父类对象”的引用;
- super可以访问:父类的成员属性、成员方法、构造方法;
this关键字的三种用法
-
this访问本类成员变量: this.成员变量
public class Student{ String name = "张三"; public void show(){ String name = "李四"; System.out.println("name = " + name);// 李四 System.out.println("name = " + this.name);// 张三 } }
-
this访问本类成员方法: this.成员方法名();
public class Student{ public void show(){ System.out.println("show方法..."); this.eat(); } public void eat(){ System.out.println("eat方法..."); } }
-
this访问本类构造方法: this()可以在本类的一个构造方法中,调用另一个构造方法
public class Student{ public Student(){ System.out.println("空参构造方法..."); } public Student(String name) { this();//当使用this()调用另一个构造方法时,此代码必须是此构造方法的第一句有效代码。 System.out.println("有参构造方法..."); } } public class Demo { public static void main(String[] args) { Student stu2 = new Student(); } }
super关键字的三种用法
-
1.super访问父类的成员变量: super.父类成员变量名
public class Fu{ int money = 100; } public class Zi extends Fu{ int money = 10; public void show(){ int monet = 1; System.out.println(“money : “ + money);//1 System.out.println(“this.money : “ + this.money);//10 System.out.println(“super.money:” + super.money);//100 直接去父类中找 } }
-
2.super访问父类的成员方法: super.成员方法名();
public class Fu{ public void show(){ System.out.println("父类的show方法..."); } } public class Zi extends Fu{ public void show(){ super.show(); System.out.println("子类的show方法..."); } } public class Demo { public static void main(String[] args) { Zi zi = new Zi(); zi.show(); } }
-
3.super访问父类的构造方法: super()
public class Fu{ public Fu(){ System.out.println("Fu 类的空参构造方法.."); } public Fu(String name, int age) { System.out.println("Fu 类的有参构造方法.."); } } public class Zi extends Fu{ public Zi(){ super();// 调用父类的空参构造方法 System.out.println("Zi 类的空参构造方法.."); } public Zi(String name,int age){ super(name,age);// 调用父类的有参构造方法 System.out.println("Zi 类的有参构造方法.."); } } public class Demo { public static void main(String[] args) { Zi zi = new Zi(); System.out.println("----------------------"); Zi z2 = new Zi("刘德华", 17); } }
super关键字的注意事项
super的注意事项一
-
super访问成员变量和成员方法: 优先去父类中找,如果有就直接使用,如果没有就去爷爷类中找,如果有,就用,依次类推…
class Ye{ int a = 10; public void eat(){ System.out.println("Ye"); } } class Fu extends Ye{ int a = 20; public void eat(){ System.out.println("Fu"); } } class Zi extends Fu{ int a = 30; public void show(){ System.out.println(super.a); super.eat(); } } public class Test2 { public static void main(String[] args) { Zi zi = new Zi(); zi.show(); } }
super的注意事项二
-
子类的构造方法默认会调用父类的空参构造方法,如果父类中的没有空参构造方法,只定义了有参构造方法,会编译报错
class Fu { public Fu(int a){ } } class Zi extends Fu{ // 编译报错 }