(一)this和super關(guān)鍵字
? Ⅰ??this
?①含義:
this:當(dāng)前對象
-
在構(gòu)造器和非靜態(tài)代碼塊中,表示正在new的對象
-
在實(shí)例方法中,表示調(diào)用當(dāng)前方法的對象
②this用法:
-
this.成員變量:表示當(dāng)前對象的某個成員變量,而不是局部變量
-
this.成員方法:表示當(dāng)前對象的某個成員方法,完全可以省略this.
-
this()或this(實(shí)參列表):調(diào)用另一個構(gòu)造器協(xié)助當(dāng)前對象的實(shí)例化,只能在構(gòu)造器首行,只會找本類的構(gòu)造器,找不到就報錯
Ⅱ super
①含義:
super:引用父類聲明的成員
? ? ? ?無論是this和super都是和對象有關(guān)的。
②super的用法:
-
super.成員變量:表示當(dāng)前對象的某個成員變量,該成員變量在父類中聲明的
-
super.成員方法:表示當(dāng)前對象的某個成員方法,該成員方法在父類中聲明的
-
super()或super(實(shí)參列表):調(diào)用父類的構(gòu)造器協(xié)助當(dāng)前對象的實(shí)例化,只能在構(gòu)造器首行,只會找直接父類的對應(yīng)構(gòu)造器,找不到就報錯
?Ⅲ?this和super關(guān)鍵字的用處?
?⒈解決成員變量重名問題
具體做法:?
-
① 如果實(shí)例變量與局部變量重名,可以在實(shí)例變量前面加this.進(jìn)行區(qū)別。
-
② 如果子類實(shí)例變量和父類實(shí)例變量重名,并且父類的該實(shí)例變量在子類仍然可見,在子類中要訪問父類聲明的實(shí)例變量需要在父類實(shí)例變量前加super.,否則默認(rèn)訪問的是子類自己聲明的實(shí)例變量。
-
③ 如果父子類實(shí)例變量沒有重名,只要權(quán)限修飾符允許,在子類中完全可以直接訪問父類中聲明的實(shí)例變量,也可以用this.實(shí)例訪問,也可以用super.實(shí)例變量訪問。
?具體代碼:
class Father{
int a = 10;
int b = 11;
}
class Son extends Father{
int a = 20;
public void test(){
//子類與父類的屬性同名,子類對象中就有兩個a
System.out.println("子類的a:" + a);//20 先找局部變量找,沒有再從本類成員變量找
System.out.println("子類的a:" + this.a);//20 先從本類成員變量找
System.out.println("父類的a:" + super.a);//10 直接從父類成員變量找
//子類與父類的屬性不同名,是同一個b
System.out.println("b = " + b);//11 先找局部變量找,沒有再從本類成員變量找,沒有再從父類找
System.out.println("b = " + this.b);//11 先從本類成員變量找,沒有再從父類找
System.out.println("b = " + super.b);//11 直接從父類局部變量找
}
public void method(int a, int b){
//子類與父類的屬性同名,子類對象中就有兩個成員變量a,此時方法中還有一個局部變量a
System.out.println("局部變量的a:" + a);//30 先找局部變量
System.out.println("子類的a:" + this.a);//20 先從本類成員變量找
System.out.println("父類的a:" + super.a);//10 直接從父類成員變量找
System.out.println("b = " + b);//13 先找局部變量
System.out.println("b = " + this.b);//11 先從本類成員變量找
System.out.println("b = " + super.b);//11 直接從父類局部變量找
}
}
class Test{
public static void main(String[] args){
Son son = new Son();
son.test();
son.method(30,13);
}
}
總結(jié):
-
變量前面沒有super.和this.
-
在構(gòu)造器、代碼塊、方法中如果出現(xiàn)使用某個變量,先查看是否是——當(dāng)前塊——聲明的 局部變量 ,
-
如果不是局部變量,先從當(dāng)前執(zhí)行代碼的? 本類去找成員變量?
-
如果從當(dāng)前執(zhí)行代碼的本類中沒有找到,會往上找——父類聲明的成員變量 (權(quán)限修飾符允許在子類中訪問的)
-
-
變量前面有this.
-
通過this找成員變量時,先從當(dāng)前執(zhí)行代碼的——本類去找成員變量?
-
如果從當(dāng)前執(zhí)行代碼的本類中沒有找到,會往上找——父類聲明的成員變量(權(quán)限修飾符允許在子類中訪問的)
-
-
變量前面super.
-
通過super找成員變量,直接從當(dāng)前執(zhí)行代碼的直接父類去找成員變量(權(quán)限修飾符允許在子類中訪問的)
-
如果直接父類沒有,就去父類的父類中找(權(quán)限修飾符允許在子類中訪問的)
-
?⒉?解決成員方法重寫后調(diào)用問題
?具體做法:
-
如果子類沒有重寫父類的方法,只有權(quán)限修飾符運(yùn)行,在子類中完全可以直接調(diào)用父類的方法;
-
如果子類重寫了父類的方法,在子類中需要通過super.才能調(diào)用父類被重寫的方法,否則默認(rèn)調(diào)用的子類重寫的方法? ?
??具體代碼:
class Father{
int a = 10;
int b = 11;
public int getA() {
return a;
}
}
class Son extends Father{
int a = 20;
public int getA() {
return a;
}
public void test(){
System.out.println(getA());//10 本類沒有找父類,執(zhí)行父類中的getNum()
System.out.println(this.getA());//10 本類沒有找父類,執(zhí)行父類中的getNum()
System.out.println(super.getA());//10 本類沒有找父類,執(zhí)行父類中的getNum()
}
}
class Test{
public static void main(String[] args){
Son son = new Son();
son.test();
/* 20
20
10 */
}
}
總結(jié):
-
方法前面沒有super.和this.
-
先從子類找匹配方法,如果沒有,再從直接父類找,再沒有,繼續(xù)往上追溯
-
-
方法前面有this.
-
先從子類找匹配方法,如果沒有,再從直接父類找,再沒有,繼續(xù)往上追溯
-
-
方法前面有super.
-
從當(dāng)前子類的直接父類找,如果沒有,繼續(xù)往上追溯
-
(二)final關(guān)鍵字?
? ? final(最終的,不可更改的 ),在java中final可修飾類(表示這個類不能被繼承,沒有子類 ),方法(表示這個方法不能被子類重寫 ),變量(final修飾某個變量(成員變量或局部變量),表示它的值就不能被修改,即常量,常量名建議使用大寫字母)。
? ? ?為什么用final關(guān)鍵字呢?:不想讓你繼承。
?具體代碼:
class Test {
public static void main(String[] args){
final int MIN_SCORE = 0;
final int MAX_SCORE = 100;
MyDate m1 = new MyDate();
System.out.println(m1.getInfo());
MyDate m2 = new MyDate(2022,2,14);
System.out.println(m2.getInfo());
}
}
final class MyDate{
//沒有set方法,必須有顯示賦值的代碼
private final int year;
private final int month;
private final int day;
public MyDate(){
year = 1970;
month = 1;
day = 1;
}
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
public String getInfo(){
return year + "年" + month + "月" + day + "日";
}
}
//public class CC extends MyDate{} Cannot inherit from final 'MyDate'
(三)native關(guān)鍵字
①定義:
? ? ? native(本地的),在Java中native只能修飾方法,表示這個方法的方法體代碼不是用Java語言實(shí)現(xiàn)的,而是由C/C++語言編寫的。但是對于Java程序員來說,可以當(dāng)做Java的方法一樣去正常調(diào)用它,或者子類重寫它。
??
②用途:
它只能用在一個地方,方法的返回值類型前面,作為方法的一個修飾符。
③作用:
用它修飾方法,在.java中看不到這個方法的方法體。
④語法形式:
【修飾符】 class 類名{
? ?【權(quán)限修飾符】 native 返回值類型 方法名 (【形參列表】);文章來源:http://www.zghlxwxcb.cn/news/detail-406479.html
}文章來源地址http://www.zghlxwxcb.cn/news/detail-406479.html
class Test {
public static void main(String[] args){
Test t=new Test();
System.out.println(t.hashCode());//同時按Ctrl+點(diǎn)擊hashCode ->查看hashCode的源碼
}
}
到了這里,關(guān)于Java ---一些關(guān)鍵字的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!