this关键字:
this的三大作用:this调用属性,调用方法,表示当前的对象
this是对当前对象的引用,是运行期间当前对象本身。
(1).可以使用this明确的访问当前对象的属性或者方法,类似于“我”。
(2).this()可以调用本类的其他构造器,可以实现构造器的重用,简化代码的实现。
(3).this()必须写在构造器的第一行。
如下代码进行演示
1.最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:
public class Point{
int x;
int y;
//构造器
public Point(int x,int y){
//局部变量想x,y把Point类的属性屏蔽
this.x=x;
this.y=y;
}
}
2.this调用本类构造器,在Point(int x)构造方法中调用了Point(int x,int y)构造方法,如下代码演示:
public class Point{
int x;
int y;
public Point(int x){
//调用本类中的构造器
this(x,x);
}
//构造器
public Point(int x,int y){
this.x=x;
this.y=y;
}
}
注意:this()必须写在构造方法的第一行,因为在构造器之前是没有对象的。
3.this只能在方法内部使用,表示对“调用方法的那个对象”的引用。但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一类中的其他方法,如下代码进行演示:
public class Apricot {
void pick() {}
void pit() {
pick();
}
}
在pit()内部,你可以写this.pick(),但无此必要。编译器能帮你自动添加。只有当需要明确指出对当前对象的引用时,才需要使用this关键字,如果非要写成this.pick()也是可以的,但是这样就完全的失去我们使用高级语言的本质,所以大可不必。
4.可以使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。并且,除了构造器之外,编译器禁止在其他任何方法中调用构造器。
class Person {
String name;
int age;
public Person() {
System.out.println("Person() constructor!");
}
public Person(String name, int age) {
this(); // 调用本类中无参构造方法
this.name = name;
this.age = age;
System.out.println("Person(String name, int age) constructor!");
}
}
public class ThisConstructor {
public static void main(String[] args) {
{
new Person("小光", 25);
}
}
}
运行结果如下:
5. this不能用于静态方法。main方法也是静态的,所以this也不能用于main方法,具体如下解释
tatic方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成,而this指代的是当前的对象。
在方法中定义使用的this关键字,它的值是当前对象的引用。也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.。
而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象。如果使用的是类来调用而不是对象,则this就无法指向合适的对象。所以static 修饰的方法中不能使用this。
super关键字:
在Java中,super关键字有两种作用:
(1).用在类中引用其父类的构造函数。
(2).用来调用基类的成员变量。
1.用在类中引用其父类的构造函数类,其格式如下:
super(【实参列表】);
其中的【实参列表】对应于父类的构造函数列表,例如:
//父类
public class Animal{
private String name;
public Animal(String name){
this.name=name;
}
public void eat(String food){
System.out.println("肚子饿了,吃东西!");
}
}
//子类
public class Cat extends Animal{
public Cat(){
super("猫");
}
public void eat(){
super.eat();
System.out.println("喂我老鼠");
}
}
当调用父类的某个构造是,super()应该写在子类构造函数的第一句。
2.用来调用基类的成员变量:
super可以用作前缀来引用父类的成员。例如,上例中Animal类与Cat类中都有eat()这个方法,当想在子类中引用父类的eat方法时,以示区别,我们必须使用super.eat()来引用父类中的eat()方法。
this和super的异同,如下:
*super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
*this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
*super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
*this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
*调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
*super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
*super()和this()均需放在构造方法内第一行。
*尽管可以用this调用一个构造器,但却不能调用两个。
*this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
*this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
*从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。