1、this
当一个对象创建后,JVM就会给这个对象分配引用自己的指针,这个指针的名字就叫做this。也正因为如此,this只能用在非静态方法中。并且this只和特定的对象关联,而不和类关联(所以看到this就表示调用这个方法的对象)。
this的具体用法有四种:
1、调用类中的成员变量
在下面的Student类中,定义了同名的成员变量和局部变量name,在成员方法中this这个关键字其代表的就是调用对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,所以在下面的代码中,this.name=name就是将局部变量的值传递给成员变量。
Public Class Student {
String name; //定义一个成员变量name
private void SetName(String name) { //定义一个参数(局部变量)name
this.name=name; //将局部变量的值传递给成员变量
}
}
2、调用本类中的其他构造方法
构造方法是一个与类同名的没有返回值的方法,在Java类中必须存在一个构造方法。如果在代码中没有显式的体现构造方法的话,那么编译器在编译的时候会自动添加一个没有形式参数的构造方法。可以通过this调用本类中另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中可以用,并且只能放在类的构造方法的方法体的第一句。在存在同名构造方法时,可通过方法重载来进行调用。
public class Student { //定义一个类,类的名字为student
String name;
String id;
public Student() { //定义一个构造方法
this(“Hello!”); //调用其他构造方法
}
public Student(String name) { //定义一个带形式参数的构造方法
this.name=name;
}
}
3、代表自身对象
在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this
4、调用成员方法
在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用,只是所有这样的引用中this都可以省略
2、super
super与this类似,是指向父类的指针,也只能用于非静态方法中
1、调用父类的方法或成员变量
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value(); //调用父类的方法
System.out.println(name); //Shanghai
System.out.println(super.name); //China
}
public static void main(String[] args) {
City c=new City();
c.value(); //调用子类的方法
}
}
运行结果:
Shanghai
China
在上面的例子中调用了父类的方法和成员变量
2、调用父类构造方法
必须写在方法体的第一行
用法如下:
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
从本例可以看到,可以用super和this分别调用父类的构造方法和本类中其他形式的构造方法。