一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 小議Java中final關(guān)鍵字使用時(shí)的注意點(diǎn)

小議Java中final關(guān)鍵字使用時(shí)的注意點(diǎn)

2020-05-17 12:26zeyu203 JAVA教程

final關(guān)鍵字代表著最后、不可改變,無論是在用final修飾類、修飾方法還是修飾變量時(shí),都要注意內(nèi)存分配的問題.這里來小議Java中final關(guān)鍵字使用時(shí)的注意點(diǎn):

final
final 類不能被繼承,同時(shí),一旦用 final 修飾了類,也就意味著 final 類中的所有方法都被隱式地指定為 final 方法

final 方法
在類繼承的過程中,對(duì)于父類中的 final 方法,子類不能修改和覆蓋。
private 方法都被隱式指定為 final 方法。
有兩個(gè)原因使用 final 方法:

  • 鎖定方法,防止被子類修改其含義
  • 在早期的 java 實(shí)現(xiàn)版本中,final 方法被實(shí)現(xiàn)為內(nèi)嵌調(diào)用,可以提升性能

final 變量
final 關(guān)鍵字用來修飾變量是最常用的用法,如果修飾成員變量,則必須在定義時(shí)或者構(gòu)造方法中初始化,且一經(jīng)初始化此后不能再進(jìn)行任何賦值。
針對(duì)基本類型和類對(duì)象有著不同的含義:

  • 對(duì)于基本類型,final 變量一經(jīng)初始化,此后不能再改變?cè)撟兞康闹?/li>
  • 對(duì)于類對(duì)象,已經(jīng)初始化后,不能讓這個(gè)變量再指向另一個(gè)對(duì)象,但他指向的對(duì)象的內(nèi)容是可以改變的

static final 域稱為編譯期常量,一般全部大寫。

示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Glyph {
 void draw() {
  System.out.println("Glyph.draw()");
 }
 Glyph() {
  System.out.println("Glyph() before draw()");
  draw();
  System.out.println("Glyph() after draw()");
 }
}
class RoundGlyph extends Glyph {
 private int redius = 1;
 RoundGlyph(int r) {
  radius = r;
  System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
 }
 void draw() {
  System.out.println("RoundGlyph.draw(), radius = " + radius);
 }
}
public class RolyConstructors {
 public static void main(String[] args) {
  new RoundGlyph(5);
 }
}

輸出結(jié)果:

?
1
2
3
4
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

上面的代碼展示了類初始化過程以及隱藏的災(zāi)難性問題。
main 函數(shù)中以參數(shù) 5 調(diào)用 RoundGlyph 的構(gòu)造函數(shù)創(chuàng)建了 RoundGlyph 對(duì)象,在 RoundGlyph 構(gòu)造方法執(zhí)行前調(diào)用了其父類 Glyph 的構(gòu)造方法。
然而,在父類 Glyph 的構(gòu)造方法中調(diào)用了 draw 方法,由于多態(tài)性,此時(shí)實(shí)際上調(diào)用了子類的 draw 方法,然而子類的 redius 此時(shí)還沒有通過構(gòu)造器初始化,因此輸出了:

?
1
RoundGlyph.draw(), radius = 0

這顯然不是我們想要的結(jié)果,因此需要注意:

  • 用盡可能簡(jiǎn)單的方法初始化類成員
  • 在構(gòu)造器中最好只調(diào)用 final 方法

第二條的原因是 final 不會(huì)應(yīng)用多態(tài)性,因此可以保證調(diào)用的是當(dāng)前對(duì)象的相應(yīng)方法,而不是初始化工作還沒有進(jìn)行的子類的覆蓋方法。

總結(jié)final的內(nèi)存分配方式:
1.修飾變量:

通常情況下,final變量有3個(gè)地方可以賦值:直接賦值,構(gòu)造函數(shù)中,或是初始化塊中。
(1)初始化:
由于在java的語法中,聲明和初始化是聯(lián)系在一起的,
也就是說:如果你不顯示的初始化一個(gè)變量,系統(tǒng)會(huì)自動(dòng)用一個(gè)默認(rèn)值來對(duì)其進(jìn)行初始化。(如int就是0)
對(duì)于final變量,在聲明時(shí),如果你沒有賦值,系統(tǒng)默認(rèn)這是一個(gè)空白域,在構(gòu)造函數(shù)進(jìn)行初始化,
如果是靜態(tài)的,則可以在初始化塊。
(2)內(nèi)存:
常量(final變量)和非final變量的處理方式是不一樣的。
每一個(gè)類型在用到一個(gè)常量時(shí),都會(huì)復(fù)制一份到自己的常量池中。
常量也像類變量(static)一樣保存在方法區(qū),只不過他保存在常量池。
(可能是,類變量被所有實(shí)例共享,而常量池是每個(gè)實(shí)例獨(dú)有的。)
2.修飾方法:
保存在方法區(qū),并且可以被函數(shù)代碼直接替換,而不用等到執(zhí)行時(shí)再?zèng)Q定具體是那個(gè)函數(shù)。
3.修飾類:
保存在方法區(qū)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本xxxxn1819 | 国产精品极品美女自在线 | 日朝欧美亚洲精品 | 爽好舒服宝贝添奶吻戏 | 美女扒开腿让男生桶爽漫画 | 摄像头东北对白清晰 | 国产成人小视频在线观看 | 成人毛片高清视频观看 | 欧美18-19 | 99久久精品免费看国产 | 秋霞啪啪片 | 久久综合给会久久狠狠狠 | 日本色淫| 免费看美女被靠到爽 | 日本大学jalapsiki | 体检小说 | 天堂俺去俺来也www久久婷婷 | 国产成+人+综合+亚洲欧美丁香花 | 国产精品拍拍拍福利在线观看 | 久久精品成人免费看 | 惩罚美女妲己的尤老师 | 手机在线观看网站免费视频 | 奇米成人 | 免费在线观看a | futa百合高肉全h | 午夜私人福利影院 | 幸福草电视剧演员表介绍 | 按摩院已婚妇女中文字幕 | 3黑人巨大vs北岛玲 3d肉浦团在线观看 3d动漫免费 | 黄网国产 | 日韩在线二区全免费 | 男女激情网 | 羞羞视频免费观 | 女人和男人搞鸡 | 欧美日韩一区二区综合在线视频 | 秋霞一级毛片 | 免费观看伦理片 | 果冻传媒新在线观看免费 | oneday高清在线观看 | 免费国产好深啊好涨好硬视频 | 情趣内衣情趣玩具play |