java內部類的訪問許可權
⑴ 什麼是內部類內部類有什麼作用(java)
在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、局部內部類、匿名內部類和靜態內部類。下面就先來了解一下這四種內部類的用法。
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:
class Circle { double radius = 0; public Circle(double radius) { this.radius = radius; } class Draw { //內部類 public void drawSahpe() { System.out.println("drawshape"); } }}
這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪
class Circle { private double radius = 0; public static int count =1; public Circle(double radius) { this.radius = radius; } class Draw { //內部類 public void drawSahpe() { System.out.println(radius); //外部類的private成員 System.out.println(count); //外部類的靜態成員 } }}
不過要注意的是,當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即默認情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
外部類.this.成員變數外部類.this.成員方法
雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這么隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先創建一個成員內部類的對象,再通過指向這個對象的引用來訪問:
class Circle { private double radius = 0; public Circle(double radius) { this.radius = radius; getDrawInstance().drawSahpe(); //必須先創建成員內部類的對象,再進行訪問 } private Draw getDrawInstance() { return new Draw(); } class Draw { //內部類 public void drawSahpe() { System.out.println(radius); //外部類的private成員 } }}
成員內部類是依附外部類而存在的,也就是說,如果要創建成員內部類的對象,前提是必須存在一個外部類的對象。創建成員內部類對象的一般方式如下:
public class Test { public static void main(String[] args) { //第一種方式: Outter outter = new Outter(); Outter.Inner inner = outter.new Inner(); //必須通過Outter對象來創建 //第二種方式: Outter.Inner inner1 = outter.getInnerInstance(); }} class Outter { private Inner inner = null; public Outter() { } public Inner getInnerInstance() { if(inner == null) inner = new Inner(); return inner; } class Inner { public Inner() { } }}
內部類可以擁有private訪問許可權、protected訪問許可權、public訪問許可權及包訪問許可權。比如上面的例子,如果成員內部類Inner用private修飾,則只能在外部類的內部訪問,如果用public修飾,則任何地方都能訪問;如果用protected修飾,則只能在同一個包下或者繼承外部類的情況下訪問;如果是默認訪問許可權,則只能在同一個包下訪問。這一點和外部類有一點不一樣,外部類只能被public和包訪問兩種許可權修飾。我個人是這么理解的,由於成員內部類看起來像是外部類的一個成員,所以可以像類的成員一樣擁有多種許可權修飾。
⑵ JAVA裡面非public類里的public方法訪問許可權如何
Java中規定每一個文件中必須有一個public類型的class,那麼非public類就有兩種情況:1.是public類的內部類2.不是public類的內部類
內部類的public方法訪問情況:
public class PublicRoleTest {
public static void main(String[] args) {
PublicRoleTest pr = new PublicRoleTest();
A a = pr.new A();
a.functionA();
}
class A{
public void functionA(){
System.out.println("this is to test!");
}
}
}
不是public類的內部類的public方法訪基纖問情況:
public class PublicRoleTest {
public static void main(String[] args) {
A a = new A();
a.functionA();
}
}
class A{
public void functionA(){
System.out.println("this is to test!");
}
}
總而言之,非公有類里的搏余仿公有方法,只能被這個非公有類里毀型的其他方法直接訪問,外部是不能直接訪問的
⑶ JAVA 內部類訪問許可權
和是不是構造函數沒有關系,只要是private修飾的內容,就只有在當前類中可以訪問,這是定律。
public :任何地方均可訪問。
protected:在同一個包內均可訪問,不同包的子類可以訪問
默認的:也叫做包訪問修飾符,顧名思義,同一個包內才可以訪問
private:只有類本身可以訪問。
⑷ java 內部類和外部類的區別
1. Java項目一般從src目錄開始有com...A.java這樣的目錄結構。這就是包結構。所以一般編譯後的結構是跟包結構一模一樣的,這樣的結構保證了import時能找到正確的class引用包訪問許可權就是指同包下的類可見。
import 一般加上全路徑,並且使用.*時只包含當前目錄的所有類文件,不包括子目錄。
2. 外部明遲類只有public和default兩種修飾,要麼全局可訪問,要麼包內可訪問。
3. 內部類可以有全部訪問許可權,因亂數為它的概念就是一個成員變數,所以訪問許可權設置與一般的成員變數相同嘩槐首。
非靜態內部類是外部類的一個成員變數,只跟外部類的實例有關。
靜態內部類是獨立於外部類存在的一個類,與外部類實例無關,可以通過外部類.內部類直接獲取Class類型。
想要了解更多可以跟我一起討論哦
⑸ java裡面的內部類和外部類是什麼_
外部類:
最普通的,我們平時見到的那種類,就是在一個後綴為.java的文件中,直接定義的類
內部類:
內部類,顧名思義,就是包含在外部類中的類,就叫做內部類。內部類有兩種,一種是靜態內部類,一種是非靜態內部類。
靜態內部類和非靜態內部類之間的區別主要如下:
1、內部原理的區別:
靜態內部類是屬於外部類的類成員,是一種靜態的成員,是屬於類的,就有點類似於private static Singleton instance = null;非靜態內部類,是屬於外部類的實例對象的一個實例成員,靜態類則是屬於所有外部共有的,也就是說,每個非靜態內部類,不是屬於外部類的,是屬於外部類的每一個實例的,創建非靜態內部類的實例以後,非靜態內部類實例,是必須跟一個外部類的實例進行關聯和有寄存關系的。
2、創建方式的區別:
創建靜態內部類的實例的時候,只要直接使用「外部類.內部類()」的方式,就可以,比如School.Teacher();創建非靜態內部類的實例的時候,必須要先創建一個外部類的實例,然後通過外部類的實例,再來創建內部類的實例,new School().Teacher()
通常來說,我們一般都會為了方便,會選擇使用靜態內部類。
⑹ Java的內部類有什麼特點 作用和注意
1)根據位置的不同,Java中的內部類分為四種:
靜態內部類
使用static修飾,聲明在類體中
靜態內部類中可以訪問外部類的靜態成員
成員內部類
聲明在類體中,不使用static,具有類的成員特徵,也就是,必須有類的實例才能創建內部類實例
內部類實例可以訪問共享外部類的成員變數(很常用)
如:鏈表的節點就可以定義為內部類
局部內部類 把類聲明在方法中,就是局部內部類,作用域
類似局部變數(很少見)
匿名內部類
匿名類,非常常見,可以寫在任何地方,就像一般的語句
語法更象是創建對象:Date d = new Date(){//...};
匿名類是對原類的一個繼承,同時創建了實例,{} 就是繼承以後的類體
類體中可使用所有類的語法
匿名類不能寫構造器
匿名類可以從抽象類或者介面繼承,必須提供抽象方法的實現
2) 任何內部類都編譯成獨立的class文件
3) 最大的作用:封裝!
匿名類可以封裝內部概念:情侶間的「土豆」和菜市場的「土豆」是不一樣的
⑺ Java內部類的問題
什麼是內部類
在一個類內部的類,我們稱之為內部類。
內部類可以很好地實現隱藏,一般的非內部類是不允許有 private 與 protected 許可權的,但內部類可以。內部類擁有外圍類的所有元素的訪問許可權。
內部類分類:
內部類可以分為:實例內部類、靜態內部類和成員內部類,每種內部類都有它特定的一些特點。
在類 A 中定義類 B,那麼類 B 就是內部類,也稱為嵌套類,相對而言,類 A 就是外部類。如果有多層嵌套,例如類 A 中有內部類 B,而類 B 中還有內部類 C,那麼通常將最外層的類稱為頂層類(或者頂級類)。
⑻ Java中的四種訪問控制域是什麼
private,public,protected,默認不寫(firendly)
1、Class類的訪問許可權:
public:可以供所有的類訪問。
默認:默認可以稱為friendly但是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++。默認的訪問許可權是包級訪問許可權。
即如果寫了一個類沒有寫訪問許可權修飾符,那麼就是默認的訪問許可權,同一個包下的類都可以訪問到,即使可以實例化該類
(當然如果這個類不具有實例化的能力除外,比如該類沒有提供public的構造函數)。
說明:
1、每個編譯單元(類文件)都僅能有一個public class
2、public class的名稱(包含大小寫)必須和其類文件同名。
3、一個類文件(*.java)中可以不存在public class。
這種形式的存在的場景:如果我們在某個包內撰寫一個class,僅僅是為了配合同包內的其他類工作,而且
我們不想再為了撰寫說明文檔給客戶(不一定是現實意義的客戶,可能是調用這個類的類)看而傷腦筋,而且有可能過一段時間之後
有可能會徹底改變原有的做法,並完全舍棄舊版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那個任何產生某個class的對象,可以將該類得所有構造函數設置成private。但是即使這樣也可以生成該類的對象,就是class的static的成員(屬性和方法)可以辦到。
2、類成員變數的訪問許可權:
public:緊接public的屬性任何類都可以訪問到。可以直接使用ClassName.propertyName。但是從類的封裝性上來考慮將一個類的屬性定義成public一般很少使用,
在定義靜態常量的時候通暢會這樣定義。如:public static final int PAGE_SIZE=10;
private:只有類本身內部的方法可以訪問類的private屬性,當然內部類也可以訪問其外部類的private成員的。(屬性和方法)
默認(friendly):包級可見,同一個包內的類可以訪問到這個屬性,可以直接使用className.propertyName來訪問,但是從類的封裝性特性來說很少這樣使用類的屬性的。
protected:關鍵字所處理的是所謂「繼承」的觀念。對於同一包的其他類,protected=默認,對於不同包的類,如果存在繼承關系,而baseClass存在protected屬性,則可以被其自繼承,而不同包的其他類
則不能訪問類的protected屬性。
3、類的成員方法的訪問許可權:
其從語法角度來講,這些訪問許可權控制符作用於類的方法和作用於類的屬性上的效果是一樣的。
public:所有類可見。
pirvate:只有同一類內部的方法可見,在有就是內部類也可以訪問到。
默認(friendly):包內可見。
protected:繼承可見。
4、訪問許可權存在的理由
1、「讓使用者無法碰觸到他們不該碰觸的東西。」這些東西僅供類的內部機制使用。將某些成員聲明成private,對於使用者來說可以說是一種服務,
因為這樣使用者可以知道哪些是他關注的哪些是不重要的,不需要關注,如此歷來對於使用來說降低了對使用對象認識的難度。
2、(最終要的理由)讓程序設計者可以更動class內部運作方式,而無須擔心波及到客戶端程序。
5、java的「訪問許可權修飾符」賦予classes開發者極具有價值的控制能力。身為classes開發者,如果你的任何改變可以完全不幹擾你的使用者,
你便可以安心改變你的底層實現,因為客戶端程序員無法訪問class的這一部分。
通過今天學習訪問許可權的問題了解到,介面或者抽象等等策略所謂的「實現隱藏」其根本原因並不是說為了隱藏實現的代碼和思路,而是降低使用者的使用難度,以及從維護角度來說可見范圍的控制給程序維護帶來了極大的安全性。