在继承中this和super都是很常用的,有这样一种说法:
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
接下来来详细介绍一下:
this关键字
this的用法大致有三种
1.this加点的方法(this.)
这种方法算是最常见的,这里的this指的是对象本身
语法:this.成员名 this.方法名
2.当形参名与成员名相同时,进行区分
我们举个例子
public class Test01 {
private String name;
private int age;
public void setname(String name)
{
this.name=name;//这里this.name指的是成员变量的String name。name指的是形参
}
public void setage(int age)//同上
{
this.age=age;
}
public void Print(){
System.out.println("我是Mary!!!");
}
public void way()
{
this.Print();//对自己的引用。
}
public void print()
{
System.out.println("我是"+name+"我今年"+age+"岁了");
}
public static void main(String[] args) {
Test01 a =new Test01();
a.Print();
a.setage(10);
a.setname("Mary");
a.print();
}
}
运行结果如下
3.this.(参数)方法
this(参数):调用本类中另一种形式的(
重载的
)构造函数(应该为构造函数中的第一条语句)。
this(参数)函数主要应用于同一类中从某个构造函数调用另一个重载版的构造函数。
this(参数)只能用在构造函数中,并且只能在第一行。
我们看个例子:
public class Animal {
public Animal()
{ this("mary");//对自身重载的构造方法的调用
System.out.println("我是构造方法");
}
public Animal(String name)
{
System.out.println("我是重载的构造方法"+name);
}
public static void main(String[] args) {
Animal a = new Animal();
}
}
运行结果如下:
super关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,所以一般用它来进行对父类对象的调用
super的用法也有三种:
1.super.
这种方法也算是最常见的,这里的this指的是对象本身
语法:this.成员名 this.方法名
2.当父类的常量名或方法名与子类的常量名或方法名相同时,用来调用父类的方法或常量:
来举个例子
class Big{
int i=1;
String name = "Mary";
public Big()
{
System.out.println("我是父类的构造方法");
}
public void Print(){
System.out.println("我是父类的Print");
}
}
public class Small extends Big{
int i=2;
String name ="Jack";
public Small(){
super();//调用了父类的构造方法
System.out.println("我是子类的构造方法");
}
public void Print()
{
System.out.println("我是子类的i="+i);
System.out.println("我是父类的i="+super.i);
System.out.println("我是子类的name="+name);
System.out.println("我是父类的name="+super.name);
super.Print();
}
public static void main(String[] args) {
Small a = new Small();
a.Print();
}
}
运行结果为:
注意: 定义子类的一个对象时,会先调用子类的构造函数,然后在调用父类的构造函数,如果父类函数足够多的话,会一直调用到最终的父类构造函数,函数调用时会使用栈空间,所以按照入栈的顺序,最先进入的是子类的构造函数,然后才是邻近的父类构造函数,最后再栈顶的是最终的父类构造函数,构造函数执行是则按照从栈顶到栈底的顺序依次执行,所以本例中的执行结果是先执行Big的构造函数,然后再执行子类的构造函数。
3.super(参数)的方法
super(参数)函数在子类构造函数中调用父类的构造函数或重构的构造函数时使用,而且必须要在构造函数的第一行
来举个例子
class People{
public People(){
System.out.println("我是父类的构造方法");
}
public People(String name){
System.out.println("我是带name参数的重载构造方法");
}
public People(int i){
System.out.println("我是带i参数的重载的构造方法");
}
}
public class Chinese extends People {
public Chinese(){
super(1);
//super()和super(name)不能再次调用,因为super(参数)方法只能放在构造方法第一句
System.out.println("我是子类的构造方法");
}
public static void main(String[] args) {
Chinese a = new Chinese();
}
}
运行结果为:
super和this的异同
- 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关键字。