前言:理論和代碼必須結合起來才能真正的掌握
一、this
概念:this代表著當前物件的參考,也是當前函式所屬物件的參考,直白的說,哪個物件呼叫了當前函式,this就代表哪個物件,
常見的用法(理論不理解就先參考下面案例)
-
最常見的情況是是物件的一個屬性或被構造器的引數屏蔽時,如果需要呼叫屏蔽的屬性,this就代表哪個物件
-
this只能在方法內使用,表示正在呼叫方法的那個物件,但是,如果在方法內呼叫同一個類的另一個方法,就不必使用this,直接呼叫即可,this關鍵字是能省則省
-
this和static的關系:
static方法是類方法,依附于類而不依賴與任何物件,static屬性是指該屬性是類中所有物件所共享的,static方法是類方法,先于任何實體(物件)存在,static在類加載時就已經存在了,但物件是在創建時才生成;方法中使用this關鍵字它的值是當前物件的參考,只能用它呼叫屬于當前物件的屬性和方法和,但是,this可以呼叫static型別的屬性,舉個例子:一個父親是不可能向他還未出生的孩子借錢的,但孩子出生后完全可以找他父親去借錢; -
對于一個類中的this,不一定單指這個的物件,也可能是這個類的子類的物件(抽象類里面的this只能是實際呼叫中它的派生類的實體化物件);
總之:如果new 父類物件的話,父類方法的this指向的是父類,如果new 子類,那么父類方法的this指向的是子類 -
this關鍵字也可以用于在建構式中呼叫其他建構式,但是,只能定義在建構式的第一行,因為初始化動作要先執行
this使用案例
class Student extends Person{
public Student(String name, int age, String nation) {
super(name);
}
}
public class Person{
private String name;
private int age;
private static String nation = "chinese";
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
// 初始化方法必須放到第一行
this(name);
this.age = age;
}
//區域變數name和age屏蔽了name和age屬性
public Person(String name, int age,String nation) {
this.name = name;
this.age = age;
//this可以呼叫到靜態屬性
this.nation = nation;
}
public void test(){
System.out.println("測驗");
}
public static void test2(){
//靜態方法內不能出現this或super
System.out.println("測驗");
}
public void print(){
//呼叫類內部的方法(toString已重寫)加不加this都行
this.toString();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
//這個this代表的student物件
Student student = new Student("wzh",20,"chinese2");
student.toString();
//這個this代表的是person物件
Person person = new Person("wzh2",20,"chinese2");
student.toString();
}
}
結果:

二、super
概念:
super可以理解為“父類的”,super可以在子類中呼叫父類的屬性,方法,構造器,super關鍵字和this一樣能省就省;
注意點:
1、this和super很像,this指向的是當前物件的呼叫,super指向的是當前呼叫物件的父類
2、類加載完畢,創建物件,父類的構造方法會被呼叫
- 父類如果重寫了無參構造器或者父類中沒有有參構造器,那么子類的構造方法第一行就是super(),可以省略
class Student extends Person{
//這是默認的構造器內容,寫出來是為了幫大家理解
public Student(){
super();
}
}
public class Person{
private String name;
private int age;
}
- 如果父類中定義了有參構造器但沒有顯示寫出無參構造器,那么必須通過super呼叫父類的有參建構式,如果父類中定義了多個有參構造區,那么用super呼叫其中一個有參構造器即可
class Student extends Person{
public Student(String name, int age) {
//任選一個父類有參構造
//super(name, age);
super(name);
}
}
public class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this.name = name;
}
}
3、子類相應構造創建了一個子類物件,該子類物件還包含了一個父類物件,該父類物件在子類物件內部(正如子類的構造器無論如何都要通過super呼叫父類構造器一樣,子類的物件被成功構造,那么它的內部就會包含父類的物件),證明如下
- 子類重寫父類的方法后可以通過super呼叫到父類的方法
class Student extends Person {
private String name = "wzh2";
@Override
public String getName() {
return "子類" + name;
}
public String getParentName(){
//呼叫父類的方法
return super.getName();
}
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.getName());
System.out.println(student.getParentName());
}
}
public class Person{
//protected意味著子類和同一包中可以訪問
protected String name = "wzh";
protected int age = 20;
public String getName() {
return "父類" +name;
}
}
輸出結果

- 子類獲取到父類的變數
class Student extends Person{
public void parentDisplay(){
System.out.println(super.age + super.name);
}
public static void main(String[] args) {
new Student().parentDisplay(); //輸出結果:20wzh
}
}
public class Person{
//protected意味著子類和同一包中可以訪問
protected String name = "wzh";
protected int age = 20;
}
- 呼叫父類的構造器
不再舉例
4、this super只能在有物件的前提下使用,不能在靜態背景關系使用
5、如果一個類沒有基礎任何父類,super還有用嗎?肯定有用,可以呼叫Object中的方法
public class Person{
private String name;
private int age;
public void display(){
//通過this或super呼叫到了Object的toString();
System.out.println(super.toString());
}
public static void main(String[] args) {
new Person().display(); //輸出為Person@452b3a41
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254065.html
標籤:java
上一篇:二分查找
下一篇:Java面試知識點(2021)
