在java中,this和super关键字是与继承关系密切相关的,this和super可以看做是变量;this用来指向当前对象或类的实例变量,super用来指向当前对象的直接父类对象。
1.this关键字的用法
1.1this关键字用来区分成员变量与局部变量的冲突。
当方法中的某个局部变量与当前类的某个成员变量具有相同的名字时,为了不混淆,使用this区分。用this引用的是成员变量,没有this的是局部变量。
示例:
public class Student{ private String name; public void setName(String name){ this.name = name; //name代表形参里的name,this.name代表成员变量name } public String getName(int age){ this.age = age; } }
1.2作为方法的返回值,返回对象本身。
示例:
public class Test{ int i = 0; Test(int i)}{ //构造方法 this.i = i; } Test increament(){ //该方法的功能是使i+1,并返回Test本身 i++; return this; //返回当前对象 } void print(){ System.out.println("i="+i); } public static void main (String args[]){ Test test = new Test(10); //每调用一次increament()方法i,就增加1 test.increament().increament().print(); } }
结果是12,两次调用increament()方法。
1.3this关键字还用于构造方法的重载。
在类的某个构造方法中使用this([实参列表])来调用本类的其他构造方法,该语句必须放在此构造方法的第一行。
注:在使用this关键字进行构造方法的重载时需要有一个出口,也就是说至少有一个构造方法没有用this([实参列表])调用其他的构造方法,否则调用是循环调用,会造成死循环。
如果一个类中有多个构造方法,最好在参数少的构造方法中使用this([实参列表])来调用参数多的构造方法,这样可以增加类的可读性和可维护性。
2.super 关键字的用法
super代表当前对象的直接父类对象。在类的继承中,可以使用super访问父类中被子类隐藏了的同名成员变量,访问父类中被子类覆盖了的同名成员方法,也可以在子类的构造方法中使用super关键字调用父类的构造方法,以下是super的两种主要用法:
2.1在子类中访问父类的成员
引用直接父类中被隐藏的成员变量,语法如下:
super.成员变量;
调用直接父类中被覆盖的成员方法,语法如下:
super.成员方法([实参列表]);
示例:
//FatherClass public class FatherClass{ String name; int age = 48; public void info(){ name = "zhangsan"; System.out.println("name---->"+name); } } //ChildClass public class ChildClass extends FatherClass{ String name; //对父类中的name属性重新定义,即隐藏了父类中的name属性 public void info(){ //对父类中的info()方法进行重写 super.info(); //利用super关键字调用被子类覆盖的父类中的info()方法 name ="zhangqian"; System.out.println("childname---->"+name); System.out.println(name); System.out.println(super.name); } } //Test public class TestSuper{ public static void main(String[] args){ ChildClass child = new ChildClass(); child.info(); } }
2.2调用直接父类的构造方法
语法如下:
super([实参列表]);
注:1.调用直接父类的构造方法经常使用的语句是super()和super(参数)。
2.super()表示调用父类中没有任何参数的构造方法。
3.super(参数)表示调用父类中含有参数的构造方法,根据传递的参数类型和个数决定调用哪个构造方法。
4.super()和super(参数)必须出现在构造方法的第一行,而且是调用父类构造方法的唯一方式。一般通过这种方法在子类的构造方法中初始化父类中的属性。
示例:
//SuperClass public class SuperClass{ public SuperClass(){ //父类中不含任何参数的构造方法 System.out.println("SuperClass Create"); } public SuperClass(String s){ //父类中含有一个字符串参数的构造方法 System.out.println(s+"SuperClass Create"); } } //ChildClass public class ChildClass extends SuperClass{ public ChildClass(){ super(); //调用父类中没有任何参数的构造方法 System.out.println("ChildClass Create"); } public ChildClass(String s){ super(s); //调用父类中含有一个字符串参数的构造方法 System.out.println(s+"ChildClass Create"); } public static void main(String[] args){ ChildClass cc = new ChildClass(); ChildClass fc = new ChildClass("Java, "); } }