Java之Super詳解
Java之Super詳解
如何在子類中訪問父類的一些屬性或者方法?這篇文章教會你正確使用super。
先定義Person類,定義受保護的變數name,
public class Person {
protected String name="zfp";
}
再定義Student類,繼承Person類,並且定義一個函式來輸出名字。我們想,如何分別輸出函式輸入引數的name,子類的name以及父類的name呢?
public class Student extends Person{
private String name="zxn";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
上面程式碼中第一個name很顯然是函式傳入引數的name,this.name肯定指代的是Student類中的name,而如何輸出Person類的name呢?我們用super.name來獲取父類的引數。
定義測試類如下:
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.test("123");
}
}
執行測試類,輸出如下:
123
zxn
zfp
結果符合我們的預期,第一個輸出是test函式輸入的引數,第二個輸出的是Student類的name,第三個輸出的是父類的name。
在Person類中定義print函式如下:
public void print(){
System.out.println("Student");
}
如何在Student類中呼叫父類方法?我們試一下:
public void print(){
System.out.println("Student");
}
public void test1(String name){
print();
this.print();
super.print();
}
Student類裡面 test1方法中,第一個print呼叫自己的print函式,this.print也是一樣的,super.print則能成功呼叫父類的print方法。輸出如下:
Student
Student
Person
符合我們的預期。
下面我們做一個嘗試,把父類的public函式變成私有的:
private void print(){
System.out.println("Student");
}
會發現這個時候子類無法呼叫父類的方法了。在此說明:
私有的東西無法被繼承!
我們在子類和父類中分別加入顯式構造器:
public Person(){
System.out.println("Person的無參構造");
}
public Student() {
System.out.println("Student類的無參構造");
}
輸出結果:
Person的無參構造
Student類的無參構造
我們發現,父類的無參構造方法先被呼叫,說明子類的構造方法中包含隱藏程式碼super(),呼叫了父類的構造方法,即:
public Student() {
super();
System.out.println("Student類的無參構造");
}
如果確實要像上面這樣在子類的構造器中顯式地定義父類的構造方法,那麼:
呼叫父類的構造器,必須要在子類構造器的第一行!
綜上,super的注意點如下:
- super呼叫父類的構造方法,必須在構造方法中的第一個;
- super必須只能出現在子類的方法或者構造方法中;
- super和this不能同時呼叫構造方法。
VS this:
- 代表物件不同:this是本身呼叫者這個物件,super代表父類引用的物件;
- this:沒有繼承也可以使用,super只能是繼承的情況下使用;
3.this()是本類的構造方法,super()是父類的構造方法。
相關文章
- Java 中 this 和 super 的用法詳解Java
- super()方法詳解
- Python中的Super詳解Python
- Java 之 volatile 詳解Java
- Java之BigDecimal詳解JavaDecimal
- Java之Spring Boot詳解JavaSpring Boot
- Java併發之AQS詳解JavaAQS
- Java併發之CompletionService詳解Java
- java基礎之:迭代器詳解Java
- Java同步之執行緒池詳解Java執行緒
- Java雙刃劍之Unsafe類詳解Java
- Java多執行緒之synchronized詳解Java執行緒synchronized
- Java中super的用法Java
- Java ”框架 = 註解 + 反射 + 設計模式“ 之 註解詳解Java框架反射設計模式
- Java基礎之字串String詳細解釋Java字串
- Java面試題之Java類載入機制詳解!Java面試題
- Java註解詳解Java
- Java 註解詳解Java
- Java併發程式設計系列之Semaphore詳解Java程式設計
- java 之泛型與可變引數詳解Java泛型
- Java String 詳解Java
- Java 反射詳解Java反射
- 詳解 Java NIOJava
- java方法詳解Java
- java反射詳解Java反射
- Java鎖詳解Java
- Java Stream 詳解Java
- 【Java】JDBC詳解JavaJDBC
- Java ThreadPoolExecutor詳解Javathread
- Java SPI詳解Java
- Java™ 教程(使用super關鍵字)Java
- Java進階——super關鍵字Java
- Java中this與super關鍵字Java
- python 詳解類class的繼承、__init__初始化、super方法Python繼承
- Java註解(Annotation)詳解Java
- HCNP Routing&Switching之Super VLAN
- 最強幹貨:Java併發之AQS原理詳解JavaAQS
- JavaScript之this詳解JavaScript