1. 程式人生 > 其它 >初學JAVA-10-java程式碼的組織結構

初學JAVA-10-java程式碼的組織結構

在上一篇筆記中,我們進行簡單的人機互動介紹時,引入了一個Scanner類,在所有使用到Scanner的類裡,在最開始都有一段程式碼 import java.util.Scanner;在此之前,我們的程式碼第一段總是public class XXXX。如果我們去掉import java.util.Scanner;看看會發生什麼情況

public class OfferServer{    
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int
time = 0; int sum = 0; while(scan.hasNextInt()){ int i = scan.nextInt(); time++; sum += i; } System.out.println("你輸入了"+time+"個數,它們的和是"+sum); } }


編譯的時候出錯了,因為沒有定義Scanner類,為什麼出現這個問題?我們需要從java的組織結構說起。

我們知道java是一個龐大的程式語言,它有很多很多的程式碼,很多很多個類。我們不可能把成千上萬個類都丟在一個資料夾裡,那樣你要找一個類修改一個方法一個屬性,簡直就是災難。所以java引入了包的概念(package),把功能類似、或者為了同一個目的而建立的不同的類,以包的形式整合和區分。就如果我們的行政區劃一樣。如果沒有省份的概念,沒有地市縣的概念,沒有鄉鎮村的概念,只有國家的概念,那我們的生活會是什麼樣子?你買個快遞要送到哪裡?東經多少度北緯多少度嗎?

所以在java裡面出現包的概念後,很好的把程式碼組織分類起來。我們在前面介紹public、protected、default、private這些修飾符時,曾經介紹過,deafult是包內可訪問的,protected是包內以及子類可訪問的,包的出現也讓許可權控制更加靈活。另外,在不同的包下,我們還可以建立名字相同的類,而正是由於這一點,我們在對類進行引用時,要加上它的全部路徑。一個累的全部路徑,應該是它的包路徑加上類名,比如我們引入的Scanner,它的路徑就是java.util.Scanner。它是java包下面的util包中的Scanner類。如果不使用全部路徑,VM無法知道你需要呼叫的是哪一個Scanner。就如同有兩個張三,如果我清晰的指明是北京市什麼什麼區什麼什麼衚衕的那個張三,你怎麼區分呢?而位於同一個包中的類,我們不需要特意宣告引入某個類,因為系統已經預設引入了這個包裡的全部類。

那為什麼我們對String的引用也不需要宣告呢?因為String是java.lang包下的類,這個包是java的核心包,當虛擬機器開始執行的時候,就會預設為我們匯入這個包。

我們在編寫java程式碼的時候,也要按照這個方式,將我們寫的java類按包的形式分別存放。比如我們準備把SportStar這個類放在com.dyz.business這個包下面,我們就要在SportStar這個類的第一行加上下面的程式碼

package com.dyz.business;

我們準備把OfferServer這個類放在com.dyz.server這個包下面,我們就要在OfferServer的第一行加上

package com.dyz.server;

一個類只能由一個package語句,而且這個語句必須是在最前面的。在這之後,是我們需要匯入的外部包,比如我們已經見過的Scanner。

匯入類需要使用import關鍵字,語法是

import 第一層包.第二層包.第三層包.....包含所需引用類的包.所需引用類類名;

另外我們可以使用*來表示某一個包裡的全部成員,比如 import java.util.*;這樣引用後,java.util包裡的所有的類都被匯入了,但是由於這樣會增加系統的壓力,所以我們並不建議這樣做。而且以後使用IDE程式設計,IDE工具會提醒我們要匯入的包是具體的哪一個,十分方便。

如果不使用import關鍵字,我們也可以在具體呼叫類的時候加上類的全名,比如

java.util.Scanner scan = new java.util.Scanner(System.in);

這樣做的好處是隻需要在引用的時候來呼叫,而不需要初始化的時候就呼叫。但是缺點是你必須在很多地方寫上全名,稍有錯漏就會報錯,而且現在很多第三方的包名實在是長...

類的儲存在程式碼結構上和在物理結構上相同,比如我們把SportStar放在了com.dyz.business包下面,那麼如果我們用javac -d E:\myjava\myclass SportStar.java的命令去編譯它,我們會發現它會在myclass資料夾下生成com包,然後在com包下面生成dyz包,然後在dyz包下面生成business包,最後再business包下面生成SportStar.class檔案。

如果一個類前面沒有使用package,那麼這個類會被放置在一個預設包中(default),也叫未命名的包(unmanaed package),對這個類進行編譯時,生成的class檔案一定會在當前路徑下。

到目前為止我們所有的程式碼都是在未命名包中,這是一個很不好的習慣,我們需要按照某種結構將我們的程式碼分類在不同包中,比如按照功能,或者按照分類。

上面我們提到使用 javac -d E:\myjava\myclass SportStar.java 的命令來編譯SportStar類,javac -d 的意思是指定class生成的路徑,我們使用了E:\myjava\myclass這個路徑,這是一個絕對路徑,如果我們每編譯一個類都要這樣寫,那都得累死,所以我們可以使用相對路徑 javac -d .\myclass SportStar.java 一個點表示當前路徑, .\myclass表示當前路徑下的myclass資料夾,由於我們當前路徑就是在E:\myjava這個資料夾下,所以這個可以直接使用當前路徑,如果我們當前路徑在C盤..那還是使用絕對路徑吧 ....

使用了javac -d命令以後,class類檔案被生成到了正確的包中,但是我們的java命令就不太方便了,我們需要使用

java -cp E:\myclass\com\dyz\server\ OfferServer來執行,或者使用

java -cp .\myclass com.dyz.server.OfferServer 來執行

來源:https://blog.csdn.net/weixin_42250593