Java中訪問權限等級從大到小依次爲:public、protected、包訪問權限(沒有關鍵詞)、private;java
以包訪問權限爲界限,public、protected分別能夠被任意對象和繼承的對象訪問,而包訪問權限(未加關鍵詞的類、方法等)則不能在包外被訪問;在一個類中,不能出現相同類成員;在同一個包中,不能夠出現相同類;數據庫
public做爲接口訪問權限,將一些方法做爲public,即將該方法做爲接口,供其餘程序調用;private權限下,除了包含該成員的類以外,其餘任何類都沒法訪問該成員,用來隱藏一些類和方法;protected權限下,只有派生類具備訪問權限,提供一個可繼承的方法;沒有關鍵詞的權限成爲包訪問權限,對包內的類至關於public,對包外的類至關於private;訪問權限的控制構成了實現的封裝;工具
java中,類訪問權限只能是public或者包訪問權限(除了內部類);一個編譯單元最多有一個public類,該類的名字必須和文件的名稱相同,並若是指定該類爲public,則只有該類能夠在該文件的包外部被調用;每一個編譯單元能夠有多個非public類,一個public類,全部這些類在編譯的時候都會被編譯成.class文件,Java可運行程序是一組能夠打包而且壓縮爲java文檔文件(JAR)的.class文件,解釋器負責查找、裝載和解釋這些文件;測試
使用package語句,能夠將編譯單元的public類名稱位於包名的保護傘下,使其名稱在別的包中調用時具備惟一性;而且使用時,必須使用import關鍵字導入;spa
java建立包名稱時,使用建立者域名的反順序小寫名稱做爲第一部分,以CLASSPATH做爲根目錄,將相應的包相對目錄做爲第二部分(每一個目錄之間在調用時以點號鏈接);orm
如,在CLASSPATH中添加$HOME/org/lozybean,將其做爲包的ROOT之一,而後在該目錄下新建util目錄,而且編寫了一個本身定義的java文件,而且使用package org.lozybean.util將該文件置於包文件名的保護下;在其餘的任何地方,均可以使用import static org.lozybean.util.ClassName來導入編寫好的靜態方法,便可直接在當前文件中使用該靜態方法,其餘方法或者類(可訪問的)則使用import便可;對象
定製工具庫;繼承
新建java項目,並將java項目路徑/bin(eclipase會在項目目錄下自動添加src和bin目錄)添加到JAVAPATH中;新建包:org.lozybean.util,並添加類:Print,添加定製的print工具接口
package org.lozybean.util;ip
//: org/lozybean/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
import java.io.*;
public class Print {
//Print with a newline;
public static void println(Object obj){
System.out.println(obj);
}
//Print a newline by itself;
public static void println(){
System.out.println();
}
//Print with no line break;
public static void print(Object obj){
System.out.print(obj);
}
//The new Java SE5 printf() (from C):
public static PrintStream
printf(String format,Object... args){
return System.out.printf(format,args);
}
}
新建一個類:Test.java,測試:
import static org.lozybean.util.Print.*;
publicclass Test{
public static void main(String[] args){
print("ok");
}
}
如下示例給出兩種特殊的實例化方式:
class Soup1{
private Soup1(){};
public static Soup1 makeSoup(){
return new Soup1();
}
}
class Soup2{
private Soup2(){};
private static Soup2 ps1 = new Soup2();
public static Soup2 access(){
return ps1;
}
public void f(){};
}
public class Lunch {
void testPrivate(){
//! Soup1 soup = new Soup1();
}
void testStatic(){
Soup1 soup = Soup1.makeSoup();
}
void testSingleton(){
Soup2.access().f();
}
}
以上示例中,Soup1屏蔽了默認的構造方法(構造方法權限爲private),而且添加靜態方法返回一個實例化對象,經過這樣的方式,能夠在類內部記錄每次實例化的過程;
Soup2則是實現了一個單件類(Ruby中做爲語言特徵),該類只能實例化一個對象,對於一些數據庫操做時,單件類是比較有效的,避免每次實例化一個對象時都對數據庫進行一次鏈接訪問操做,而且能夠避免一些同步問題;