成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java基礎(chǔ):Java核心技術(shù)提示的易忽略點 Ch4

ytwman / 2233人閱讀

摘要:所以,在讀的核心技術(shù)的過程中,我記錄下這些所謂的易忽略的問題,這些問題將會持續(xù)更新在我的這個的博客下,也算是激勵自己重新挖掘這些基礎(chǔ)問題的內(nèi)涵。類路徑只是讓能夠通過配置好的全路徑名找到所需的外部類。

開篇
Java是一門不那么簡單也不那么復(fù)雜的語言,Java里面有很多問題和特性是容易被使用者忽視的,這些問題也許會難住新手,同時也許會是老手不小心跌入的無故之坑,只有精于對基礎(chǔ)的提煉才能最大程度地解決類似的疑問。所以,在讀Cay.Horstmann的《Java核心技術(shù)》的過程中,我記錄下這些所謂的易忽略的問題,這些問題將會持續(xù)更新在我的這個Segment Fault的博客下,也算是激勵自己重新挖掘這些基礎(chǔ)問題的內(nèi)涵。這個博客將以原書中的章節(jié)為分割,大概會是每章一篇,持續(xù)更新,每篇的內(nèi)容也不會一次全部寫完,視我個人對問題的理解和我的閱讀進度而定。

另外,我們從本書第一卷第四章開始,因為前三章無外乎就是在講述歷史和環(huán)境配置,我認為和我們的主題不大相關(guān)。

Core Java Volume 1 chap4 java類和包的訪問權(quán)限

public,private等這些訪問控制標識對java的類和包來說都是可用的,而且在類中的屬性和方法、包中的方法來說訪問權(quán)限上的定義也是共通的:

public屬性和方法:這些方法的訪問權(quán)限是公開的,也就是說所有的類內(nèi)部和外部對象都可以訪問這些公開的屬性和方法;

public類:這些類的訪問權(quán)限是公開的,也就是說在包內(nèi)的類和包外的類都可以訪問這些公開的類;

private屬性和方法:這些方法是類私有的,也就是說只能被類內(nèi)部所訪問;

private類:這些類的訪問權(quán)限是私有的,也就是說只能被包內(nèi)部所訪問。

究竟什么是CLASSPATH

顧名思義,classpath指的是類路徑,也就是jvm在搜尋class二進制文件時搜尋的目錄,在這個目錄中如果找到需要的class文件則去執(zhí)行,我們可以通過執(zhí)行前為java命令設(shè)置-classpath參數(shù)或者直接設(shè)置CLASSPATH系統(tǒng)環(huán)境變量的形式去定義這個類路徑,jvm就會去這個指定的路徑下搜尋需要的class文件。
這個例子說明這個問題:
我們可以在系統(tǒng)環(huán)境變量配置文件中這樣配置java的CLASSPATH:

export CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"

這樣的配置文件等同于在java命令中的 -classpath參數(shù):

java -classpath .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar Test

這樣配置CLASSPATH環(huán)境變量或使用-classpath參數(shù)之后,jvm在尋找程序中使用的不包含在當前類中的類時就會去這些路徑下尋找,比如說程序中使用了不包含在當前類中的com.rocking.People類(People類通過importcom.rocking.*引入的),那么就會依照類路徑中指示的路徑去尋找:
壓縮入$JAVA_HOME/lib/dt.jar中的com/rocking/People.class(jdk提供的系統(tǒng)級jar包)
壓縮入$JAVA_HOME/lib/tools.jar的com/rocking/People.class
./com/rocking/People.class(當前路徑.拼接上class的全路徑名)

package com.rocking;

public class People{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

import com.rocking.People;

public class Test {
    public static void main(String[] args) {
        People people = new People();       
    }
}

最重要的一點是,我們上面的討論都是在jvm尋找class文件的過程中,而非javac編譯器尋找待編譯的java source文件的過程中,在編譯中,我們必須通過package定義當前類所在的包(或者不明確定義直接使用default package),需要導(dǎo)入外部類時import相應(yīng)包,只有這樣才能通過編譯。類路徑只是讓jvm能夠通過配置好的全路徑名找到所需的外部類。

setter的不可靠性

理論上我們將域?qū)傩栽O(shè)置為private的目的是為了不讓程序能夠輕易地訪問和修改到這個對象私有的屬性,而只能通過該類定義的public的getter和setter方法去訪問和修改。但是這并不是完全可靠的,程序仍然可以通過一些靈巧的辦法在某些合適的情況下獲取和更改這些私有的屬性值。

setter的不可靠性,其實只要能夠確定這個私有屬性的引用,是完全可以直接做更改的,當然前提是獲取到這個引用,比如通過getter拿到這個屬性的引用。這是一個例子:

class Secret{
    private StringBuffer secret = new StringBuffer("A Secret");
    public StringBuffer getSecret() {
        return secret;
    }
    public void setSecret(StringBuffer secret) {
        this.secret = secret;
    }
}
public class TestClass {
    public static void main(String[] args) {
        Secret secret = new Secret();
        StringBuffer saidSecret = secret.getSecret();
        saidSecret.append(":broken");
        System.out.println(secret.getSecret());
    }
}

當然。這個例子其實是個特例,因為我們獲取到的私有屬性的引用是StringBuffer類型,是可修改內(nèi)容的引用,但是如果是String類型的secret,那么我們就沒辦法這樣繞過setter去修改了,因為String類型的引用是不允許修改原值的。

private的訪問權(quán)限

我們都知道的是private屬性是私有的,那么到底是對象私有的還是類私有的呢?答案是后者,我們可以在類定義的內(nèi)部訪問私有屬性,即使這個屬性是其他對象的,只要是同類的即可,雖然我們很少這么使用,但是這卻深刻地說明java中的訪問權(quán)限在類的范疇上。下面說明了這樣一個問題:

class Secret {
    private String secret;
    public String getSecret() {
        return secret;
    }
    public void setSecret(String secret) {
        this.secret = secret;
    }
    public void readOtherSecret(Secret otherSecret) {
        System.out.println(otherSecret.secret);
    }
}
public class TestClass {
    public static void main(String[] args) {
        Secret secret1 = new Secret();
        secret1.setSecret("secret A");
        Secret secret2 = new Secret();
        secret2.setSecret("secret B");
        secret1.readOtherSecret(secret2);
        secret2.readOtherSecret(secret1);
    }
}
static究竟是什么意思

static的本意是靜態(tài)的,在java里面這個靜態(tài)的意思是指存在于靜態(tài)的類中的,而非程序開跑之后運行時的動態(tài)對象的,所以static的域?qū)傩砸埠?,方法也好,都是指那些存在于類中的域?qū)傩院头椒?,雖然該類對應(yīng)的對象中也存在static域?qū)傩院头椒ǖ目截?,但是屬于類的,對于它們的影響將會影響到整個類,換言之這些影響將會產(chǎn)生在所有的類對象中。
static的方法只能訪問static的域?qū)傩裕@個是怎么來的呢?其實就是因為static屬性是屬于整個類的,所以static的方法就不應(yīng)該影響特定的對象的屬性,在實現(xiàn)上說這個方法的隱式參數(shù)是不含有非static的方法的指向當前對象的this引用的,因此不能在static方法中訪問非static屬性。

java的方法參數(shù)傳遞

在C++中被反復(fù)向初學(xué)者討論的一個問題就是swap函數(shù)的效果,如果參數(shù)是值傳遞的,則最終傳入的兩個值是不會被交換的,如果是指針(引用)傳遞的,那么最終傳入的兩個引用是會被交換的,那么java中的方法參數(shù)傳遞是哪種情況呢?答案是前者,即值傳遞,又叫做拷貝實參傳遞,即運行在方法中的形式參數(shù)是傳遞給方法的真實參數(shù)的拷貝,而非直接傳入實際參數(shù)的指針。
下面的例子說明了這個問題:

class Some{
    private String someThing;
    public String getSomeThing() {
        return someThing;
    }
    public void setSomeThing(String someThing) {
        this.someThing = someThing;
    }
    public Some(String someThing) {
        super();
        this.someThing = someThing;
    }
}
public class TestClass {
    public static void swap(Some some1,Some some2){
        Some temp = some1;
        some2 = some1;
        some1 = temp;
    }
    public static void main(String[] args) {
        Some some1 = new Some("1");
        Some some2 = new Some("2");
        swap(some1, some2);
        System.out.println(some1.getSomeThing());
        System.out.println(some2.getSomeThing());
    }
}
類和對象初始化

我們都知道的是對象的初始化會引發(fā)類的初始化,初始化實現(xiàn)的方法也很多,最一般的初始化方法用于對象創(chuàng)建時對域?qū)傩缘某跏蓟?,稍微少見的類的靜態(tài)代碼塊用于對static靜態(tài)域?qū)傩赃M行初始化,而初始化代碼塊則用于對象的域?qū)傩裕ò╯tatic域?qū)傩裕┻M行初始化,那么一般而言,初始化的順序是怎樣的呢?
首先執(zhí)行靜態(tài)代碼塊初始化static類靜態(tài)域?qū)傩杂糜谠谡麄€類及其對象共享;
其次執(zhí)行初始化代碼塊初始化域?qū)傩砸酝瓿蓪ο蟮膫€性化的域?qū)傩缘某跏蓟?br>最后執(zhí)行對象的初始化方法以完成進一步的域?qū)傩缘某跏蓟?/p>

class Some{
    private String someThing;
    private static String staticSomeThing;
    static
    {
        staticSomeThing = "static";
        System.out.println("static block triggered");
    }
    {
        someThing = "some";
        System.out.println("init block triggered");
    }
    public String getSomeThing() {
        return someThing;
    }
    public void setSomeThing(String someThing) {
        this.someThing = someThing;
    }
    public Some(String someThing) {
        this.someThing = someThing;
        System.out.println("init method triggered");
    }
}
public class TestClass {
    public static void main(String[] args) {
        Some some1 = new Some("1");
    }
}

未完成。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65339.html

相關(guān)文章

  • Java基礎(chǔ)Java核心技術(shù)提示的易忽略 Ch5

    摘要:而并不是父類對象的引用,而只是給編譯器的一個提示性質(zhì)的標志?;蛘咦远x的提示在編譯的時候使用當前子類的父類定義的構(gòu)造器去初始化當前對象。所以,總結(jié)起來,的用法歸為兩種一是可以調(diào)用父類構(gòu)造器,二是可以調(diào)用父類方法。 開篇Java是一門不那么簡單也不那么復(fù)雜的語言,Java里面有很多問題和特性是容易被使用者忽視的,這些問題也許會難住新手,同時也許會是老手不小心跌入的無故之坑,只有精于對基礎(chǔ)...

    weapon 評論0 收藏0
  • Java基礎(chǔ)Java核心技術(shù)提示的易忽略 Ch6

    摘要:內(nèi)部類就是這樣一個情況,內(nèi)部類的出現(xiàn)雖然在運行時會被拆分為獨立的臨時類,但是在代碼層面加深了對代碼的理解難度,所以很難說其優(yōu)弊殊勝。 Core Java Volume 1 Key Points chap6 接口和抽象類的概念 接口和抽象類是Java繼承鏈的基礎(chǔ),其區(qū)別也較為明顯,在Java語言的設(shè)計中,允許接口的多實現(xiàn),但不允許抽象類的多繼承,這樣做符合簡潔明了的面向?qū)ο笤O(shè)計思路:也就...

    Chaz 評論0 收藏0
  • 從零開始學(xué) Kotlin 之「2」數(shù)據(jù)類型

    摘要:前言大家好,這里是從零開始學(xué)之數(shù)據(jù)類型,本文首發(fā)于公眾號,歡迎前往大家關(guān)注。輸出布爾類型中的布爾類型用表示,它的值有和。若需要可空引用時,布爾類型的值會被裝箱。此時程序會拋出異常最后從零開始學(xué)之數(shù)據(jù)類型到這里就結(jié)束了。 前言 大家好,這里是「從零開始學(xué) Kotlin 之『2 』數(shù)據(jù)類型」,本文首發(fā)于公眾號「Binguner」,歡迎前往大家關(guān)注。我會每周分享一些關(guān)于 Android 和...

    Awbeci 評論0 收藏0
  • Java 征途:行者的地圖

    摘要:老實說,當時一進入世界的大門就暈了,各種規(guī)范概念和英文縮寫詞能把人整的暈暈乎乎。等新的英文縮寫又出現(xiàn)了,一口老血還沒來得及噴出,又重新振作開始新的學(xué)習(xí)征程。 showImg(http://upload-images.jianshu.io/upload_images/1131767-1c5d16e39435df10.jpg?imageMogr2/auto-orient/strip%7Ci...

    dkzwm 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<