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

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

昨天的一篇文章介紹了訪問控制中的訪問修飾符以及它們的訪問權限。下面這篇文章我們介紹訪問控制中的第二部分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。大家可以結合最近的這兩篇文章把訪問控制的相關知識點梳理一下。

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

相關焦點

  • java中static, final, 內部類的具體運用
    static概念:static它是靜態修飾符,一般用來修飾類中的成員。當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。static特點:static是靜態修飾符,一般修飾成員。被static修飾的成員屬於類,不屬於單個這個類的某個對象。
  • final 關鍵字的使用
    相信很多人還不知道final關鍵字的使用吧,那就和我一起看看吧1,final關鍵字修飾類Java中的關鍵字被修飾後不能被繼承package chap;final class Animal{}class Dog extends
  • 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 關鍵詞的使用
    上一篇文章我們講了 java 中 static 關鍵字的使用,這裡再將一下 final 關鍵字的使用。final 在 java 中可以看做一個「終結者」,它可以定義類、定義方法和定義變量。哎呀,好像沒別的可說了,就這樣吧,這可能是我寫過的字數最少的一篇文章了 算了,最後加一個示例程序吧,當然是錯誤的程序,包含了以上三種使用方法的錯誤使用報錯信息:package com.example.finalDemo;/** * User: sunriseydy * 2018-4-25 22:04 */finalclassPerson{String name
  • Java面向對象之final、abstract抽象、和變量生命周期
    那麼什麼樣的情況下方法需要使用final修飾呢?在父類中提供了統一的算法骨架,不允許子類通過方法覆蓋來修改其實現細節, 此時使用final修飾。比如在模板方法設計模式中。在構造器中調用的方法(初始化方法),此時一般使用final修飾。這也是構造器不能被繼承的原因。
  • C++中的static
    前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。    一、面向過程設計中的static   1、靜態全局變量   在全局變量前,加上關鍵字static,該變量就被定義成為一個靜態全局變量。
  • Java初學者系列:一文讀懂final關鍵字
    #程式設計師之前文章中我們學習了一些java中的關鍵字,通過這些關鍵字可以幫助我們定義類、實例、方法的可見性,今天我們一起來學習java中的final關鍵字,這個關鍵字同樣可以用來修飾類、實例、方法、參數等。
  • final關鍵字要掌握的知識點
    Java裡final關鍵字,老生常談的幾個點很多人都應該知道,你不遵循下面的定義,編譯器都會報錯不給通過。final域的重排序規則對於final域,編譯器和處理器要遵守兩個重排序規則。在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作不能重排序初次讀一個包含final域的對象的引用,與隨後初次讀這個final,這兩個操作不能重排序
  • Java之final關鍵字的簡單介紹下
    各位小夥伴大家好,在之前的文章中,小編有介紹過,final關鍵字修飾局部變量Java之final關鍵字的簡單介紹中,支持小編要介紹的是final關鍵字修飾成員變量Java之成員變量和局部變量的區別。final關鍵字修飾成員變量:對於成員變量來說,如果使用final關鍵字,那麼這個變量是不可變。1.由於成員變量具有默認值,所以用了final之後必須手動賦值,不會給默認值了。2.對於final修飾的成員變量,要麼使用直接賦值,要麼通過構造方法Java之構造方法與this關鍵字的簡單介紹賦值,二者選其一3.必須保證類當中所有重載的構造方法,都最終會對final的成員變量進行賦值。
  • Java類的設計和封裝及類成員的訪問控制
    5.類的修飾符分成三種訪問修飾符、類屬性修飾符、抽象具體修飾符。  訪問修飾符:public、protected、private、default。沒有寫的話系統默認是default。  類屬性修飾符:static。  抽象具體修飾符:abstract、final。
  • Java中枚舉的線程安全性及序列化問題
    Java SE5提供了一種新的類型-Java的枚舉類型,關鍵字enum可以將一組具名的值的有限集合創建為一種新的類型,而這些具名的值可以作為常規的程序組件使用,這是一種非常有用的功能。本文將深入分析枚舉的源碼,看一看枚舉是怎麼實現的,他是如何保證線程安全的,以及為什麼用枚舉實現的單例是最好的方式。要想看源碼,首先得有一個類吧,那麼枚舉類型到底是什麼類呢?是enum嗎?
  • 深入理解final
    這類常量必須是級基本數據類型,並且以final表示,定義時必須賦值。一個既是static又是final的域只佔據一段不能改變的存儲空間。注意,當對象是引用時,其含義就會有一些迷。因為對於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等。
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • 一步帶您了解C語言中的「register」關鍵字
    寄存器比內存訪問要快,因此可以使用register關鍵字將C程序中最常用的變量放入寄存器中。關鍵字register會向編譯器提示可以將給定變量放入寄存器中。編譯器可以選擇是否將其保存在寄存器中。通常,編譯器自己進行優化,然後將變量放入寄存器中。
  • C/C++中常用的編程關鍵字
    20. export為了訪問其他編譯單元(如另一代碼文件)中的變量或對象,對普通類型(包括基本數據類、結構和類),可以利用關鍵字 extern,來使用這些變量或對象時;但是對模板類型,則必須在定義這些模板類對象和模板函數時,使用標準 C++ 新增加的關鍵字 export(導出)。