詳解Java中super的幾種用法並與this的差別。本站提示廣大學習愛好者:(詳解Java中super的幾種用法並與this的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中super的幾種用法並與this的差別正文
1. 子類的結構函數假如要援用super的話,必需把super放在函數的首位
class Base {
Base() {
System.out.println("Base");
}
}
public class Checket extends Base {
Checket() {
super();//挪用父類的結構辦法,必定要放在辦法的首個語句
System.out.println("Checket");
}
public static void main(String argv[]) {
Checket c = new Checket();
}
}
假如想用super繼續父類結構的辦法,然則沒有放在第一行的話,那末在super之前的語句,確定是為了知足本身想要完成某些行動的語句,然則又用了super繼續父類的結構辦法。那末之前所做的修正就都回到之前了,就是說又成了父類的結構辦法了。
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="xianfan";
String value(String name) {
name = "China";
return name;
}
}
class City extends Country {
String name;
String value(String name) {
name = "Hefei";
super.value("掉敗");//不挪用此辦法時,super.name前往的是父類的成員變量的值null
System.out.println(name);
System.out.println(super.name);
return name;
}
public static void main(String[] args) {
City c=new City();
c.value("勝利");
}
}
成果為:Hefei
xianfan
此時,super.name前往的值是父類成員變量的值xianfan,而此時的super.value()辦法是不起感化的。
3.用super直接傳遞參數:
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("A Person.");
}
Person(String name) {
prt("A person name is:" + name);
}
}
public class Chinese extends Person {
Chinese() {
super(); // 挪用父類結構函數(1)
prt("A chinese.");// (4)
}
Chinese(String name) {
super(name);// 挪用父類具有雷同形參的結構函數(2)
prt("his name is:" + name);
}
Chinese(String name, int age) {
this(name);// 挪用以後具有雷同形參的結構函數(3)
prt("his age is:" + age);
}
public static void main(String[] args) {
Chinese cn = new Chinese();
cn = new Chinese("kevin");
cn = new Chinese("kevin", 22);
}
}
成果為:A Person.
A chinese.
A person name is:kevin
his name is:kevin
A person name is:kevin
his name is:kevin
his age is:22
在這段法式中,this和super不再是像之前那樣用“.”銜接一個辦法或成員,而是直接在厥後跟上恰當的參數,是以它的意義也就有了變更。super後加參數的是用來挪用父類中具有雷同情勢的結構函數,如1和2處。this後加參數則挪用的是以後具有雷同參數的結構函數,如3處。固然,在Chinese的各個重載結構函數中,this和super在普通辦法中的各類用法也仍可以使用,好比4處,你可以將它調換為“this.prt”(由於它繼續了父類中的誰人辦法)或許是“super.prt”(由於它是父類中的辦法且可被子類拜訪),它照樣可以准確運轉。但如許仿佛就有點弄巧成拙的滋味了。
4.super和this的異同:
1)super(參數):挪用基類中的某一個結構函數(應當為結構函數中的第一條語句)
2)this(參數):挪用本類中另外一種構成的結構函數(應當為結構函數中的第一條語句)
3)super: 它援用以後對象的直接父類中的成員(用來拜訪直接父類中被隱蔽的父類中成員數據或函數,基類與派生類中有雷同成員界說時如:super.變量名 super.成員函數據名(實參)
4)this:它代表以後對象名(在法式中易發生二義性的地方,應應用this來指明以後對象;假如函數的形介入類中的成員數據同名,這時候需用this來指明成員變量名)
5)挪用super()必需寫在子類結構辦法的第一行,不然編譯欠亨過。每一個子類結構辦法的第一條語句,都是隱含地挪用super(),假如父類沒有這類情勢的結構函數,那末在編譯的時刻就會報錯。
6)super()和this()相似,差別是,super()從子類中挪用父類的結構辦法,this()在統一類內挪用其它辦法。
7)super()和this()均需放在結構辦法內第一行。
8)雖然可以用this挪用一個結構器,但卻不克不及挪用兩個。
9)this和super不克不及同時湧現在一個結構函數外面,由於this必定會挪用其它的結構函數,其它的結構函數必定也會有super語句的存在,所以在統一個結構函數外面有雷同的語句,就掉去了語句的意義,編譯器也不會經由過程。
10)this()和super()都指的是對象,所以,均弗成以在static情況中應用。包含:static變量,static辦法,static語句塊。
11)從實質上講,this是一個指向本對象的指針, 但是super是一個Java症結字。