thinkinginjava學習筆記05_訪問權限

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中做爲語言特徵),該類只能實例化一個對象,對於一些數據庫操做時,單件類是比較有效的,避免每次實例化一個對象時都對數據庫進行一次鏈接訪問操做,而且能夠避免一些同步問題;

相關文章
相關標籤/搜索