Java關鍵字詳解之final static this super的用法

final,static,this,super 關鍵字總結

正文開始@Assassin

1. final 關鍵字:

final 關鍵字,意思是最終的、不可改變的,初始化之後就不能再次修改 ,用來修飾類、方法和變量,具有以下特點:

  • final 修飾的類不能被繼承,final類中的所有成員方法都會被隱式的指定為 final 方法;
  • final 修飾的方法不能被重寫;
  • final 修飾的變量是常量,如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;如果是引用類型的變量,則在對其初始化之後便不能讓其指向另一個對象;

final的使用場景:使用 final 方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的 Java 實現版本中,會將 final 方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升(現在的 Java 版本已經不需要使用 final 方法進行這些優化瞭)。類中所有的 private 方法都隱式地指定為 final。

2. static 關鍵字:

static 關鍵字主要有以下四種使用場景:

  • 修飾成員變量和成員方法: 被static 修飾的成員屬於類,不屬於單個這個類的某個對象,也就是說被類中所有對象共享,可以並且建議通過類名調用(創建對象來調用也不報錯,不建議 )。被static聲明的成員變量屬於靜態成員變量,靜態變量 存放在 Java 內存區域的方法區。調用格式:類名.靜態變量名類名.靜態方法名()
  • 靜態代碼塊: 靜態代碼塊定義在類中方法外, 靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。 該類不管創建多少對象,靜態代碼塊隻執行一次;
  • 靜態內部類(static 修飾類的話隻能修飾內部類): 靜態內部類與非靜態內部類之間存在一個最大的區別: 非靜態內部類在編譯完成之後會隱含地保存著一個引用,該引用是指向創建它的外圍類,但是靜態內部類卻沒有。沒有這個引用就意味著:1. 它的創建是不需要依賴外圍類的創建。2. 它不能使用任何外圍類的非 static 成員變量和方法。
  • 靜態導包(用來導入類中的靜態資源,1.5 之後的新特性): 格式為:importstatic 這兩個關鍵字連用可以指定導入某個類中的指定靜態資源,並且不需要使用類名調用類中靜態成員,可以直接使用類中靜態成員變量和成員方法。

3. this 關鍵字:

this 是自身的一個對象的引用,可以簡單地理解為代表對象本身,(本質上this是一個變量,存儲的是當前對象的地址)。站在內存的角度,也就是說:this是指向對象本身的一個指針。

this 的用法在 Java 中大體可以分為3種:

  • 普通的直接引用

this是當前對象的一個引用,相當於是指向當前對象本身。

  • 形參與成員名字重名,用 this 來區分:
class Person {
    private int age = 10;
    public Person(){
    System.out.println("初始化年齡:"+age);
}
    public int getAge(int age){
        this.age = age;
        return this.age;
    }
}
 
public class TestDemo {
    public static void main(String[] args) {
        Person assassin = new Person();
        System.out.println("assassin's age is " + assassin .getAge(12));
    }
}

運行結果:

在這裡插入圖片描述

在這裡插入圖片描述

可以看到,這裡 age 是 getAge 成員方法的形參,this.age 是 Person 類的成員變量。

  • 引用構造函數

下面與super一起講,thissuper很像,都是對象的引用;

4. super 關鍵字:

super可以理解為是指向自己父(超/基)類對象的一個指針,指向的是離自己最近的一個父類。

super 也有三種用法:

  • 普通的直接引用

this 類似,super 相當於是指向當前對象的父類,這樣就可以用 super.xxx 來引用父類的成員。

  • 子類中的成員變量或方法與父類中的成員變量或方法同名

實例:

package com.test;

class Country {
    String name;
    void value() {
        name = "China";
    }
}
class City extends Country {
    String name;
    void value() {
        name = "Shanghai";
        super.value();      //調用父類的方法
        System.out.println(name);
        System.out.println(super.name);
    }
    public static void main(String[] args) {
        City c=new City();
        c.value();
    }
}

運行結果:

在這裡插入圖片描述

在這裡插入圖片描述

可以看到,這裡既調用瞭父類的方法,也調用瞭父類的變量。若不調用父類方法 value(),隻調用父類變量 name 的話,則父類 name 值為默認值 null

  • 引用構造函數

super(參數):調用父類中的某一個構造函數(應該為構造函數中的第一條語句)。
this(參數):調用本類中另一種形式的構造函數(應該為構造函數中的第一條語句)。

使用 this 和 super 要註意的問題:

  • 在構造器中使用 super() 調用父類中的其他構造方法時,該語句必須處於構造器的首行,否則編譯器會報錯。另外,this 調用本類中的其他構造方法時,也要放在首行。-thissuper不能用在static方法中。

簡單解釋一下:

static 修飾的成員屬於類,不屬於單個這個類的某個對象,被類中所有對象共享。而 this 代表對本類對象的引用,指向本類對象;而 super 代表對父類對象的引用,指向父類對象;所以, thissuper 是屬於對象范疇的東西,而靜態方法是屬於類范疇的東西。

到此這篇關於Java關鍵字詳解之final static this super的用法的文章就介紹到這瞭,更多相關Java final 用法 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: