java 修飾_Java 修飾符

摘錄自http://www.runoob.com/java/java-modifier-types.html

Java 修飾符

Java語言提供了很多修飾符,主要分為以下兩類:

訪問修飾符

非訪問修飾符

修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明:

publicclassclassName {// ...}privatebooleanmyFlag;staticfinaldoubleweeks =9.5;protectedstaticfinalintBOXWIDTH =42;publicstaticvoidmain(String[]arguments){// 方法體}

訪問控制修飾符

Java中,可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java支持4種不同的訪問權限。

默認的,也稱為?default,在同一包內可見,不使用任何修飾符。

私有的,以?private?修飾符指定,在同一類內可見。

共有的,以?public?修飾符指定,對所有類可見。

受保護的,以?protected?修飾符指定,對同一包內的類和所有子類可見。

默認訪問修飾符-不使用任何關鍵字

使用默認訪問修飾符聲明的變量和方法,對同一個包內的類是可見的。接口里的變量都隱式聲明為public static final,而接口里的方法默認情況下訪問權限為public。

實例:

如下例所示,變量和方法的聲明可以不使用任何修飾符。

Stringversion ="1.5.1";booleanprocessOrder(){returntrue;}

私有訪問修飾符-private

私有訪問修飾符是最嚴格的訪問級別,所以被聲明為private的方法、變量和構造方法只能被所屬類訪問,并且類和接口不能聲明為private。

聲明為私有訪問類型的變量只能通過類中公共的getter方法被外部類訪問。

Private訪問修飾符的使用主要用來隱藏類的實現細節和保護類的數據。

下面的類使用了私有訪問修飾符:

publicclassLogger{privateStringformat;publicStringgetFormat(){returnthis.format;}publicvoidsetFormat(Stringformat){this.format =format;}}

實例中,Logger類中的format變量為私有變量,所以其他類不能直接得到和設置該變量的值。為了使其他類能夠操作該變量,定義了兩個public方法:getFormat() (返回format的值)和setFormat(String)(設置format的值)

公有訪問修飾符-public

被聲明為public的類、方法、構造方法和接口能夠被任何其他類訪問。

如果幾個相互訪問的public類分布在不同的包中,則需要導入相應public類所在的包。由于類的繼承性,類所有的公有方法和變量都能被其子類繼承。

以下函數使用了公有訪問控制:

publicstaticvoidmain(String[]arguments){// ...}

Java程序的main() 方法必須設置成公有的,否則,Java解釋器將不能運行該類。

受保護的訪問修飾符-protected

被聲明為protected的變量、方法和構造器能被同一個包中的任何其他類訪問,也能夠被不同包中的子類訪問。

Protected訪問修飾符不能修飾類和接口,方法和成員變量能夠聲明為protected,但是接口的成員變量和成員方法不能聲明為protected。

子類能訪問Protected修飾符聲明的方法和變量,這樣就能保護不相關的類使用這些方法和變量。

下面的父類使用了protected訪問修飾符,子類重載了父類的openSpeaker()方法。

classAudioPlayer{protectedbooleanopenSpeaker(Speakersp){// 實現細節}}classStreamingAudioPlayer{booleanopenSpeaker(Speakersp){// 實現細節}}

如果把openSpeaker()方法聲明為private,那么除了AudioPlayer之外的類將不能訪問該方法。如果把openSpeaker()聲明為public,那么所有的類都能夠訪問該方法。如果我們只想讓該方法對其所在類的子類可見,則將該方法聲明為protected。

訪問控制和繼承

請注意以下方法繼承的規則:(父類為整體約束,子類不能比父類更嚴格)

父類中聲明為public的方法在子類中也必須為public。

父類中聲明為protected的方法在子類中要么聲明為protected,要么聲明為public。不能聲明為private。

父類中聲明為private的方法,不能夠被繼承。

非訪問修飾符

為了實現一些其他的功能,Java也提供了許多非訪問修飾符。

static修飾符,用來創建類方法和類變量。

Final修飾符,用來修飾類、方法和變量,final修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量為常量,是不可修改的。

Abstract修飾符,用來創建抽象類和抽象方法。

Synchronized和volatile修飾符,主要用于線程的編程。

Static修飾符

靜態變量:

Static關鍵字用來聲明獨立于對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝。 靜態變量也被成為類變量。局部變量不能被聲明為static變量。

靜態方法:

Static關鍵字用來聲明獨立于對象的靜態方法。靜態方法不能使用類的非靜態變量(因為靜態方法可以不用創建對象就調用,非靜態方法必須有了對象的實例才能調用)。靜態方法從參數列表得到數據,然后計算這些數據。

只要記住:

用statci修飾的成員是屬于類的,在static的方法里可以用類名直接調用;

不用statci修飾的成員是屬于具體實例對象的,需要用對象名調用,且在static的方法里不可以調用。

因為靜態方法的調用不是通過實例對象進行的,所以在靜態方法中沒有this指針,不能訪問所屬類的非靜態變量和方法,只能訪問方法體內的局部變量、自己的參數和靜態變量。所以你在在static的主函數里調用非static的方法時肯定報錯。

對類變量和方法的訪問可以直接使用classname.variablename和classname.methodname的方式訪問。

如下例所示,static修飾符用來創建類方法和類變量。

publicclassInstanceCounter{privatestaticintnumInstances =0;protectedstaticintgetCount(){returnnumInstances;}privatestaticvoidaddInstance(){numInstances++;}InstanceCounter(){InstanceCounter.addInstance();}publicstaticvoidmain(String[]arguments){System.out.println("Starting with "+InstanceCounter.getCount()+" instances");for(inti =0;i <500;++i){newInstanceCounter();}System.out.println("Created "+InstanceCounter.getCount()+" instances");}}

以上實例運行編輯結果如下:

Startedwith0instances

Created500instances

Final修飾符

Final變量:

Final變量能被顯式地初始化并且只能初始化一次。被聲明為final的對象的引用不能指向不同的對象。但是final對象里的數據可以被改變。也就是說final對象的引用不能改變,但是里面的值可以改變。

Final修飾符通常和static修飾符一起使用來創建類常量。

實例:

publicclassTest{finalintvalue =10;// 下面是聲明常量的實例publicstaticfinalintBOXWIDTH =6;staticfinalStringTITLE ="Manager";publicvoidchangeValue(){value =12;//將輸出一個錯誤}}

Final方法

類中的Final方法可以被子類繼承,但是不能被子類修改。

聲明final方法的主要目的是防止該方法的內容被修改。

如下所示,使用final修飾符聲明方法。

publicclassTest{publicfinalvoidchangeName(){// 方法體}}

Final類

Final類不能被繼承,沒有類能夠繼承final類的任何特性。

實例:

publicfinalclassTest{// 類體}

Abstract修飾符

抽象類:

抽象類不能用來實例化對象,聲明抽象類的唯一目的是為了將來對該類進行擴充。

一個類不能同時被abstract和final修飾(abstract是抽象類,指定必須要子類繼承才可以使用,而final是指定不允許繼承)。如果一個類包含抽象方法,那么該類一定要聲明為抽象類,否則將出現編譯錯誤。

抽象類可以包含抽象方法和非抽象方法。

實例:

abstractclassCaravan{privatedoubleprice;privateStringmodel;privateStringyear;publicabstractvoidgoFast();//抽象方法publicabstractvoidchangeColor();}

抽象方法

抽象方法是一種沒有任何實現的方法,該方法的的具體實現由子類提供。抽象方法不能被聲明成final(因為類中的Final方法可以被子類繼承,但是不能被子類修改)和strict。

任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類。

如果一個類包含若干個抽象方法,那么該類必須聲明為抽象類。抽象類可以不包含抽象方法。

抽象方法的聲明以分號結尾,例如:public abstract sample();

實例:

publicabstractclassSuperClass{abstractvoidm();//抽象方法}classSubClassextendsSuperClass{//實現抽象方法voidm(){.........}}

Synchronized修飾符

Synchronized關鍵字聲明的方法同一時間只能被一個線程訪問。Synchronized修飾符可以應用于四個訪問修飾符。

實例:

publicsynchronizedvoidshowDetails(){.......}

Transient修飾符

序列化的對象包含被transient修飾的實例變量時,java虛擬機(JVM)跳過該特定的變量。

該修飾符包含在定義變量的語句中,用來預處理類和變量的數據類型。

實例:

publictransientintlimit =55;// will not persistpublicintb;// will persist

Volatile修飾符

Volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內存中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。

一個volatile對象引用可能是null。

實例:

publicclassMyRunnableimplementsRunnable{privatevolatilebooleanactive;publicvoidrun(){active =true;while(active)// 第一行{// 代碼}}publicvoidstop(){active =false;// 第二行}}

通常情況下,在一個線程調用 run() 方法(在 Runnable 開啟的線程),在另一個線程調用 stop() 方法。 如果?第一行中緩沖區的 active 值被使用,那么在?第二行?的 active 值為 false 時循環不會停止。

但是以上代碼中我們使用了 volatile 修飾 active,所以該循環會停止。

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

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

相關文章

內存分配,任意字節對齊

有這么一道題目&#xff0c;要求按任意字節對齊分配內存&#xff0c;接口&#xff1a;char * aligned_malloc(int size, int alignment)//size 為分配的內存大小&#xff0c;alignment對齊基數&#xff08;可以為任意數&#xff09;這個在gcc庫函數里能找到源碼&#xff0c;在f…

day16-Dom提交表單以及其他

一、前言 之前我們學習的是from提交表單&#xff0c;那個是html的提交表單方式&#xff0c;現在我們用dom來提交表單&#xff0c;還有一些其他的方式 二、dom提交表單 2.1、html提交表單 說明&#xff1a;form標簽跟submit類型的input標簽結合 <body><form id"f1…

分布式文件系統FastDFS

1. 什么是FastDFS FastDFS 是用 c 語言編寫的一款開源的分布式文件系統。FastDFS 為互聯網量身定制&#xff0c; 充分考慮了冗余備份、負載均衡、線性擴容等機制&#xff0c;并注重高可用、高性能等指標&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服務器集群提供文件…

html5 下拉刷新(pc+移動網頁源碼)

本文demo下載地址&#xff1a;http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1071 本文實現在html5網頁中使用下拉功能自動刷新顯示更多內容, 使用jquery捕捉和處理相應的鼠標事件, 例如內容在頂部時&#xff0c;觸發下拉事件后顯示更多內容; 如內容在…

操作系統內存管理問題集錦

1. 可采用哪幾種方式將程序裝入內存?它們分別適用于何種場合? a. 首先由編譯程序將用戶源代碼編譯成若干目標模塊&#xff0c;再由鏈接程序將編譯后形成的目標模塊和所需的-庫函數鏈接在一起&#xff0c;組成一個裝入模塊&#xff0c;再由裝入程序將裝入模塊裝入內存&#x…

java同名變量在list中添加兩次_快速解決List集合add元素,添加多個對象出現重復的問題...

首先我們在new 一個對象的時候&#xff0c;對象的id是唯一確定的&#xff1b;將對象add入list中時&#xff0c;放入list中的其實是對象的引用 &#xff1b;而每次循環只是簡單的set 對象的屬性&#xff0c;set新的屬性值&#xff0c;而add進list中的對象還是同一個對象id&#…

python面試題總結(1)--語言特性

1. 談談對 Python 和其他語言的區別 答&#xff1a; Python 是一門強類型的可移植、可擴展、可嵌入的解釋型編程語言&#xff0c;屬于動態語言&#xff1b;其語法簡潔優美、功能強大無比、應用領域非常廣泛且具有強大完備的第三方庫。 &#xff08;注&#xff1a;語言有無類型…

視頻網站盈利模式與營銷策劃

在與數十家視頻網站進行信息網絡傳播權交易過程中&#xff0c;在研究視頻網站內容和盈利模式基礎上&#xff0c;綜合自己在傳統媒體和新媒體領域十幾年的策劃和營銷經驗&#xff0c;我發現&#xff1a;視頻網站的盈利模式其實早就形成多種體系&#xff0c;但是盈利之路艱難&…

USACO 06JAN 牛的舞會 洛谷2863

題目描述 The N (2 < N < 10,000) cows are so excited: it’s prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round…

[UWP]了解模板化控件(4):TemplatePart

原文:[UWP]了解模板化控件(4)&#xff1a;TemplatePart1. TemplatePart TemplatePart&#xff08;部件&#xff09;是指ControlTemplate中的命名元素。控件邏輯預期這些部分存在于ControlTemplate中&#xff0c;并且使用protected DependencyObject GetTemplateChild(String ch…

動態重定位的增加的緊湊功能

動態重定位增加了緊湊的功能&#xff0c;在動態的分區分配時&#xff0c;可以對外部碎片進行緊湊來為沒有內存空間進行存儲的進程進行分配。

java 重載 equals_實現Student類的equals重載函數

[java]代碼庫//測試類public class StudentDemo {public static void main(String[] args) {Student s1 new Student("000","張三",18);Student s2 new Student("000","張三",18);//隨便改boolean flag s1.equals(s2);System.out.p…

python面試題總結(2)--編碼規范

1. 什么是 PEP8? 答&#xff1a;PEP8 --《Python Enhancement Proposal #8》&#xff08;8 號 Python 增強提案&#xff09;&#xff0c;他針對的 Python 代碼格式而編訂的風格指南。 2. 了解 Python 之禪么&#xff1f; 答&#xff1a;通過 import this 語句可以獲取其具體…

【Unity熱更新】學會AssetsBundle打包、加載、卸載

本教程詳細講解什么是AssetBundle壓縮包機制!然后構建 AssetBundle、加載 AssetBundle 以及卸載 AssetBundle 的簡要教程。這一個流程就是熱更新! AssetBundles 簡介 1.什么是AssetBundles? AssetBundles是Unity中一種用于打包和存儲資源(如模型、紋理、聲音等)的文件格…

Confluence 6 訪問你的宏正文(body)

請查看 Writing User Macros 頁面獲得有關如何寫用戶宏的介紹。 這個頁面介紹你可以在用戶宏中可以使用的的代碼信息。 訪問你的宏正文&#xff08;body&#xff09; 在你用戶宏模板中的 $body 對象可以訪問訪問到傳遞到你宏正文中的內容。 當你的宏有指定的正文的時候&#xf…

hibernate主鍵生成策略

1、hibernate 要求實體類里面有一個屬性作為唯一值&#xff0c;對應的表字段是主鍵&#xff0c;主鍵可以不同的生成策略 2、hibernate 主鍵生成策略有很多的值 <generator class"native"></generator> 3、在class屬性里面有很多值 &#xff08;1&#xf…

jboss mysql cluster_jboss配置mysql數據庫連接池

jboss配置mysql數據庫連接池下面YJBYS小編為大家整理了關于jboss配置mysql數據庫連接池的文章&#xff0c;希望對你有所幫助。更多Java認證考試信息&#xff0c;盡在應屆畢業生培訓網!1&#xff1a;配置&#xff1a;JDK 1.5JBoss4.0.4Mysql5.0Myeclipse 4.12&#xff1a;建立數…

P2P-挑戰和機遇

近年來互聯網上對等連接P2P應用發展迅速&#xff0c;MP3和視頻文件共享下載的P2P流已經成為寬帶用戶流量的主體。基于P2P的即時通信和互聯網電話&#xff08;如Skype&#xff09;發展迅速&#xff0c;對等廣播P2P流媒體等正在興起。P2P協同計算和網格方興未艾。P2P 應用支持網絡…

python面試題總結(3)-- 數據類型(字符串)

1. 列舉 Python 中的基本數據類型&#xff1f; 答&#xff1a; Python3 中有六個標準的數據類型&#xff1a;數字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、元組&#xff08;Tuple&#xff09;、集合&#…