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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - JAVA教程 - 小議Java中final關鍵字使用時的注意點

小議Java中final關鍵字使用時的注意點

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

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

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

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

  • 鎖定方法,防止被子類修改其含義
  • 在早期的 java 實現版本中,final 方法被實現為內嵌調用,可以提升性能

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

  • 對于基本類型,final 變量一經初始化,此后不能再改變該變量的值
  • 對于類對象,已經初始化后,不能讓這個變量再指向另一個對象,但他指向的對象的內容是可以改變的

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);
 }
}

輸出結果:

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

上面的代碼展示了類初始化過程以及隱藏的災難性問題。
main 函數中以參數 5 調用 RoundGlyph 的構造函數創建了 RoundGlyph 對象,在 RoundGlyph 構造方法執行前調用了其父類 Glyph 的構造方法。
然而,在父類 Glyph 的構造方法中調用了 draw 方法,由于多態性,此時實際上調用了子類的 draw 方法,然而子類的 redius 此時還沒有通過構造器初始化,因此輸出了:

?
1
RoundGlyph.draw(), radius = 0

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

  • 用盡可能簡單的方法初始化類成員
  • 在構造器中最好只調用 final 方法

第二條的原因是 final 不會應用多態性,因此可以保證調用的是當前對象的相應方法,而不是初始化工作還沒有進行的子類的覆蓋方法。

總結final的內存分配方式:
1.修飾變量:

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲人成在线观看一区二区 | 精品一区二区免费视频蜜桃网 | 国产高清在线精品一区二区三区 | 热99这里有精品综合久久 | 日韩国产成人 | 天美蜜桃精东乌鸦传媒 | 美女光屁股网站 | 男人猛进女人屁股免费 | 国产亚洲福利一区二区免费看 | 国产精品日韩欧美一区二区三区 | 毛片a级放荡的护士hd | 2020年最新国产精品视频免费 | 操人网 | 欧美四级无删版影片 | 日本欧美大码a在线视频播放 | 被巨大黑人的翻白眼 | 视频在线观看一区二区三区 | 美女扒开腿让男生桶爽漫画 | 俄罗斯性高清完整版 | 国产麻豆精品视频 | 日本javhd| 国产成人影院 | 亚洲第一页综合 | 成人性生交小说免费看 | 精品9e精品视频在线观看 | 久久99亚洲热最新地址获取 | 国产精品酒店视频免费看 | 美女裆部 | 体检小说 | 亚洲天堂成人在线观看 | 四虎国产欧美成人影院 | 国产欧美日韩视频在线观看一区二区 | 麻豆网站在线观看 | 国产网站免费看 | 国产理论片在线观看 | 免费370理论片中文字幕 | 久久电影午夜 | 美女被扣逼 | 精品牛牛影视久久精品 | 成人看片免费无限观看视频 | 日本三级欧美三级人妇英文 |