Java中 super和this用法总结

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

PS:super存在的意义?

当父类的方法不能完全满足子类使用,这个时候子类重写父类的方法,并可以在方法中使用关键字super调用父类的方法,这样做即可以保有父类的功能,也可以拥有子类特有的功能。

一、this用法总结

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针

this 的用法在 Java 中大体可以分为3种:

1.在本类中直接引用

  可以引用本类的成员属性,也可以引用方法,例如

public class SmartPhone  {
    String manufacturer;
    int price;
public void editSms(){ System.out.println("用"+this.manufacturer+"手机编辑短信!");//用this引用本类的方法 } public void sendSms(){ this.editSms();//用this引用本类的方法 System.out.println("用"+this.manufacturer+"手机发送短信!"); } }

 

2.当方法中形参与成员名字重复的时候,用this作区分。

   一般用在构造方法、getter、setter及自定义方法中。

   public SmartPhone(String manufacturer) {
        this.manufacturer = manufacturer;//用this做区分
    }

getter

    public String getManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
        return  this.manufacturer;
    }

setter

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

……

3.引用构造函数

二、super用法总结

1.在子类中直接引用

 例如:super.xxx;(xxx为变量名或bai对象名)
 这种方法意义为获取父类中的名字为xxx的变量或方法引用,使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作

    例如父类BasicPhone 

public class BasicPhone {
    String manufacturer;
    int price;

    public BasicPhone(){
        manufacturer = "HuaWei";
        price = 1999;
    }

}

子类Smartphone

public class SmartPhone extends BasicPhone {
    String manufacturer;
    int price;

    public SmartPhone() {
        System.out.println(super.manufacturer);//访问父类的成员变量
        System.out.println(super.price);//访问父类的成员变量
    }

}

2.第二种
super.xxx();(xxx为方法名)  直接访问并调用父类中的方法。

public class BasicPhone {
    String manufacturer;
    int price;

    public BasicPhone(){
        manufacturer = "HuaWei";
        price = 1999;
    }

    public void editSms(){
        System.out.println("用"+this.manufacturer+"手机编辑短信!");
    }

}

子类Smartphone

public class SmartPhone extends BasicPhone {
    String manufacturer;
    int price;

    public SmartPhone() {
        System.out.println(super.manufacturer);
        System.out.println(super.price);
    }


    public void sendSms(){
        super.editSms();//用super关键字调用父类的方法
        System.out.println("用"+super.manufacturer+"手机发送短信!");
    }
}

3.第3种

super();

调用父类的初始化方法,而且super()必须是子类构造方法中的第一个执行语句。如果不写的话,系统会默认在子类构造器上的第一行加上隐式的super()。

public class BasicPhone {
    String manufacturer;
    int price;

    public BasicPhone(){
        manufacturer = "HuaWei";
        price = 1999;
        System.out.println("父类的构造器!");
    }

    public void editSms(){
        System.out.println("用"+this.manufacturer+"手机编辑短信!");
    }

}

子类

public class SmartPhone extends BasicPhone {
    String manufacturer;
    int price;

    public SmartPhone() {
        super();
    }


    public void sendSms(){
        super.editSms();//用super关键字调用父类的方法
        System.out.println("用"+super.manufacturer+"手机发送短信!");
    }
}

 

三、总结

  1. 如果子类中出现非私有的同名变量,要引用时:
    (1) 访问父类中的同名变量,用super
    (2) 访问子类本类中的变量,用this
  2. 如果子类重写方法时,要引用父类中的已经定义好的功能时,用super.方法
  3. 如果子类中的构造函数需要指定父类中其他构造函数进行初始化,使用super(参数)的形式
  4. 如果子类中的构造函数中,需要引用父类中已经定义好的方法,使用super(参数)
  5. super调用父类的构造方法时,必须出现在构造方法的第一行;
  6. super只能出现在子类的方法或构造方法中。



 

posted @ 2020-11-25 00:18  Danny·茄子  阅读(333)  评论(0编辑  收藏  举报