说到this,可能大部分人知道是指代当前对象的引用,最常见的就是在构造函数中对一些基本的属性进行初始化赋值。
public class Student {
int id;
String name;
public Student(int id,String name){
this.id=id;
this.name=name;
}
public static void main(String[]Args){
Student ss=new Student(001,"南瓜灯");
}
}
像这样对id,name进行初始化是 经常所用到的。除此之外,还有通过this对其他构造函数的调用:
public class Student {
int id;
String name;
public Student(){
this(001, "南瓜灯");
System.out.println("无参构造函数");
}
public Student(int id,String name ){
this.id=id;
this.name=name;
System.out.println("有参构造函数");
}
public static void main(String[]Args){
Student ss=new Student();
}
}
执行后的结果为:
有参构造函数
无参构造函数
也很好一节,this()掉=调用了另一个有参的构造函数。这里应该注意的是,在使用this()调用另一个构造函数的时候,只能把this()放在构造函数里的第一句,否则会出现Constructor call must be the first statement in a constructor的问题。
然后就是关键字super
super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法和属性下面举一个简单的例子说明:
class Animal {//父类Animal
public void eat(){
System.out.println("吃中....");
}
}
class Bird extends Animal{//子类Bird
<pre name="code" class="java"> public void fly(){
super();
System.out.println("飞...");
}
}public class Test { public static void main(String[]args){ Bird bd=new Bird(); bd.eat();}} 子类Bird继承父类Animal,说到现在好像还没看到要说的重点,其实在父类的eat()方法与子类的fly方法中,隐含有一个方法,叫做super.即实际在eat方法中,应该是这样的:
public void eat(){
super();//隐含的
System.out.println("吃中....");
}
子类fly()方法中,应该是这样的:
public void fly(){
super();//隐含的
System.out.println("飞...");
}
当然两个super()所指向的不同,父类super()指向的为Object,子类BIrd指向的为父类的
Animal
而且实际两个方法看似是空的,没有参数,实际也有默认的参数,就是我们这里所说的this,supe
public void eat(this,super){}
public void fly(this,super){}
当然了我们不能把默认的this与super手动加上。说到这些,我们就可以看看上面整段代码在底层的运行效果:
先new一个Bird,然后执行到super()的时候,调用父类,一直向上,直到到Object,看过这图应该对执行的顺序有了一个清醒的认识
然后换一个图的方式:
可以看出子类对父类是一种包含关系,好了,说到这里,相信对this以及super有了一些认识吧