程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 小議Java中final症結字應用時的留意點

小議Java中final症結字應用時的留意點

編輯:關於JAVA

小議Java中final症結字應用時的留意點。本站提示廣大學習愛好者:(小議Java中final症結字應用時的留意點)文章只能為提供參考,不一定能成為您想要的結果。以下是小議Java中final症結字應用時的留意點正文


final 類
final 類不克不及被繼續,同時,一旦用 final 潤飾了類,也就意味著 final 類中的一切辦法都被隱式地指定為 final 辦法

final 辦法
在類繼續的進程中,關於父類中的 final 辦法,子類不克不及修正和籠罩。
private 辦法都被隱式指定為 final 辦法。
有兩個緣由應用 final 辦法:

  • 鎖定辦法,避免被子類修正其寄義
  • 在晚期的 java 完成版本中,final 辦法被完成為內嵌挪用,可以晉升機能

final 變量
final 症結字用來潤飾變量是最經常使用的用法,假如潤飾成員變量,則必需在界說時或許結構辦法中初始化,且一經初始化爾後不克不及再停止任何賦值。
針對根本類型和類對象有著分歧的寄義:

  • 關於根本類型,final 變量一經初始化,爾後不克不及再轉變該變量的值
  • 關於類對象,曾經初始化後,不克不及讓這個變量再指向另外一個對象,但他指向的對象的內容是可以轉變的

static final 域稱為編譯期常量,普通全體年夜寫。

示例

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

輸入成果:

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

下面的代碼展現了類初始化進程和隱蔽的災害性成績。
main 函數中以參數 5 挪用 RoundGlyph 的結構函數創立了 RoundGlyph 對象,在 RoundGlyph 結構辦法履行前挪用了其父類 Glyph 的結構辦法。
但是,在父類 Glyph 的結構辦法中挪用了 draw 辦法,因為多態性,此時現實上挪用了子類的 draw 辦法,但是子類的 redius 此時還沒有經由過程結構器初始化,是以輸入了:

RoundGlyph.draw(), radius = 0

這明顯不是我們想要的成果,是以須要留意:

  • 用盡量簡略的辦法初始化類成員
  • 在結構器中最好只挪用 final 辦法

第二條的緣由是 final 不會運用多態性,是以可以包管挪用的是以後對象的響應辦法,而不是初始化任務還沒有停止的子類的籠罩辦法。

總結final的內存分派方法:
1.潤飾變量:
平日情形下,final變量有3個處所可以賦值:直接賦值,結構函數中,或是初始化塊中。
(1)初始化:
因為在java的語法中,聲明和初始化是接洽在一路的,
也就是說:假如你不顯示的初始化一個變量,體系會主動用一個默許值來對其停止初始化。(如int就是0)
關於final變量,在聲明時,假如你沒有賦值,體系默許這是一個空白域,在結構函數停止初始化,
假如是靜態的,則可以在初始化塊。
(2)內存:
常量(final變量)和非final變量的處置方法是紛歧樣的。
每個類型在用到一個常量時,都邑復制一份到本身的常量池中。
常量也像類變量(static)一樣保留在辦法區,只不外他保留在常量池。
(能夠是,類變量被一切實例同享,而常量池是每一個實例獨有的。)
2.潤飾辦法:
保留在辦法區,而且可以被函數代碼直代替換,而不消比及履行時再決議詳細是誰人函數。
3.潤飾類:
保留在辦法區。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved