從C++到Java的注意點(上)

來源:互聯網
上載者:User
文章目錄
  • package access許可權
  • protected許可權
  •     Java對象建立
   1.Java的編譯運行 

       Java中的package概念相當於C++中的namespace的概念。但是java會把package的名字和檔案系統中目錄結構對應起來,也即如果你申明了某個package的名字為com.tij.everythingisobj,那麼你的檔案系統中必須建立com/tij/everythingisobj這樣一個目錄結構,所有屬於這個package的java原始碼都會放在這個目錄下!之所以要這麼做,是為了jvm載入運行java代碼方便,可以根據package並結合CLASSPATH來裝載*.java編譯後的*.class在什麼位置。

例如EveryObject .java:

package com.tij.everythingisobj;

public class EveryObject {

 public static void main(String[] args) {

 }
}

 

javac  com/tij/everythingisobj/EveryObject.java

 首先用javac來編譯*.java檔案,產生*.class。可以把這些*.class打包成一個jar包,但必須保留完成的路徑名稱。

 

java com.tij.everythingisobj.EveryObject

產生*.class後,可以用在命令列中用java命令告訴jvm要裝載哪個類並運行,此時jvm會根據CLASSPATH中設定的路徑去搜尋你要啟動並執行類。如果你的CLASSPATH為 c:/; ./,那麼jvm會在 c:/com/tij/everythingisobj和./com/tij/everythingisobj目錄下搜尋EveryObject類,並裝載它的靜態main函數運行。你也可以在java命令中加入 -cp來指定CLASSPATH.

java -cp ./everyobj.jar  com.tij.everythingisobj.EveryObject

如果你要運行*.jar檔案,那麼必須把你的*.jar檔案包括在 -cp選項中。開啟*.jar你可以看到裡面也是完整的路徑名,目錄西面都是*.class。跟直接放在檔案系統上執行是類似的。

 

2.Java的package

   所有*.java都要屬於某一個package,一個package可以擁有n個 .java檔案,每個.java檔案中只能有一個public的類。而且這個類名必須與.java的名字一樣。同一個package的 *.java檔案都會放在檔案系統的同一個目錄下面。如果在*.java中沒有指定package name,那麼*.java屬於它所在目錄的預設的package,一般不用預設package。

 

2.Java的許可權package access許可權

    Java的許可權有 public, protected, package access, private。比較陌生的是package access,當類或者類成員沒有加任何許可權限定符時,這個類或者類成員的許可權就是package access。也就是說只有在同一個package中可以訪問,在不同package中是無法訪問的。

 

例如在package com.tij.everythingisobj 中定義了一個StaticObject類,裡面有一個 packageAccess()函數未加任何許可權說明,那它就是package access的許可權。

 

 

 

 在同一個package中( com.tij.everythingisobj ),staticObject對象可以訪問packageAccess

在不同package中,sobj對象是無法訪問packageAccess函數的,因為這個函數僅在 com.tij.everythingisobj package中可見。

 

 

 

protected許可權

    protected許可權提供package access存取權限,但在繼承時不同package中的子類需要訪問父類中某些方法而這些方法又不希望最終暴露給使用者,所以就引入需要protected許可權,因為package access只能在同一個package中訪問。  因為protected具有package access許可權,所有在同一package中protected成員是可以讓問,這一點不同於C++。你可以把上例中的packageAccess函數加上protected許可權,結果是一樣,在同一個package中可以訪問,在不同package是不能訪問。

 

3.Java對象的建立和銷毀    Java對象建立

    Java不能在本地棧上建立非primitive的對象,任何對象必須通過new在堆上建立,而且必須在對象名後跟上一對括弧,new Object(),C++是非必須的。有java自動維護建立對象的引用計數器,當計數器為0時該對象可能被gc自動回收,所以java沒有delete操作符。當對象建立時,如果你要在建構函式中調用另一個建構函式,那麼你必須使用 this(argument ....)來調用!

       在建構函式調用之前,類中的所有靜態對象會被率先初始化。java除了靜態對象,還有靜態代碼塊用 static {}來表示,大括弧中的代碼也會率先被初始化,這些靜態對象只會被初始化一次。無論是靜態對象還是非靜態對象,它們都可以再申明時就初始化,甚至可以調用函數來初始化。

  java中初始化順序是  靜態成員->非靜態成員->建構函式

一下代碼最終列印

in s()
in f()
Static_Object()

 

 

    Java對象銷毀

    java對象都是有gc來銷毀的,當gc發現記憶體不夠時會釋放部分引用計數為0的對象。釋放前會調用對象的finalize函數!但程式員不能依賴finalize,因為直到程式結束,gc都有可能不釋放任何對象。

 

Java雜項

  java的每個類都可以有main函數,方便做測試.

    java ==  和 !=  操作符用於比較引用,所以即使兩個對象的內容一樣,這兩個對象也是不相等的!如果要比較內容是否相同需要調用 equals,equals預設操作也是比較引用而不是內容,所以你需要覆蓋這個函數來自己實現內容的比較!

  import static  com.tij.* 引入類的靜態成員, 從C/C++角度看相當於引入一些“全域”函數。

   >>>無符號右移,不管操作對象是否有符號,高位總是補0

 

  for( int i: array) 相當於foeach,枚舉array的所有元素。

數組的申明為 int []array或者int array[],數組有一個內建變數, array.length來指明數組的長度。數組在建立時可以初始化 int []array = new int[]{1,2,4};
enum Meat{PIG, DOG, CAT},引用時都需要加Meat.PIG, 除了在switch語句中,可以直接使用PIG。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.