java的final也并不是那么高冷
這天,final走過來和static說:我喜歡你咱來咱倆在一起吧.
一向安靜的static一下子懵了,他眼前的final一向很高冷,今天怎么。。。。
于是static說:讓我再想想行嗎(因為現在的static還不是很了解final)
目錄:
1.修飾類
2.修飾方法
3.修飾變量
4.final變量和普通變量的區別
5.關于final static的用法
1.修飾類
當一個類被final修飾的時候就被稱為最終類
最終類的特點是不能再被繼承
2.修飾方法
final修飾的方法不能被重寫
但是能被子類訪問(前提是訪問修飾符不是private)
3.修飾變量
(1)final修飾變量的特點
不管是修飾基本數據類型的變量還是修飾引用數據類型的變量,則對其初始化后就不能再更改
不過這里有一點要注意雖然指定的對象不可以改變但是對象里邊的內容確是可以改變的
如圖:
·
運行結果:
(2)final修飾成員變量
如果定義一個帶final的成員變量那么必須在定義的時候就初始化或者在構造方法里邊初始化(同樣的初始化后不能更改)
(2)final修飾局部變量
當final修飾局部變量的時候只要使用的時候初始化就行了
4.final變量和普通變量的區別
先來一段代碼:
不知道博主在搞什么花里胡哨的,mmp
這時候博主曬出了答案:
這么叼😶博主解釋解釋
其實博主也不會
垃圾博主走了走了
哎哎!別走啊,開玩笑的
這里就是final修飾的變量和普通變量的區別了,也就是當final修飾的基本數據類型或String類型如果在編譯期間就知道他的確切的值那么再用到這個變量的時候系統就會把他當成常量訪問(也叫編譯器的優化),有點類似C語言的宏替換
什么叫編譯期間就知道他的確定的值呢,就是一個由final定義的變量直接被賦值
比如:
編譯期間就知道確切的值又叫編譯的時候初始化
如果間接賦值那么編譯期間就不知到它的值也就不會把它當成常量
比如:
又叫運行時初始化、
再看看題
第1,2個false
兩個普通的字符串變量相加會建立一個新的對象由于== 比的是地址,所以二者肯定false,第二個其實在運行的時候jvm會把它當
成a+“world”==“helloworld”,由于里邊有普通的String變量所以也會創建一個新的對象
第三個true
可以這么理解,編譯器運行的時候由于”宏替換“就會把表達式變成c==“hello”+“world”,然后jvm在運行的時候會把兩者合起來
檢查常量池有沒有“helloworld”這個字符串,如果有的話就把這個常量池里邊的字符串和c進行比較,巧的是c恰好是這個字符串的引用所以就是true
為了更方便的理解編譯初始化和運行初始化我們看這段代碼:
package Demo;class FinalDemo {public final double i = Math.random();public static double t = Math.random(); }public class DemoDemo {public static void main(String[] args) {FinalDemo demo1 = new FinalDemo();FinalDemo demo2 = new FinalDemo();System.out.println("final修飾的 i=" + demo1.i);System.out.println("static修飾的 t=" + demo1.t);System.out.println("final修飾的 i=" + demo2.i);System.out.println("static修飾的 t=" + demo2.t);System.out.println("t+1= "+ ++demo2.t ); // System.out.println( ++demo2.i );//編譯失敗} } 運行結果:final修飾的 i=0.7282093281367935static修飾的 t=0.30720545678577604final修飾的 i=0.8106990945706758static修飾的 t=0.30720545678577604t+1= 1.307205456785776我已經聽到博友們的尖叫聲了:
博主來解釋解釋:
首先final修飾基本數據類型的變量時,則其數值一旦在初始化之后便不能更改。
是的,已經很明顯了,上面代碼中被final修飾的變量是在運行時才初始化的,并沒有在編譯期就被初始化!由于值為隨機數,運行時被初始化是不確定的一個值,也就是個隨機數,僅僅當運行之后被初始化之后==他的值才會不變!,所以它再次運行的時候就會又有一個隨機數
至于static修飾的變量沒有發生變化是因為static作用于成員變量只是用來表示==保存一份副本,其不會發生變化。怎么理解這個副本呢?其實static修飾的在類加載的時候就加載完成了(初始化)==,而且只會加載一次也就是說初始化一次,所以不會發生變化!
不懂static這里博主為自己的博客打一個廣告
靜態類詳細講解
1.關于final static
作用:
1、成員變量:屬于類的變量且只能賦值一次。
2、方法:屬于類的方法且不可以被重寫。
3、內部類:屬于外部類,且不能被繼承。
static了解到final是一個用情專一的男孩子,而且也很單純,于是static果斷把final約了出來對他說…
”我是偽娘“
博主:沒想到吧
“欸欸欸,博友們別拿雞蛋砸我,哎哎哎,別打我臉,我錯…”
博友:”兄弟們停,讓他說完“
博主:
博友:”往死里干”
。。。。。。。。。。
總結
以上是生活随笔為你收集整理的java的final也并不是那么高冷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细品java封装继承多态
- 下一篇: 深入java抽象类和接口