1. 程式人生 > >java中super的用法和與this的區別

java中super的用法和與this的區別

super用於呼叫父構造器

------------------------------------------------------------------------------------------------------------------

1、子類的建構函式如果要引用super的話,必須把super放在函式的首位。

class Base{
	Base(){
		System.out.println("Base");
	}
}

public class Checket extends Base {

	/**
	 * @param args
	 */
	Checket(){
		super();//呼叫父類的構造方法,必須放在首位
		System.out.println("Checket");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Checket c = new Checket();
		
	}

}
如果想用super繼承父類構造的方法,但是沒有放在第一行的話,那麼在super之前的語句,肯定是為了滿足自己想要完成某些行為的語句,

但是又用了super繼承父類的構造方法。那麼以前所做的修改就都回到以前了,就是說又成了父類的構造方法了。

super用於訪問被隱藏的父類的Field和Method

------------------------------------------------------------------------------------------------------------------

2、 在Java中,有時還會遇到子類中的成員變數或方法與超類(父類)中的成員變數或方法同名。因為子類中的成員變數或方法名優先順序高,所以子類中的同名

成員變數或方法就隱藏了超類中的成員變數或方法,但是我們如果想要使用超類中的這個成員變數或方法,就需要用到super.

class Country{
	String name;
	
	void value(){
		name = "china";
	}
}

class City extends Country{
	String name;
	
	void value(){
		name = "hefei";
		super.value();//不呼叫此方法時,super,name返回的是父類的成員變數的值null
		
		System.out.println(name);
		System.out.println(super.name);
				
	}
	public static void main(String[] args){
		City c = new City();
		c.value();
		
	}
}
為了在子類中引用父類中的成員變數name和方法value(),在程式碼中使用了super、super.name和super.value();若不呼叫super.value()時,super.name返回

父類成員變數預設值null,呼叫此方法時,super.value()方法把成員變數name賦值為China,再利用super.name呼叫父類的成員變數的值。

super.name呼叫的是成員變數而非區域性變數的值

 class Country{
	String name = "未初始化國家";
	String value(String name){
		name = "China";//此處的name為區域性變數name,不是上面的成員變數那麼
		return name;
	}
}
 
public class City extends Country {

	/**
	 * @param args
	 */
	String name = "未初始化城市";
	
	String value(String name){
		name = "hefei";
		super.value("失敗");//呼叫父類方法value
		System.out.println(name);//呼叫區域性變數name
		System.out.println(this.name);//呼叫成員變數name
		System.out.println(super.name);//呼叫父類的name
		return name;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		City c = new City();
		c.value("成功");
		
	}

}

上面程式的vsuper.value()是不起作用的,因為此方法只是對其內定義的區域性變數進行了操作

用super直接傳遞引數

-------------------------------------------------------------------------------------------------------------------

class Person{
	public static void prt(String s){
		System.out.println(s);
	}
	Person(){					//父類——建構函式1
		prt("A Person.");
	}
	Person(String name){		//父類——建構函式2
		prt("A Person name is:" + name);
	}
}

public class Chinese extends Person {

	/**
	 * @param args
	 */
	Chinese(){				//子類——建構函式1
		
		super();							//在父類中電泳:呼叫父類——建構函式1 <1>
		prt("A Chinese.");//【1】
		
	}
	
	Chinese(String name){	//子類——建構函式2
		
		super(name);						//在父類中呼叫:呼叫父類具有相同形參的父類——建構函式2 <2>
		this.prt("his name is:" + name);//【2】
	}
	
	Chinese(String name, int age){//子類——建構函式3
		
		this(name);							//在本類中:呼叫具有相同形參的子類——建構函式3 <3>
		super.prt("his age is:" + age);//【3】
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chinese cn = new Chinese();
		cn = new Chinese("大爺");
		cn = new Chinese("大爺", 100);
		
	}

}
A Person.
A Chinese.
A Person name is:大爺
his name is:大爺
A Person name is:大爺
his name is:大爺
his age is:100

在這段程式中,this和super不再是像以前那樣用 “.”連結一個方法或成員,而是直接在其後跟上適當的引數,因此它的

意義也就發生了變化。super後加引數的是呼叫父類中具有相同形式的建構函式,如<1>和<2>處。

this後加引數則呼叫的是當前具有相同引數的建構函式,如<3>處。當然,在Chinese的各個過載建構函式中,this和super在一般方法中的各種用法也

仍可使用,比如<4>處的prt()可以替換為this.prt();(因為它繼承了父類中的那個方法)或者是super.prt()(因為它是父類中的方法且可被子類訪問),它照樣可以正確

執行。但這樣似乎有點畫蛇添足的味道了。

注意【1】【2】【3】的用法

super和this的異同

-------------------------------------------------------------------------------------------------------------------

用法一:

super(引數):呼叫基類中的某一個建構函式(應為建構函式中的第一條語句)

this(引數):呼叫本類中另一種形成的建構函式(應該為建構函式中的第一條語句)

用法二:

