static和final,今天的文章要說的就是訪問控制中的這兩個關鍵字

2020-12-17 小裕老師愛編程

昨天的一篇文章介紹了訪問控制中的訪問修飾符以及它們的訪問權限。下面這篇文章我們介紹訪問控制中的第二部分static和final關鍵字。

static關鍵字

static修飾成員變量

用static修飾的成員變量不屬於對象的數據結構,static變量是屬於類的變量,通常可以通過類名來引用static成員。Static成員變量和類的信息一起存儲在方法區而不是在堆中,一個類的static成員變量只有「一份」,無論該類創建了多少對象。

Static修飾方法

通常說的方法都會涉及到對具體對象的操作,這些方法在調用時,需要隱式的傳遞對象的引用(this)。

int d=p1.distance(p2);

調用distance方法時,除了傳遞p2參數外,還隱式的傳遞了p1作為參數,在方法中的this關鍵字即表示該參數

static修飾的方法則不需要針對某些對象進行操作,其運行結果僅僅與輸入的參數有關,調用時直接用類名引用。

double c=Math.sqrt(3.0*3.0+4.0*4.0);

該方法在調用時,沒有隱式的傳遞對象引用,因此在static方法中不可以使用this關鍵字。

由於static在調用時沒有具體的對象,因此在static方法中不能對非static成員(對象成員)進行訪問。Static方法的作用在於提供一些「工具方法」和「工廠方法」等。

... ... ...

Point.distance(Point p1,Point p2)

RandomUtils.nextInt()

StringUntils.leftPad(String str,int size,char padChar)

... ... ...

Math.sqrt() Math.sin() Arrays.sort()

static塊

static塊屬於類的代碼塊,在類加載期間執行的代碼塊,只執行一次,可以用來在軟體中加載靜態資源。

final關鍵字

final修飾變量

final關鍵字修飾成員變量,意為不可改變。final修飾成員變量有以下兩種方式初始化:聲明的同時初始化;構造函數中初始化。final關鍵字也可以修飾局部變量,使用之前初始化即可。

public class Emp{

private final int no=100;//final變量聲明時初始化

public void testFinal(){

no=99;

}//編譯錯誤,final的變量不可以改變

}

final修飾方法和類

final關鍵字修飾的方法不可以被重寫,使一個方法不能被重寫的意義在於:防止子類在定義新方法時造成「不經意」重寫

final關鍵字修飾的類不可以被繼承。

final class Foo{ } class Goo extends Foo{ } //編譯錯誤

JDK中有一些基礎類庫被定義為final的,例如:String、Math、Integer、Double等等。是一個類不能被繼承的意義在於:可以保護類不被繼承修改,可以控制濫用繼承對系統造成的危害。

static final常量

static final修飾的成員變量稱為常量,必須聲明的同時初始化,不可被改變。

static final常量會在編譯器被替換。如圖

這樣我們通過兩篇文章把訪問控制的知識點全部說完了。說白了訪問控制就是一個封裝的概念。在這裡面我們介紹了7個英文單詞的使用,分別為package、public、private、default、protected以及今天介紹到的static和final。大家可以結合最近的這兩篇文章把訪問控制的相關知識點梳理一下。

知識無限,能力有限。小編在文章編輯過程中難免出現不盡人意的地方,歡迎大家批評指正,小編也將不斷積累完善自己,讓我們共同進步。

相關焦點

  • final 關鍵字的使用
    相信很多人還不知道final關鍵字的使用吧,那就和我一起看看吧1,final關鍵字修飾類Java中的關鍵字被修飾後不能被繼承package chap;final class Animal{}class Dog extends
  • 一篇文章帶你弄懂Final關鍵字的相關知識
    2.final關鍵字修飾類、修飾方法、修飾變量的特點final關鍵字修飾類:不能被別的類繼承;final關鍵字修飾方法:方法也不能被覆蓋,也就是方法不能被繼承的子類重寫;final關鍵字修飾變量:成員變量、局部變量是常量,僅一次賦值。
  • Java之final關鍵字的簡單介紹中
    各位小夥伴,大家好,在之前的文章小編有介紹過關鍵字fina修飾類和成員方法Java之final關鍵字的簡單介紹上。這次,小編要介紹的是關鍵字final修飾局部變量。代碼如下:public class Demo01Final {public static void main(String[] args) {int num1=11;System.out.println(num1);num1=12;//變量可以改變Java之成員變量和局部變量的區別System.out.println(num1);//一旦使用final來修飾變量,這個變量就不能進行改變
  • 一文解析Java常用關鍵字
    這是因為,方法是否被final修飾與方法的訪問權限是兩回事,沒有任何關係,被final修飾的方法和未被final修飾的方法都可以自由的指定訪問權限。 我們有興趣去談論final關鍵字和訪問權限關鍵字在修飾方法的過程的起到的作用, 如下表(聲明:final和訪問權限是兩個獨立的概念,沒有任何比較意義,所有本表僅方便讀者理解,不可作為正統知識) : 小結 private 從表中可以看到,protect修飾的方法在子類中可見,所有可以被子類繼承
  • Java面向對象之final、abstract抽象、和變量生命周期
    那麼什麼樣的情況下方法需要使用final修飾呢?在父類中提供了統一的算法骨架,不允許子類通過方法覆蓋來修改其實現細節, 此時使用final修飾。比如在模板方法設計模式中。在構造器中調用的方法(初始化方法),此時一般使用final修飾。這也是構造器不能被繼承的原因。
  • C++中的static
    C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。
  • Java初學者系列:一文讀懂final關鍵字
    #程式設計師之前文章中我們學習了一些java中的關鍵字,通過這些關鍵字可以幫助我們定義類、實例、方法的可見性,今天我們一起來學習java中的final關鍵字,這個關鍵字同樣可以用來修飾類、實例、方法、參數等。
  • final關鍵字要掌握的知識點
    Java裡final關鍵字,老生常談的幾個點很多人都應該知道,你不遵循下面的定義,編譯器都會報錯不給通過。final域的重排序規則對於final域,編譯器和處理器要遵守兩個重排序規則。在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作不能重排序初次讀一個包含final域的對象的引用,與隨後初次讀這個final,這兩個操作不能重排序
  • Java之final關鍵字的簡單介紹上
    各位小夥伴們大家好,這次小編要介紹的是final關鍵字,首先我們來了解一下final關鍵字的含義,final關鍵字代表最終,不可改變的。其次,小編簡單介紹一下final關鍵字的用法:1.可以用來修飾一個類2可以用來修飾一個方法3.可以用來修飾一個成員變量4.可以用來修飾一個局部變量這次小編要介紹的是,final關鍵字用來修飾一個類和方法。
  • Java之final關鍵字的簡單介紹下
    各位小夥伴大家好,在之前的文章中,小編有介紹過,final關鍵字修飾局部變量Java之final關鍵字的簡單介紹中,支持小編要介紹的是final關鍵字修飾成員變量Java之成員變量和局部變量的區別。final關鍵字修飾成員變量:對於成員變量來說,如果使用final關鍵字,那麼這個變量是不可變。1.由於成員變量具有默認值,所以用了final之後必須手動賦值,不會給默認值了。2.對於final修飾的成員變量,要麼使用直接賦值,要麼通過構造方法Java之構造方法與this關鍵字的簡單介紹賦值,二者選其一3.必須保證類當中所有重載的構造方法,都最終會對final的成員變量進行賦值。
  • java關鍵字——final
    1.final修飾類final類表示最終的類,言外之意就是不能有其他類繼承這個final類,所以在做開發時如果自己寫的類不能有繼承,那麼就用final修飾;注意點:final類中的變量可以根據需要設為final,但是final類中的所有方法都會被隱式地指定為final方法2.final變量final變量表示最終的變量,言外之意就是這個變量為常量
  • Java之final關鍵字詳解
    前言針對Java語言中的final關鍵字,想必都不陌生了。本來主要是來對final做關鍵字做一個總結。final關鍵字用法修飾類當用final去修飾一個類的時候,表示這個類不能被繼承。注意:a.被final修飾的類,final類中的成員變量可以根據自己的實際需要設計為fianl。b. final類中的成員方法都會被隱式的指定為final方法。說明:在自己設計一個類的時候,要想好這個類將來是否會被繼承,如果可以被繼承,則該類不能使用fianl修飾,在這裡呢,一般來說工具類我們往往都會設計成為一個fianl類。在JDK中,被設計為final類的有String、System等。
  • 編譯器說 Lambda 表達式中的變量必須是 final 的,我偏不信 | 原力計劃
    ,它會警告我們說:「variable used in lambda expression should be final or effectively final」。大致的意思就是說,Lambda 表達式中要用到的,但又未在 Lambda 表達式中聲明的變量,必須聲明為 final 或者是 effectively final,否則就會出現編譯錯誤。關於 final 和 effectively final 的區別,可能有些小夥伴不太清楚,這裡多說兩句。
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • 你知道final,finally,finalize 三者的區別嗎?
    final:     final是一個修飾符    當final修飾一個變量的時候,變量變成一個常量,它不能被二次賦值
  • Java 中的繼承和多態(深入版)
    在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?本文系基礎,深入淺出過一遍 Java 中的多態和繼承。
  • Java 中的語法糖,真甜.
    枚舉我們在日常開發中經常會使用到 enum 和 public static final ... 這類語法。那麼什麼時候用 enum 或者是 public static final 這類常量呢?好像都可以。但是在 Java 字節碼結構中,並沒有枚舉類型。枚舉只是一個語法糖,在編譯完成後就會被編譯成一個普通的類,也是用 Class 修飾。
  • 扯一下final、權限、內部類、引用類型
    final關鍵字學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。那麼我們能不能隨意地繼承API中提供的類,改寫其內容呢?顯然這是不合適的。為了避免這種隨意改寫的情況,Java提供了 final 關鍵字,用於修飾不可改變內容。
  • Java基礎學習:java中整數類型變量
    在Java程序運行過程中,值可以發生改變的,我們稱之為變量,值不能改變的,我們稱之為常量。 Java中有三種變量類型,我們先敲一下,然後比這下圖挨個來看,