1. 程式人生 > >[轉載] Java中 package 分析

[轉載] Java中 package 分析

部落格出處:

由於大家對package的使用存在太多困惑,我在這裡將自己對於package的使用的領悟進行一點總結:

  package中所存放的檔案

  所有檔案,不過一般分一下就分這三種

  1,java程式原始檔,副檔名為.java。

  2,編譯好的java類檔案,副檔名為.class。

  3,其他檔案,其他任何檔案,也稱為resource

  例如圖片檔案,xml檔案,mp3檔案,avi檔案,文字檔案……

  package是什麼

  package好比java用來組織檔案的一種虛擬檔案系統。package把原始碼.java檔案,.class檔案和其他檔案有條理的進行一個組織,以供java來使用。package是將檔案組織在一顆類似unix,linux檔案系統的樹結構裡面,它有一個根"/",然後從根開始有目錄和檔案,目錄中也還有檔案和目錄。

  package怎麼實現的呢?

  原始碼的要求最嚴格,而一旦原始碼自己聲明瞭在哪個package路徑之下,class也就有了自己在哪個package下面的資訊,就是那句程式開頭的"package xx.xx.xx"。有人問,為什麼要有這個資訊,直接放目錄結構裡不就好了麼?是啊,直接放目錄中確實可以找到.class和.java,但是如果我要輸出這個.class是屬於哪個package的,該怎麼辦?所以我們需要在.class裡面留一個package的資訊。如果我們要區分同樣名稱為A.class的類怎麼辦?所以我們需要在.class裡面留一個package的資訊。

  .java檔案是一個獨立的編譯單元,類似c++裡面的cpp檔案,但是它不需要.h檔案,只要.java就足夠了,一個.java檔案裡面可以包含一個public的類,若干package類(package類特徵是沒有任何訪問控制修飾),還有內隱類的話,則還可以包含若干protected和private的類。每個類,都會在編譯的時候生成一個獨立的.class檔案,所以.java和.class不是一對一,而是一對多的關係,不過.java和public的類是一對一的。所有這些.class,都由這個.java開頭的package語句來確定自己在package中的位置。

  package xx.bb.aa;

  說明這個.java編譯單元中的所有類都放到xx.bb.aa這個package裡面。而對應的,必須把這個.java檔案放在xx目錄下bb目錄下的aa目錄裡面。如果一個.java檔案沒有任何package語句,那麼這個.java裡面的所有類都在package的"/"下面,也稱之為default package。可以看出你一般從任何java教科書上寫的第一個hello world程式的那個類是在defaultpackage裡面的。有了package語句,情況就複雜一點了。這個編譯單元.java必須放在package名對應的目錄之下。而生成的class檔案也要放在對應的目錄結構之下才能正常運作。

  例如:

    /* A.java */ 
  package aaa.bbb.ccc; 
  public class A{ 
  B b=new B(); 
  } 
  /* B.java*/ 
  package aaa.bbb.ccc; 
  public class B{}

  編譯時候怎麼填引數呢?我根據package+檔名的格式來寫,

  javac aaa.bbb.ccc.A.java

  漂亮吧?可惜不工作。非要使用合法的路徑名才行:

  javac aaa/bbb/ccc/A.java

  但是你發現生成的class丟失了目錄結構,直接出現在當前目錄下……

  最好的方式是

  javac -d bin aaa/bbb/ccc/A.java

  這樣就會在當前目錄的bin目錄下看到完整的目錄結構以及放置妥當的class檔案。

  package與classpath不得不說的事

  對於java來講,所有需要的程式和資源都要以package的形式來組織和讀取。

  那麼classpath又是什麼呢?

  所有放到設定到classpath裡面的東西就是package所包納的資源。classpath的寫法如同path,只是裡面可以寫的一般只有zip檔案、jar檔案和目錄。多個元素之間用當前系統路徑分隔符間隔開了,linux上分隔符號是":",windows上是";"。classpath在java裡面是被一個叫做classloader的東西所使用的,classloader顧名思義,就是load class用的,但它也可以load其它在package裡面的東西。現在的java裡面classloader是有階層關係的,一般我們所常接觸到的CLASSPATH環境變數,javac,java的-cp,-classpath引數所給的classpath資訊是被appclassloader所使用的。而appclassloader其實是第三層的classloader,最高層的classloader叫做bootstrap classloader,它不是java寫的classloader,而是c++寫成的,第二層叫做extclassloader,預設包納是jre/lib/ext裡面的classes目錄和所有jar檔案作為內容。第三層才是我們命令列引數,或者不用命令列引數,用系統環境變數指定classpath的使用者app classloader,這是最基本的java se。如果是java ee,有了伺服器,容器,還有更多層的classloader,他們在app classloader的更下面,例如tomcat的某web應用程式的web-inf/lib中的jar,zip和classes目錄,是app之下好幾層的classloader使用的。

  你可以建立自己的classloader,都在app classloader之下,實際上tomcat本身也是這樣建立classloader的。分層的目的是為了安全,試想你加入搞了一個classloader,從網路上讀取class,而在裡面寫上格式化硬碟的程式碼,人家一讀執行,那不就掛了,所以分層之後,首先從最高層讀,沒有再往下找,找到就不著了。一般java所必須的rt.jar裡面的若干class,是在bootstrap classloader啟動的時候讀入的,而jmf使用的幾個jar,是在ext classloader裡面讀入的。也就是說,讀入這些class的時候,我們的appclassloader還在孃胎裡呢,所以你在CLASS PATH中指定rt.jar是完全愚蠢多餘的。java絕對不會到這裡找rt.jar,而bootstrapclassloader如果你不特別要修改,它是常量,不需要你care。

  import幹嗎用的?

  import只是一種讓你偷點懶少打字的方法,絕對不會影響你的classpath,這點你要好好記住,沒有非用import不可的理由,用了import也不會起到類似c裡面嵌入某檔案內容的效果,它只是一種省事的辦法。不在classpath中的class,任你再import也無濟於事。

  如果你不用import,你用ArrayList這個類,就需要寫

  java.util.ArrayList。

  而用了import java.util.ArrayList;的話

  以後程式碼中寫ArrayList就可以了,省事。import可以使用萬用字元*,*代表某package下所有的class,不包括子目錄。

  import java.awt.*

  不等於

  import java.awt.*

  import java.awt.event.*

  如果你要簡寫java.awt.event下和java.awt下的類,你不能偷懶,兩個都要import。

相關推薦

[轉載] Java package 分析

部落格出處: 由於大家對package的使用存在太多困惑,我在這裡將自己對於package的使用的領悟進行一點總結:   package中所存放的檔案   所有檔案,不過一般分一下就分這三種   1,java程式原始檔,副檔名為.java。   2,編譯好的java類檔案,副檔名為.cla

[轉載]Java的String,StringBuilder,StringBuffer三者的區別

什麽 syn 很多 如果 情況下 一個 建議 運行 r+ 最近在學習Java的時候,遇到了這樣一個問題,就是String,StringBuilder以及StringBuffer這三個類之間有什麽區別呢,自己從網上搜索了一些資料,有所了解了之後在這裏整理一下,便於大家觀看,也

javapackage(包)的使用理解

java中package(包)的使用理解 2017年02月05日 02:30:08 FengGLA 閱讀數:17755 標籤: java 更多 個人分類: java學習筆記 版權宣告:本文為博主原創文章,未經博主允許不得轉載。

轉載 java什麼是bridge method(橋接方法)

看spring-mvc的原始碼的時候,看到在解析handler方法時,有關於獲取橋接方法程式碼,不明白什麼是橋接方法,經過查詢資料,終於理解了什麼是橋接方法。 什麼是橋接方法 橋接方法是 JDK 1.5 引入泛型後,為了使Java的泛型方法生成的位元組碼和 1.5 版本前的位元組碼相相容,由編譯

javapackage命名規則,Java包(package)的命名規範

Java的包名都有小寫單片語成,類名首字母大寫;包的路徑符合所開發的 系統模組的 定義,比如生產對生產,物資對物資,基礎類對基礎類。以便看了包名就明白是哪個模組,從而直接到對應包裡找相應的實現。       由於Java面向物件的特性,每名J

Javapackage和import關鍵字

一些人用了一陣子的Java,可是對於 Java 的 package 跟 import 還是不太瞭解。很多人以為原始碼 .java 檔案中的 import 會讓編譯器把所

(轉載)Java字串常量和字串變數的區別

https://blog.csdn.net/u010617952/article/details/51781319         ava中字串物件建立有兩種形式,一種為字面量形式,如String str = "droid";,另一種就是使

[轉載]Java過載與重寫的區別

首先我們來講講:過載(Overloading)     (1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。 過載Overloading是一個類中多型性的一種表現。     (2) Java的方法過載,就是

Javapackage 和 import 的使用

1、打包–package 包名一般為小寫,而類名的第一個字母一般為大寫,這樣在引用時,可以明顯的分 辨出包名和類名。如果在類的定義之前沒有使用package定義包名,那麼該類就屬於缺 省的包。 1.1、 包的作用 可以更好的組織類,包與資料夾類似,資料夾可

Go與Javapackage的理解與區別

一.GO中package的使用  package是go程式中最基本的分發單位和工程管理中依賴關係的體現,一個"xx.go"原始檔必須屬於某個package,一個package可以拆成多個".go"原始檔; 每個".go"原始碼檔案開頭都擁有一個package宣告,表示該原

Java包(package)的命名規範,javapackage命名規則

 Java的包名都有小寫單片語成,類名首字母大寫;包的路徑符合所開發的 系統模組的 定義,比如生產對生產,物資對物資,基礎類對基礎類。以便看了包名就明白是哪個模組,從而直接到對應包裡找相應的實現。     由於Java面向物件的特性,每名Java開發人員都可以編寫屬於

[ 轉載 ] Java成員變量 和局部變量

ria 實例變量 靜態方法 範圍 跟著 類變量 完成 轉載 efault java語言支持的變量類型 類變量:獨立於方法之外的變量,用 static 修飾。 局部變量:類的方法中的變量。 實例變量(全局變量):獨立於方法之外的變量,不過沒有 static 修飾。

轉載JavaHashMap底層實現原理(JDK1.8)原始碼分析

近期在看一些java底層的東西,看到一篇分析hashMap不錯的文章,跟大家分享一下。 在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值

記一次對java對象在內存分析

數據 ots 字節對齊 位數 數據位 64位 數組 內存大小 特殊 java 對象 占內存大小 計算方式 及 常用類型的占用 HotSpot的對齊方式為8字節對齊 ----計算公式:(對象頭 + 實例數據 + padding) % 8等於0且0 <= padding

JavaArraylist源碼分析

如何 and 檢索 介紹 包括 com 這就是 pac 程序 前言:ArrayList作為我們常用的一個集合數據類型,我們在代碼中經常用它來裝載數據,可謂是和HashMap一樣常用的集合類型了。我們經常用它,那麽就有必須知道它的內部工作原理,比如它是如何添加進去數據的,它

JavaString連接性能的分析

order 幫助 執行 .get leg body near 應該 con  總結:如果String的數量小於4(不含4),使用String.concat()來連接String,否則首先計算最終結果的長度,再用該長度來創建一個StringBuilder,最後使用這個Stri

轉載JavaComparable和Comparator比較

import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一

Javaarraylist和linkedlist源代碼分析與性能比較

rom fin java 獲取 color () serializa padding previous Java中arraylist和linkedlist源代碼分析與性能比較 1,簡單介紹 在java開發中比較經常使用的數據結構是arra

JavaHashMap底層實現原理(JDK1.8)源碼分析

blank imp dash logs || 屬性 lte das ces 這幾天學習了HashMap的底層實現,但是發現好幾個版本的,代碼不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一樣,原來他們沒有指定JDK版本,很多文章都是舊版本J

JAVA包(package)的使用

訪問權限 .class eat java nbsp 組織 java t 返回 string   暑假荒廢了個把月,不過還是值得的,畢竟學會了遊泳!好了,言歸正傳,由於JAVA中的文件是按類組織的,因此經常會用到包(package)的概念,下面舉例子說明。   JAVA是面向