[Java基础]java中this和super

时间:2023-02-15 18:38:09

一、this关键字

1.this概念

   (参考: http://www.cnblogs.com/xdp-gacl/p/3636071.html

    this是一个引用,它指向自身的这个对象,它的内存分析如下图。假设我们在堆内存new了一个对象,在这个对象里假设有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。

[Java基础]java中this和super

2.this在方法中的应用--区分成员变量与局部变量

   一个方法要运行的时候,一个jvm会在栈内存开辟一片属于这个方法的空间让这个方法在这个内存空间运行。

   如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据,如下图,通过this将成员变量i和局部变量i分开。

[Java基础]java中this和super

3.this在构造函数中的应用--调用其他构造函数以及区分成员变量与局部变量

    this关键字调用其他的构造函数时,this关键字必须要位于构造函数中 的第一个语句。
    this关键字在构造函数中不能出现相互调用 的情况,因为是一个死循环。

public class ConstructFuction {
public ConstructFuction()
{

}

public ConstructFuction(int id)
{
this(); //调用无参数额构造方法
System.out.println(id);
}

public ConstructFuction(int id,int age)
{
this(id); //使用this调用其他构造函数
System.out.println(age);
}

public ConstructFuction(int id,int age,String name)
{
this(id,age);
System.out.println(name);
}
}

4.this作为方法的返回值--返回对象本身

class ReturnObjectSelf
{
public String name="Hello World";
public ReturnObjectSelf returnObject()
{
return this;
}
}

5.this在内部类的使用

   this在内部类中代表内部类,在外部类中代表外部类。

   内部类调用外部类的成员变量,即可以直接调用,也可以用 类名.this.成员变量。

   内部类调用外部类的变量时,要区分成员变量和局部变量,有冲突时,局部变量直接调用,成员变量用 类名.this.成员变量

public class InnerClassThis {

public String outer="Hello Outer";

//内部类
public class InnerClassTest
{
public String inner="Hello Inner";

public void showInfo()
{
System.out.print(
this.inner);//内部类调用内部类成员变量
System.out.print(outer); //内部类调用外部类的成员变量
System.out.print(InnerClassThis.this.outer);
}
}

public void partClass()
{
String outer
= "Hello Outer Part";

class PartClassTest
{
public void showInfo()
{
System.out.println(outer);
//内部类调用外部类局部变量
System.out.print(InnerClassThis.this.outer); //内部类调用外部类成员变量
}
}

PartClassTest pct
= new PartClassTest();
pct.showInfo();

}

}

二、super关键字

  super关键字代表了父类空间的引用。

  super关键字的作用:
    1) 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
    2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。

  super关键字调用父类构造方法要注意的事项:
    1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
    2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句
    3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。


  super关键字与this关键字的区别:
    1) 代表的事物不一致。
       1. super关键字代表的是父类空间的引用。   
       2. this关键字代表的是所属函数的调用者对象。
    2) 使用前提不一致。
       1. super关键字必须要有继承关系才能使用。
       2. this关键字不需要存在继承关系也可使用。
    3) 调用构造函数的区别:
       1. super关键字是调用父类的构造函数。
       2. this关键字是调用本类的构造函数。

public class SuperSon  extends SuperFather{

public static void main(String[] args) {
// TODO Auto-generated method stub
SuperSon ss = new SuperSon();

ss.overrideMethod();;
}

public SuperSon()
{
super(10,"dengsenlin");//调用父类指定的构造函数,必须放到构造函数的首位
}

@Override
public void overrideMethod()
{
super.overrideMethod(); //父类与子类具有相同的函数,通过super调用父类
System .out.println("I'm Son!");
}
}

class SuperFather{
//无参数构造函数,子类默认调用该构造函数
public SuperFather()
{

}
//第一个参数构造函数
public SuperFather(int age)
{

}

//第一个参数构造函数
public SuperFather(int age,String name)
{

}

public void overrideMethod()
{
System.out.println(
"I'm father");
}
}