JAVA基礎3——常見關鍵字解讀(1)

常見的JAVA中的關鍵字

static

static靜態變量

靜態變量:使用static關鍵字定義的變量。static可以修飾變量和方法,也有static靜態代碼塊。被static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。

static修飾的field字段,不管類初始化多少遍,此field對象只會初始化一次,且所有new出來的類對象中,對此static修飾的field字段進行操作,其余所有的類對象中的此field值都會被改變。

靜態變量的優勢:
A,靜態對象的數據在全局是唯一的,一改都改。如果你想要處理的東西是整個程序中唯一的,弄成靜態是個好方法。 非靜態的東西你修改以后只是修改了他自己的數據,但是不會影響其他同類對象的數據。
B,引用方便。直接用 類名.靜態方法名 或者 類名.靜態變量名就可引用并且直接可以修改其屬性值,不用get和set方法。
C,保持數據的唯一性。此數據全局都是唯一的,修改他的任何一處地方,在程序所有使用到的地方都將會體現到這些數據的修改。有效減少多余的浪費。

注意:static靜態變量是線程非安全的,靜態變量即類變量,位于方法區,為所有對象共享,共享一份內存,一旦靜態變量被修改,其他對象均對修改可見,故線程非安全。

static靜態方法

使用約束點:

  1. static方法中無法訪問非static全局變量;
  2. static方法中無法訪問非static方法;
  3. static方法中無法使用this和super關鍵字(因為this關鍵字指向該方法所屬的對象,而靜態方法是屬于類級的,不存在對象一說;至于super關鍵字,只要不是用在構造方法里,那么它就是指向父類對象的,而靜態方法是不能引用實例對象的,因此也不能使用super關鍵字)。

靜態方法的多線程問題分析:

  1. 如果靜態方法中沒有使用全局變量,則肯定是線程安全的;
  2. 如果訪問且修改了全局靜態變量,可能會出現數據不一致問題,線程非安全。
  3. 是否會出現線程等待卡死?(待確認)

final

一言概之,final即為“最終的、最后的”的意思,使用final類似于一種顯式的聲明,強調這個final所修飾的內容是不可變更的。

  1. final修飾的變量:此變量的值不能被修改、不能被重復賦值(聲明的時候、代碼塊、構造函數三者任選一個地方初始化,有且只能有一個地方初始化值,其余地方不能修改其值);
  2. final修飾的類:此類不能被繼承;
  3. final修飾的方法:此方法不可被子類重寫,用于父類中為了防止子類覆寫某些特殊的方法(在早期的JAVA版本中,對于final方法,編譯的時候會轉換位內嵌調用提升性能,但是近期的JAVA版本中已經不再需要final進行方法優化了,所以不再考慮此情況了)。

對final修飾變量的情況具體說明如下:

final修飾變量為基本類型時

final修飾基本類型的變量的時候,此變量值不可變更,不可修改,不可重新賦值。

final修飾變量為基本類型時

final修飾引用類型的變量的時候,此變量不可被重新賦值,但是此變量的對象內容可以被修改。可以理解為final固定了此變量指向的對象地址,但是對于此對象中的內容屬性,是可以修改的。

final的其它冷知識

  1. 類的private方法,會被隱式的指定為final類型的。
  2. 當final變量是基本數據類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時確定。看下面這個例子:
public class Test {public static void main(String[] args)  {String a = "hello2"; final String b = "hello";String d = "hello";String c = b + 2; String e = d + 2;System.out.println((a == c));System.out.println((a == e));}
}輸出:
true
false
因為b已經聲明為final且值固定,編譯期的時候就已經將c編譯為hello2,與a相同,所以第一個是true。

更詳細的解釋,可以參考下http://www.cnblogs.com/dolphin0520/p/3736238.html,解釋的很到位,舉的例子也很好。

final 與 finalize() 區別

final關鍵字是用于標示不可修改、不可變更相關的含義,具體上面已經說明了。

finalize()是個方法名,Object對象默認提供一個protected類型的此方法。此方法盡量不要在代碼中主動去調用。

