Java關(guān)鍵字詳解之final static this super的用法
final,static,this,super 關(guān)鍵字總結(jié)
正文開始@Assassin
1. final 關(guān)鍵字:
final
關(guān)鍵字,意思是最終的、不可改變的,初始化之后就不能再次修改 ,用來修飾類、方法和變量,具有以下特點(diǎn):
final
修飾的類不能被繼承,final
類中的所有成員方法都會被隱式的指定為 final 方法;final
修飾的方法不能被重寫;final
修飾的變量是常量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能讓其指向另一個對象;
final的使用場景:使用 final 方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的 Java 實(shí)現(xiàn)版本中,會將 final 方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升(現(xiàn)在的 Java 版本已經(jīng)不需要使用 final 方法進(jìn)行這些優(yōu)化了)。類中所有的 private 方法都隱式地指定為 final。
2. static 關(guān)鍵字:
static
關(guān)鍵字主要有以下四種使用場景:
- 修飾成員變量和成員方法: 被
static
修飾的成員屬于類,不屬于單個這個類的某個對象,也就是說被類中所有對象共享,可以并且建議通過類名調(diào)用(創(chuàng)建對象來調(diào)用也不報(bào)錯,不建議 )。被static
聲明的成員變量屬于靜態(tài)成員變量,靜態(tài)變量 存放在Java
內(nèi)存區(qū)域的方法區(qū)。調(diào)用格式:類名.靜態(tài)變量名
,類名.靜態(tài)方法名()
- 靜態(tài)代碼塊: 靜態(tài)代碼塊定義在類中方法外, 靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)。 該類不管創(chuàng)建多少對象,靜態(tài)代碼塊只執(zhí)行一次;
- 靜態(tài)內(nèi)部類(static 修飾類的話只能修飾內(nèi)部類): 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個最大的區(qū)別: 非靜態(tài)內(nèi)部類在編譯完成之后會隱含地保存著一個引用,該引用是指向創(chuàng)建它的外圍類,但是靜態(tài)內(nèi)部類卻沒有。沒有這個引用就意味著:1. 它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建。2. 它不能使用任何外圍類的非 static 成員變量和方法。
- 靜態(tài)導(dǎo)包(用來導(dǎo)入類中的靜態(tài)資源,1.5 之后的新特性): 格式為:
import
,static
這兩個關(guān)鍵字連用可以指定導(dǎo)入某個類中的指定靜態(tài)資源,并且不需要使用類名調(diào)用類中靜態(tài)成員,可以直接使用類中靜態(tài)成員變量和成員方法。
3. this 關(guān)鍵字:
this
是自身的一個對象的引用,可以簡單地理解為代表對象本身,(本質(zhì)上this是一個變量,存儲的是當(dāng)前對象的地址)。站在內(nèi)存的角度,也就是說:this
是指向?qū)ο蟊旧淼囊粋€指針。
this 的用法在 Java 中大體可以分為3種:
- 普通的直接引用
this是當(dāng)前對象的一個引用,相當(dāng)于是指向當(dāng)前對象本身。
- 形參與成員名字重名,用 this 來區(qū)分:
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)); } }
運(yùn)行結(jié)果:
可以看到,這里 age 是 getAge 成員方法的形參,this.age 是 Person 類的成員變量。
- 引用構(gòu)造函數(shù)
下面與super
一起講,this
跟super
很像,都是對象的引用;
4. super 關(guān)鍵字:
super
可以理解為是指向自己父(超/基)類對象的一個指針,指向的是離自己最近的一個父類。
super 也有三種用法:
- 普通的直接引用
與this
類似,super
相當(dāng)于是指向當(dāng)前對象的父類,這樣就可以用 super.xxx
來引用父類的成員。
- 子類中的成員變量或方法與父類中的成員變量或方法同名
實(shí)例:
package com.test; class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //調(diào)用父類的方法 System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }
運(yùn)行結(jié)果:
可以看到,這里既調(diào)用了父類的方法,也調(diào)用了父類的變量。若不調(diào)用父類方法 value()
,只調(diào)用父類變量 name
的話,則父類 name
值為默認(rèn)值 null
。
- 引用構(gòu)造函數(shù)
super(參數(shù))
:調(diào)用父類中的某一個構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)。
this(參數(shù))
:調(diào)用本類中另一種形式的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)。
使用 this 和 super 要注意的問題:
- 在構(gòu)造器中使用
super()
調(diào)用父類中的其他構(gòu)造方法時(shí),該語句必須處于構(gòu)造器的首行,否則編譯器會報(bào)錯。另外,this
調(diào)用本類中的其他構(gòu)造方法時(shí),也要放在首行。-this
、super
不能用在static
方法中。
簡單解釋一下:
被 static
修飾的成員屬于類,不屬于單個這個類的某個對象,被類中所有對象共享。而 this
代表對本類對象的引用,指向本類對象;而 super
代表對父類對象的引用,指向父類對象;所以, this
和 super
是屬于對象范疇的東西,而靜態(tài)方法是屬于類范疇的東西。
到此這篇關(guān)于Java關(guān)鍵字詳解之final static this super的用法的文章就介紹到這了,更多相關(guān)Java final 用法 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 舉例講解Java編程中this關(guān)鍵字與super關(guān)鍵字的用法
- java中this與super關(guān)鍵字的使用方法
- 關(guān)于java關(guān)鍵字this和super的區(qū)別和理解
- Java關(guān)鍵字this與super詳解用法
- Java中super和this關(guān)鍵字詳解
- 談?wù)凧ava中對象,類和this,super,static關(guān)鍵字的使用
- Java中this和super關(guān)鍵字的使用詳解
- Java中的this、super、final關(guān)鍵字詳解
- JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解
相關(guān)文章
idea打開運(yùn)行配置java?web項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于idea打開運(yùn)行配置java?web項(xiàng)目的相關(guān)資料,有些時(shí)候我們用IDEA跑之前用eclipse中運(yùn)行的項(xiàng)目的時(shí)候,總是不止所措,要不就是只展示html,要不就是不能部署成功,需要的朋友可以參考下2023-08-08SpringBoot使用Redis Stream實(shí)現(xiàn)輕量消息隊(duì)列的示例代碼
Redis Stream 是 Redis 5.0 引入的一種數(shù)據(jù)結(jié)構(gòu),用于處理日志類型的數(shù)據(jù),它提供了高效、可靠的方式來處理和存儲時(shí)間序列數(shù)據(jù),如事件、消息等,本文介紹了SpringBoot使用Redis Stream實(shí)現(xiàn)輕量消息隊(duì)列,需要的朋友可以參考下2024-08-08springboot整合Mybatis-plus的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式詳解
這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02Springboot Mybatis-Plus數(shù)據(jù)庫單元測試實(shí)戰(zhàn)(三種方式)
這篇文章主要介紹了Springboot Mybatis-Plus數(shù)據(jù)庫單元測試實(shí)戰(zhàn)(三種方式),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12springboot下mybatis-plus如何打印sql日志和參數(shù)到日志文件
本文主要介紹了springboot下mybatis-plus如何打印sql日志和參數(shù)到日志文件,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03SpringBoot使用prometheus監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03關(guān)于springboot集成swagger及knife4j的增強(qiáng)問題
這篇文章主要介紹了springboot集成swagger以及knife4j的增強(qiáng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03