在面向对象的程序设计语言中,类和对象的概念一直贯穿于整个编程思想。简单来说,类是现实世界的抽象化,是对一类事物的一个泛指,如人(当然黄种人,黑种人,白种人也都可以称之为一个类),而对象就是类的实例化,如你,我,他,就是一个对象。是一个具体存在的东西。
接下来就要介绍今天的重点,this引用和super关键字。为什么仅此两个关键字就能单独的开一篇
第一,在博主学习JAVA的过程中,无论是自己写代码,还是看别人的代码,如果对这两个关键字有深刻的理解,将对接下来的任务有很大的帮助。
第二,在面向对象的编程语言中,构造器的理解和使用一直都是重中之重。
首先抽象的说一下,this表示当前对象,也就是当前类的实例化对象,super表示当前类的父类。接下来我们举个例子。
我们先来解读相对简单的Super关键字,下面是我们的父类
class Person{
public float height=180;
public float weight;
public String kind;
public Person(String kind){
System.out.println("我是"+kind);
}
public Person(String kind,float weight)
{
System.out.println("我使用的是两个参数的构造方法");
}
public void Print(){
System.out.println("我的身高是"+height+"\n"+"我的体重是"+weight);
}
}
我们的子类是:
class WhitePerson extends Person{
public float height;
public float salay;
public WhitePerson(String kind)
{
//通过super调用父类的构造方法
super(kind);
}
public WhitePerson(String kind,float height){
//通过super参数表的不同调用不同的构造方法
super(kind,height);
}
public void Print(){
//通过super调用父类的成员方法
super.Print();
}
public void Print(float height){
//通过super调用父类变量
this.height=height;
System.out.println("我是super的结果"+super.height);
System.out.println("我是this的结果"+this.height);
}
}
主函数:
public class This_super {
public static void main(String[] args) {
// TODO 自动生成的方法存根
WhitePerson thefirstPerson =new WhitePerson("whitePerson");
//这里的190并没有起到作用,原因我们后面会讲
WhitePerson theSecondPerson =new WhitePerson("whitePerson",190);
//这里的赋值并没有起到作用是因为调用的是父类的打印方法
thefirstPerson.height=170;
thefirstPerson.Print();
theSecondPerson.Print(160);
}
}
我们来看看运行的结果图:
首先,我们可以看见,是两个构造方法先后进行了调用,意思就是当我们new一个对象的是就会调用一次该对象的构造方法。我们在父类中设置了height的初始值是180。所以我们通过super调用父类的super方法从而使
thefirstPerson.height=170这句话并没有起到作用。
下面是重点
在这里,我们的子类都是通过super关键字来继承或者调用父类的一些基本方法,变量。当然我们也可以自己重写自己想要的构造方法。我们这里想要体现的是:
第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数数量对应的是不同的构造方法。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。
第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
接下来是相对麻烦的this关键字。下面是新的父类的代码
class Person{
public float height=180;
public float weight;
public String kind;
public Person(String kind){
System.out.println("我是"+kind);
}
public Person(String kind,float height)
{
//通过this来调用本类中的另外一个构造方法
this(kind);
//通过this来给成员变量赋值
this.height=height;
System.out.println("我使用的是两个参数的构造方法");
}
public void Print(){
System.out.println("我的身高是"+height+"\n"+"我的体重是"+weight);
}
}
这次运行的结果是:
很明显的是这次主函数中 WhitePerson theSecondPerson =new WhitePerson(“whitePerson”,190)这句话的赋值就起了作用。
下面是重点
第一、通过this调用另一个构造方法:this(参数列表),这个只能在类的构造方法中使用。
第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。 第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。
一般都是这么用:
public WhitePerson getSelf(){
return this;
}
放在子类中。
一句话总结:
this用于在类自己内部的操作,指向当前对象自身,super用于父类的调用。