finalize()的功能 : 一旦垃圾回收器準備釋放對象所占的內存空間, 如果對象覆蓋了finalize()并且函數體內不能是空的, 就會首先調用對象的finalize(), 然后在下一次垃圾回收動作發生的時候真正收回對象所占的空間.finalize()有一個特點就是: JVM始終只調用一次. 無論這個對象被垃圾回收器標記為什么狀態, finalize()始終只調用一次. 但是程序員在代碼中主動調用的不記錄在這之內.

盡量避免使用finalize():

  1. finalize()不一定會被調用, 因為java的垃圾回收器的特性就決定了它不一定會被調用
  2. 就算finalize()函數被調用, 它被調用的時間充滿了不確定性, 因為程序中其他線程的優先級遠遠高于執行finalize()函數線程的優先級。也許等到finalize()被調用, 數據庫的連接池或者文件句柄早就耗盡了.
  3. 如果一種未被捕獲的異常在使用finalize方法時被拋出,這個異常不會被捕獲,finalize方法的終結過程也會終止,造成對象出于破壞的狀態。被破壞的對象又很可能導致部分資源無法被回收, 造成浪費.
  4. finalize()和垃圾回收器的運行本身就要耗費資源, 也許會導致程序的暫時停止.

finally

常常與try...catch語句一起出現,用于保證try語句執行完成之后總會執行finally語句,在finally中常常進行一些資源釋放等操作。

即使在try語句中有return操作、或者出現某些沒有catch住的運行時異常需要提前退出的時候,也會執行finally語句。

看下下面這個代碼片段:

private static int test()
{int i = 1;try{return i;}finally{i = 2;}
}
執行結果:
1

test()方法執行的返回值是1,即雖然在return之前會執行一下finally中的方法,但是在finally中對返回對象進行重新賦值操作是不會改變原有待返回的值的。

通常情況下,盡量避免在finally分支中進行賦值操作,因為也不會生效,主要是用于一些資源的釋放操作。

throw & throws

throw 是具體的語句拋出異常。
throws 是方法聲明的時候聲明可能拋出的異常時使用。

abstract

abstract 可以用于修飾類或者方法。

如果將一個類設置為abstract,則此類必須被繼承使用。此類不可生成對象,必須被繼承使用。 Abstract可以將子類的共性最大限度的抽取出來,放在父類中,以提高程序的簡潔性。 Abstract雖然不能生成對象,但是可以聲明,作為編譯時類型,但不能作為運行時類型。 Final和abstract永遠不會同時出現。

當abstract用于修飾方法時,此時該方法為抽象方法,此時方法不需要實現,實現留給子類覆蓋,子類覆蓋該方法之后方法才能夠生效。 如果方法想要聲明為abstract,則此方法所在的類必須也是abstract類型的。子類必須實現父類中的abstract方法, 否則編譯會報錯。

轉載于:https://www.cnblogs.com/veezean/p/7647687.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370987.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370987.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370987.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL PL / java簡介

現代數據庫允許以多種語言編寫存儲過程。 一種常見的實現語言是java.NB,本文討論了PostgreSQL特定的Java實現。 其他數據庫的詳細信息會有所不同,但是概念是相同的。 PL / Java的安裝 在Ubuntu系統上安裝PL / Java很簡單。 我將首先創建一個新模板templ…

強連通分量 圓桌騎士

題目描述 圓桌騎士是一個非常吸引人的職業。因此,在最近幾年里,亞瑟王史無前例的擴招圓桌騎士,并不令人驚訝。現在這里有許多圓桌騎士,每個圓桌騎士都收到一份珍貴的邀請函,被邀請去英靈殿圓桌。這些騎士將要環繞著坐在…

微信小程序echarts層級太高

項目中因為需求,底部的tab導航欄是自己寫的,在開發者工具中一切正常;但是在真機上頁面滑動時,echarts的層級比tab高,調過兩者的z-index后仍然如此。 經過查找后發現cover-view和cover-image替換tab的view后&#xff0…

php解密 碼表,php拼音碼表的生成

php拼音碼表的生成發布于 2014-09-07 11:12:52 | 90 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor,中文名:“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,入門門檻…

angular js 使用pdf.js_排名靠前的幾個JS框架發展趨勢和前景

轉載自:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02隨著信息技術領域的發展,企業…

工廠設計模式案例研究