super.***:它引用當前物件的直接父類中的成員(用於訪問直接父類中被隱藏的父類中Field或Method,

基類與派生類中有相同成員定義時如:super.Field名     super.Method名(引數)

三:

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關鍵字

相關推薦

javasuper用法this區別

super用於呼叫父構造器 ------------------------------------------------------------------------------------------------------------------ 1、子類的建構函

Javasuper關鍵字this關鍵字的比較

1、基本概念的比較 this關鍵字用於代表本類的物件; super關鍵字用於代表父類的物件; 2、使用方式的比較 使用this. 的方式可以訪問本類的成員變數和成員方法; 使用super. 的

Java &&&的區別

log 不能 if判斷 ava nbsp 第一個 als post body &&時判斷第一個條件為false,後面的條件就沒有進行判斷。 &時要對所有的條件進行判斷,所以會對後面的條件進行判斷。 例如if((1!=1)&&(1/0!

Java的堆棧的區別

信息 棧內存 ash 譯文 GC diff ror grep xmx (轉載 技術小黑屋) Java中的堆和棧的區別 DEC 7TH, 2014 當一個人開始學習Java或者其他編程語言的時候,會接觸到堆和棧,由於一開始沒有明確清晰的說明解釋,很多人會產生很

java接口繼承的區別

inter pan 比較 TP s/4 定義 http nds 接口 實際概念區別:區別1:不同的修飾符修飾(interface),(extends)區別2:在面向對象編程中可以有多繼承!但是只支持接口的多繼承,不支持‘繼承‘的多繼承哦而繼承在java中具有單根性,子類只能

java的sleep()wait()的區別

except 的區別 獲取對象 waiting 區別 ace enter thread .html 引自:https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html 對於sleep()方法,我們首先要知道該方

java.equals()方法==號的區別

主方法要進棧 ==號和equals()方法都是比較是否相等的方法,那它們有什麼區別和聯絡呢?  首先,==號在比較基本資料型別時比較的是值,而用==號比較兩個物件時比較的是兩個物件的地址值,實際上.equals()方法比較的就是相當於把變數進行打包,就是比較包裡面的內容: int

舉例說明java抽象類介面的區別

先定義一個介面: 介面中定義了兩個方法,現在定義一個普通類實現這個介面: 這時候發現報錯了,以前只知道實現介面必須實現其中的方法,卻不知道為什麼要實現。最近才瞭解到: 如果一個類繼承了某個抽象類或者實現了某個介面都需要對其中的抽象方法進行實現,否則該類需要被宣告為

(轉)詳細解析Java抽象類介面的區別

原文地址:https://zhuanlan.zhihu.com/p/50989401 在Java語言中, abstract class 和interface 是支援抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的 面向物件能力。abstract class和interface之間在對於

Java關鍵字throwthrows的區別

丟擲異常有三種形式 throw throws 系統自動拋異常 一、系統自動拋異常 當程式語句出現一些邏輯錯誤、主義錯誤或型別轉換錯誤時,系統會自動丟擲異常:(舉個栗子) public static void main(String[] args) {

java的302sendRedirect的區別

java中有一個sendRedirect函式這個用於跳轉到另外一個頁面,這個實際上是一個302跳轉,但是不完全等同於302跳轉 點選(此處)摺疊或開啟 response.sendRedirect("login.jsp"); 不等於 response.addHe

javaimport staticimport的區別

import static(靜態匯入)是JDK1.5中的新特性,一般我們匯入一個類都用 import com.....ClassName;而靜態匯入是這樣:import static com.....ClassName.*;這裡多了個static,還有就是類名ClassNam

Java && & 的區別

在java中&和&&都屬於邏輯運算子,都是判斷兩邊條件為真時為真,否則則為假。 在程式中: 1 int i = 1; 2 if ((i++ > 1) & (i++ > 3)) { 3 System.o

java 抽象類介面的區別

不同點: 1.從語法上來講,抽象類 abstract class,介面中用interface 2.定義中:①變數:抽象類中可以定義變數,介面只有常量 public static final                   ②常量:抽象類中任何方法都可以除了(defa

詳細解析Java抽象類介面的區別

  在abstract class方式中,Demo可以有自己的資料成員,也可以有非 abstract的成員方法,而在interface方式的實現中,Demo只能夠有靜態的不能被修改的資料成員(也就是必須是static final 的,不過在interface中一般不定義資料成員),所有的成員方法都是abstr

JAVA泛型Object的區別

重點:泛型的主要目的之一就是用來指定容器,而由編譯器來保證型別的正確性。此處以別處的demo為例,具體出處於(https://www.cnblogs.com/xujanus/p/8474553.html):問題:下面2個方法的宣告有何不同public Object doSom

JAVA 的 StringBuilder StringBuffer 的區別,適用的場景是什麼?

1.使用String類的場景:在字串不經常變化的場景中可以使用String類,例如常量的宣告、少量的變數運算。 2.使用StringBuffer類的場景:在頻繁進行字串運算(如拼接、替換、刪除等),並且執行在多執行緒環境中,則可以考慮使用StringBuffer,例如XML解析、HTTP引數解析和封裝。

Java抽象類介面的區別

抽象類: 抽象類必須在類前加上abstract表示這是一個抽象類,抽象類的抽象方法不需要實現,他只是一種宣告,所以也就無法建立抽象類的物件。一個類繼承抽象類必須實現抽象類中的抽象方法,如果不實現這個抽象方法,那麼這個類就必須是抽象的。 介面: 介面是Java中的interface,介面中

java 的sleep()wait() 的區別

1、sleep()  使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行,但它並不釋放物件鎖。也就是說如果有synchronized同步快,其他執行緒仍然不能訪問共享資料。注意該方法要捕捉異常。 例如有兩個執行緒同時執行(沒有synchronized)一個執行緒優先順序為MAX_

JavaString ,StringBufferStringBuilder的區別

  Java中的與字串操作相關的三個類String,StringBuffer和StringBuilder非常重要,特別做下總結。 String 字串常量   String 是不可變的物件, 因此在每次對 String 型別進行改變的時候其實都等同於生成了