我有一份工作來檢查我們的項目代碼質量。 如果我在項目中發現任何障礙,必須將其報告給我的團隊負責人。 我發現了很多漏洞,我認為可以在博客上進行討論。 不是嘲笑作者,而是一起學習和改進自己。 像這段代碼一樣,這是我在我們的代…

【javascript】DOM操作方法(3)——document節點屬性

document.doctype //document.documentElement //來獲取html元素 document.defaultView //返回document對象所在的window對象 document.body //返回當前文檔的<body>節點 document.head //返回當前文檔的<head>節點 document.activeElement //返回當前文…

debian dhcp服務啟動不了_DHCP服務器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于動態配置工作站網絡接口&#xff0c;使工作站的網絡接口管理自動化。DHCP服務器軟件dhcpd網站&#xff1a;http://www.isc.org安裝方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

澤西島的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我討論了一個允許在WADL中使用JSON-Schema的建議&#xff0c;這篇文章探討了如何使它與最近構建的Jersey一起使用。 在1.16發布之前&#xff0c;您將必須下載/參考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假設您已經有…

C++map類型 之 簡單介紹

一&#xff1a;map的前世今生&#xff08;1&#xff09;從關聯容器與順序容器說起。關聯容器通過鍵&#xff08;key&#xff09;存儲和讀取元素。而順序容器則通過元素在容器中的位置順序存儲和訪問元素&#xff08;vector,queue,stack,list等&#xff09;。關聯容器&#xff0…

MySql Socket 完成數據庫的增查Demo

需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信. 第一部分:數據庫創建 數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel 第二部分:數據庫連接與Socket通信 創建控…

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…

蘋果桌面主題_看膩了手機自帶的桌面主題,試試這個

在這個看臉的時代&#xff0c;顏值似乎越來越重要了。尤其是我們每天都要看到的手機桌面&#xff0c;如果它的顏值好一點&#xff0c;也許我們的心情會更好&#xff0c;所以有不少人都用手機自帶的主題來美化桌面&#xff0c;但是對于喜歡個性的我們&#xff0c;手機自帶的主題…

Java SE 11:推動Java向前發展

介紹 在我看來&#xff0c;這篇文章提出了Java語言應該如何發展以保持其作為首選語言的地位。 它還提供了一些我喜歡但有時&#xff08;可能永遠不會&#xff09;成為Java一部分的功能&#xff0c;由于我將要解釋的某些原因&#xff0c;這些功能有時我已經愛上了。 我真的很想…

python之property屬性

Property的概念&#xff1a;property是一種特殊的屬性&#xff0c;訪問它時會執行一段功能&#xff08;函數&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用細節及各種問題

解決markdown圖片不顯示(返回403 forbidden)、添加本地圖片無法顯示、修改文章page模板、同時部署發布同步到多個倉庫站點(Github、coding、gitee 碼云) 圖片不顯示 在使用過程中&#xff0c;會發現有的引用圖片無法顯示的問題。但是如果直接復制圖片地址到瀏覽器打開的話顯示…

oracle的等保,Oracle等保測評相關指令

Oracle用戶管理:SQL*Pluscreate user 用戶名 identified by 密碼; //創建用戶grant 權限(dba管理員&#xff0c;resource普通用戶&#xff0c;connect訪客) to 用戶名; //授權drop user 用戶名 cascade; //刪除用戶&#xff0c;加cascade會把用戶創建的所有東西刪除Linux設置用…

Spring3 + JPA2 + Java EE6 App Server =配置混亂

Spring很棒&#xff0c;JavaEE6很棒&#xff0c;最新的JavaEE6 Application服務器也很棒。 這篇文章不是Spring Vs JavaEE6上的專欄文章&#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2&#xff08;Hibernate&#xff09;應用程序的經驗。 我的應用程序要求非…

python面向對象進階(1)

面向對象進階 isinstance(obj,cls) 檢查是否obj是類cls的對象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 檢查sub是否是super的派生類class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向對象中的反射&#xff…

智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常&#xff0c;可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題&#xff0c;下面給大家分享一下。 一、Arm的中斷。 1.觸發異常 2.保存現場 3.cpu進入異常工作模式&#xff0c;程序指針(pc)跳入異常入口&…