如何描述屬性

什麼是屬性?

前面我們說過,屬性描述一個對象“什麼樣子”。當我們描述一個人或物的“樣子”時,往往會說明其可測量的一些特徵,例如一個人有多高、多重,一輛車有多長、什麼顏色等等。
因此,當我們設計一個類時,可以先用我們人類的語言描述一下這個類,然後把描述特徵的名詞和形容詞部分提取出來,進一步提煉就是屬性。
例如,我們描述一個學生:他的姓名是張三,性別是男,身高是1.75米,體重是79千克,學號是20005,Java課成績是88分……
如果我們把這些特徵做成一個表格,就是:

A B
姓名 張三
性別
身高 1.75米
體重 79千克
學號 20005
Java課成績 88

當我們把這些描述寫成表格形式時,什麼是屬性就更加清晰了:A列就是屬性,B列就是對應的值。那麼我們需要將A列中的內容設計到類中。

可能有些朋友會發現,姓名、身高等都是名詞,前面我還提到了形容詞,什麼時候會用到形容詞呢?比如我們需要篩選“高個子”的人,那麼就可以爲其設計一個“是否高個”的屬性——這個“高”不就是個形容詞嗎?所以形容詞也可以是一種屬性。
但需要注意的是,只選擇必要的屬性即可,無需設計用不到的屬性。

變量和常量

變量

所有的屬性都是通過變量的形式表現的。變量,顧名思義,就是一個可以變化的量。
在定義變量時,計算機會爲這個量分配一個內存空間,這個變量的值就保存在這個內存空間中。爲了便於引用這個內存空間,我們會給這個變量起個名字,就是變量名,計算機會自動把變量名和這個內存空間關聯起來,這樣我們就可以通過變量名來使用這塊內存空間中的值了。例如我們定義了一個變量,名爲name,對應的內存空間中保存了值10,當我們把name增大10時,實際上是將其對應的內存空間中的值增大了10,也就是變成了20。
我們在Java中定義變量時,會使用以下形式:

數據類型名  變量名;
變量名=變量值;

數據類型,我們在後面會講到,現在我們需要知道的是:我們必須在程序中指明某個變量(對應的值)的類型是什麼,這樣計算機才能正確處理它們。
數據類型名 變量名;,這一部分,一般稱之爲聲明變量,也就是告訴計算機,我們需要一個變量,並通過特定的名稱來引用它,但還沒有在其中存放具體數據,或者說,此時變量中還沒有明確的值。變量名=變量值;,這一部分,一般稱之爲賦值或者初始化,變量不經過初始化就沒有確定的值,也就不能被使用。
所以,定義一個變量,需要先聲明,再初始化,然後才能使用。在使用過程中,我們使用變量名引用它,並可以修改其中的值。

爲了方便起見,有時我們可以把聲明和初始化放到一起來:

數據類型名  變量名=變量值;

常量

在漢語中,與“變”對應的,就是“常”,也就是不變的意思。有變量,自然就有常量。從名字上可以看出來,常量就是保持一個值不會變化的量。常量的定義方法是:

final 數據類型名  變量名=變量值;

和定義變量很像,只是前面多了一個final關鍵字。需要注意的是,常量只能賦值一次

此外,我們寫在程序中的一些具體值,例如50034.95'X'等,其值也無法改變,我們一般稱之爲字面常量

02

 

 

數據類型

數據類型,對應的是計算機中該類數據的保存、修改或計算等操作的集合。在計算機中,不同類型的數據,例如整數、小數或者字符,在計算機中表示的方法不同,修改或者計算的方法也不同,所以Java爲每一種數據都定義了一個數據類型,以便計算機操作它們。在這裏,我們不深入探討每種數據類型在計算機中的具體實現,有興趣的朋友,可以自行查找資料瞭解。我們只需要記住,不同的數據類型,在計算機中的保存和使用方法都不相同。因此,我們必須在編程時明確指定變量的數據類型。
在Java中數據類型分爲基本數據類型引用數據類型。基本數據類型不可分解,而且可以被計算機硬件直接計算;引用數據類型是由多個基本數據類型或引用數據類型組合而成,在一些書籍和文章中也稱爲“複合類型”或者“複雜類型”。我們之前講過的“類”,就是一種引用數據類型。在本文中,我們主要介紹基本數據類型和一種比較常用的字符串類型,以及一種比較簡單的引用數據類型:數組。

基本數據類型

Java中定義了四大類基本數據類型(及其子類型):

  • 整數類型:byte,short,int,long
  • 浮點數類型:float,double
  • 字符類型:char
  • 布爾類型:boolean

整型

用於處理整數的類型就是整數類型,簡稱整型。Java中所有的整型都是帶有符號的(區分正負值),爲了適應不同的場合,Java中定義了四種整型:

名稱 關鍵字 佔用內存空間 表示數據範圍
字節型 byte 1字節 -128 ~ 127
短整型 short 2字節 -32768 ~ 32767
整型 int 4字節 -2147483648 ~ 2147483647
長整型 long 8字節 -9223372036854775808 ~ 9223372036854775807

我們必須根據應用場景,選擇合適的類型。例如我們要記錄一個學生的年齡,可以考慮使用字節型,因爲一般人的壽命都在127歲以內,所以使用一個字節的內存空間(字節型數據)就可以保存年齡了。那如果使用其它類型會怎麼樣?另外三種數據類型的表示範圍都比字節型大,所以功能上不會有任何問題。但在資源佔用方面,就會出現浪費:如果使用整型變量保存年齡,每增加一個人,僅年齡一項,就會浪費3個字節的存儲空間,那如果系統中保存了一百萬人的數據呢?如果更多呢?如果考慮到其它代碼也存在類似空間浪費問題呢?
所以,正確選擇數據類型,可以在保證滿足軟件功能的前提下,降低硬件資源的浪費,可以有效提高計算機整機工作效率。
但是,如果選擇了錯誤的數據類型,就會出現一些不可思議的問題。
我們現在已經見識到了四種整數類型的關鍵字了(byte,short,int,long),該怎麼使用它們呢?還記得怎麼定義變量嗎?
對,是數據類型名 變量名=變量值;,在編程過程中,我們就可以根據需要,把數據類型名用具體的數據類型的關鍵字替代了。例如,我們需要定一個整型變量,值爲1000,就可以寫成int i=1000;,這裏變量名爲i。如果需要定義一個短整型數據,就可以:short s=400;
需要注意的是:

  1. 給變量的值不能超過變量數據類型所能表示的範圍,否則會出錯。例如,爲一個字節型變量賦值200,就是錯誤的,因爲byte類型最大隻能表示127;
  2. Java中的整數默認爲是int類型,所以對於超過int所能表示範圍的整數,都需要在數值最後加上字母L。大小寫均可,但最好使用大寫,因爲小寫l在很多字體中,和數字1很相似。例如:long l=123456789876L

此外,我們還可以使用不同的前綴表示不同的進制:

  • 沒有任何前綴,表示十進制數據,如2345
  • 前綴爲0b,表示二進制數據,如0b010101
  • 前綴爲0,表示八進制數據,如043
  • 前綴爲0x,表示十六進制數據,如0x12abc

實型

實型就是實數類型,也叫作浮點型,用於表示有小數的數據,有單精度實型float(佔用4字節內存)和雙精度實型double(佔用8字節內存)兩種。字面常量中的實數默認爲雙精度實型,所以單精度實數後面需要加上後綴Ff,例如5.6F
其中float類型的表示範圍是-3.40E+38 ~ +3.40E+38,最精確可以表示到3.40E-38這個級別,double類型的表示範圍是-1.79E+308 ~ +1.79E+308,最精確可以表示到1.79E-308。(均爲科學計數法,3.40E38表示3.40*10的38次方)。
雖然實型可以表示小數,但這不意味着實型數據就是精確的。float類型的有效數字爲7~8位,double類型的有效數字爲16~17位。所以,低精度數據可以使用實型,高精度數據必須用其他方法來表示。

字符型

在計算機中只能使用二進制數據,或者能夠轉化爲二進制形式的數據。字符不能夠直接轉換爲二進制,所以科學家們爲計算機設計了一種方法:將字符和二進制編號一一對應,這樣,當計算機處理字符時,就是在處理對應的二進制編號。因此,在特定情況下,字符型數據可以像整數一樣進行運算。
在Java中,字符型char採用Unicode編碼方案,默認佔用兩個字節的存儲空間。
在程序中,字符數據要加上單引號。我們定義字符型變量時,可以寫成char c='A';
我們只需要在單個字符外面加上單引號,它就是Java中的字符數據了。但有個問題:特殊字符怎麼表示?例如回車、製表符等,可以用鍵盤打出,也很常用,該怎麼表示呢?在Java中使用轉義字符來表示這些特殊字符。
轉義字符由\開頭,後面跟着一個或多個字符,但仍被計算機識別爲一個字符。
常見的轉義字符包括:

  • \" 表示字符"
  • \' 表示字符'
  • \\ 表示字符\
  • \n 表示換行符
  • \r 表示回車符
  • \t 表示Tab
  • \u#### 表示一個Unicode編碼的字符,####爲十六進制的Unicode字符編號

需要注意的是,如果不考慮編碼方案,單看字符型數據,其實就是16位二進制數據,因此字符型數據可以轉換爲整數。在後面我們會進一步學習這個特性。

布爾型

布爾型boolean,也叫作邏輯型,佔1位存儲空間(是一位,1bit,不是一字節)。它也只有兩個值:true和false,即真和假。定義布爾類型變量:boolean b=true;
一般在進行條件判斷時使用布爾類型數據,例如4>5,判斷結果就是false;80>50,判斷結果則是true。

下面,我們來編寫一個關於基本數據類型的程序:

public class DataType {
    public static void main(String[] args) {
        byte b=127;//定義字節型變量b,值爲127
        short s=300;//定義短整型變量s,值爲300
        int i=2000;//定義整型變量i,值爲2000
        long l=123456789876L;//定義長整型變量l,值爲123456789876L
        //輸出各個類型的變量值
        System.out.println("字節型數據:"+b);
        System.out.println("短整型數據:"+s);
        System.out.println("整型數據:"+i);
        System.out.println("長整型數據:"+l);
        //實數類型
        float f=3.14F;
        double d=234.897;
        System.out.println("單精度實數f="+f);
        System.out.println("雙精度實數d="+d);
        //字符型
        char c='t';
        System.out.println("字符型數據c="+c);
        //轉義字符
        System.out.println(i+"\t"+b+'\n'+d+'\t'+s);
        //布爾類型數據
        boolean x=true;
        System.out.println("布爾類型數據x="+x);
    }
}

數據類型的表示範圍

數據類型的表示範圍非常重要,要正確選擇數據類型,就必須知道每種類型的表示範圍。但我們無需強記下來,這些量已經內置到了Java平臺中了。請大家編寫並運行以下程序:

public class Range{
    public static void main(String[] args) {
        // byte類型
        System.out.println("基本類型:byte 佔用內存:" + Byte.SIZE+"bit");
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        // short類型
        System.out.println("基本類型:short 佔用內存:" + Short.SIZE+"bit");
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        // int類型
        System.out.println("基本類型:int 佔用內存:" + Integer.SIZE+"bit");
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        // long類型
        System.out.println("基本類型:long 佔用內存:" + Long.SIZE+"bit");
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        // float類型
        System.out.println("基本類型:float 佔用內存:" + Float.SIZE+"bit");
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        // double類型
        System.out.println("基本類型:double 佔用內存:" + Double.SIZE+"bit");
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        // char類型
        System.out.println("基本類型:char 佔用內存:" + Character.SIZE+"bit");
        // 以數值形式而不是字符形式輸出Character.MIN_VALUE
        System.out.println("最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE);
        // 以數值形式而不是字符形式輸出Character.MAX_VALUE
        System.out.println("最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE);
    }
}

在這裏,我們使用了包裝類來查看每種類型所能表示的最大值和最小值。關於包裝類,我們會在後面學到。
這裏,整型的最小值都是負值,而實型的最小值都是正數。這是由於實型的最小值指的是該類型能表示的最小的非零數值,我們可以理解爲精確度。

字符串

字符串(String)是一個或多個字符的組合,這些字符要用雙引號括起來,在Java中有專門的類來處理字符串,即String類,也就是一種引用數據類型。由於字符串類型非常常見,因此我們提前來了解一下字符串。
引用數據類型的數據不叫做變量,叫做對象。既然是對象,按照之前學習的內容,定義一個字符串對象的方法,肯定是new一個了。由於字符串非常常用,Java還提供了一些更加便利的方法。我們可以看這個程序:

public class StringDemo {
    public static void main(String[] args) {
        // 空字符串對象,即該對象沒有任何內容
        String s1 = new String();
        // 非空字符串,但內容爲空字符串,該對象中包含一個空字符串
        String s2 = new String("");
        // 非空字符串,內容爲不可見內容,如製表符、空格等
        String s3 = new String("\t");
        // 非空字符串,內容爲abcd
        String s4 = new String("abcd");
        // 由於字符串非常常用,所以Java還允許我們這樣定義字符串對象:

        String s5 = ""; // 空字符串,不包含任何字符
        String s6 = "A"; // 包含一個字符
        String s7 = "JAVA\n"; // 包含5個字符,其中一個是轉義字符,回車符
        String s8 = "你好 java"; // 包含7個字符,其中有一個空格
        String s9 = "我叫\"張三\"";// 內容爲 我叫"張三",因爲雙引號要用來表示字符串的開始和結束,所以其中的雙引號必須使用轉義字符
        // 字符串中可以包含轉義字符
        String s10 = "海上生明月\n天涯共此時";
        // 我們還可以把多個字符串或者合適的變量和其它對象用加號(`+`)連接成一個字符串,如:
        int i = 9;
        String s11 = "變量的值是";
        System.out.println(s11 + i + "。");        // 輸出 變量的值是9。
    }
}

02

 

 

數組

我們經常會處理諸如求若干個數據的總和、平均值等問題,如果我們爲每一個數據都定義一個變量,程序寫起來會很麻煩。例如我們現在要處理60個同學某門課程的考試成績:

byte s1=80;
byte s2=90;
byte s3=59;
......
byte s60=89;

爲了簡化編程並有效組織數據,我們可以使用數組。
數組是最簡單的一種引用數據類型,它可以用於保存多個同類型數據。無論是基本數據類型還是複雜數據類型,只要這些數據類型相同,都可以使用數組來處理他們。

定義數組

定義數組是這樣的:

int[] a;//在數據類型名後面加上方括號[],表示定義的是數組;a是數組名
a=new int[5];//new用於爲數組a分配內存空間,int[5]表示5個int類型數據的空間,即a的內存空間大小

也可以寫成int[] a=new int[5];

引用數組元素

數組中保存的數據,就是數組元素。引用數組元素時,我們需要指明引用的是哪個數組的哪個元素,格式是:
數組名[索引值],數組名用於說明使用的是哪個數組中的元素,索引值用於說明該元素在數組中的位置編號(有些書中不用索引值這個名字,而使用“下標”)。
索引值是從0開始的。a[0]指的是數組a中的第1個元素,a[1]指的是數組a中的第2個元素,餘此類推。
如果爲數組a分配了5個元素的空間(上面程序中的new int[5]部分),那麼a[5]就是指數組a中的第6個元素,程序就會出錯。
我們在編寫程序時,可以使用“數組長度”來驗證索引值是否合法。
數組長度就是一個數組中元素的個數。前面的代碼中,數組a可以存放5個元素,因此數組a的長度就是5。如果數組長度是L,那麼合法的索引值就是0到(L-1)。
數組長度是在定義數組時確定的,如代碼new int[5]中,數組長度就是5。如果一個程序中數組比較多,我們就需要想辦法記下每個數組的長度,比較麻煩,在Java 中,我們可以用數組的length屬性來獲取數組長度,用法是:數組名.length。例如a.length指的就是數組a的長度,也就是5。

需要注意的是,Java的編輯器無法發現索引值錯誤的問題,但運行時會報錯,因此編程時對數組元素的引用要特別注意。

爲數組元素賦值

我們會引用數組元素,就可以爲數組元素賦值了——不是爲數組賦值,而是爲其中的元素賦值。例如:

a[0]=45;
a[1]=78;
a[4]=90;

我們在程序中爲數組a的第1、2、5個元素賦值。其它沒有賦值的元素怎麼辦呢?它們會擁有一個默認值,關於默認值,我們隨後就會講到。
如果我們在程序一一爲每個元素賦值會很麻煩,所以可以在定義數組時直接爲數組元素賦值:

int[] a = new int[]{68,79,91,85,62};//數組a中的元素的值依次是68,79,91,85,62,數組長度是5
int[] b = {68,79,91,85,62};//該寫法和上一行效果完全一樣

不過這種寫法僅限於沒有使用new爲數組分配存儲空間的情況下,如果這樣寫:

int[] a=new int[5];
a={1,2,3}

程序就會出錯。

通常做法

一般來說,我們不會一個一個引用數組的元素,那就和使用變量沒有區別了。通常的做法是,我們會使用循環和分支等流程結構來設計程序,讓計算機根據自動操作數組元素,從而大大降低我們的編碼任務量。在後面的課程中,我們學習過流程結構後,將再來研究如何自動處理數組中的元素。

二維數組

前面介紹的數組是一維數組,因爲這種數組中的所有元素在內存中依次存放,就像一條線一樣,因此稱爲一維數組。就像下面這樣:

如果是比較複雜的數據結構,可以使用二維數組。二維數組就像一張表格一樣:

9 8 7 6 3
12 34 22 66 44
34 22 99 60 40
21 67 83 62 98

它可以表示什麼呢?還以成績爲例,它可以表示爲若干個組中每一個人的成績。每一行可以表示一個組,每一行中的每個數據表示該組中每個人的成績。
凡是可以用表格存儲的數據,都可以考慮使用二維數組。
二維數組的定義方式和一維數組很像,但要寫兩個[],例如:

int[][] a;//在數據類型名後面加上兩個方括號[][],表示定義的是二維數組;a是數組名
a=new int[5][3];//new int[5][3]表示爲數組分配內存空間,可以理解爲5行3列,一共15個數據

當需要引用元素時,可以使用a[2][2]的形式,表示第3行第3列的元素(想想爲什麼不是第2行第2列?因爲編號是從0開始的)。如果用表格的形式表示,就像下面這樣:

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
a[3][0] a[3][1] a[3][2]
a[4][0] a[4][1] a[4][2]

02

 

 

默認值

Java中要求變量必須先定義、後賦值(初始化),然後才能使用。但在實際編程過程中,這樣做比較麻煩,所以,做爲屬性的變量,以及數組中的元素,在生成時會擁有一個默認值。規則如下: 數據類型 默認值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
對象 null
boolean false

我們可以設計一個只包含屬性的類,Test.java,和一個包含主方法的類,DefaultValue.java,來看看數組和屬性的默認值是什麼樣的。Test.java代碼如下:

//該類只包含屬性,並且均未初始化
class Test{
    boolean bool;
    byte by;
    char ch;
    double d;
    float f;
    int i;
    long l;
    short sh;
    //String是字符串類型,是Java內置的一個類,在這裏代表引用數據類型
    String str;
}

DefaultValue.java的代碼如下:

public class DefaultValue {
    public static void main(String[] args) {
        //創建數組
        short[] a=new short[10];
        //輸出數組元素,查看其默認值
        System.out.println("a[1]="+a[1]);
        //創建Test類的對象
        Test t=new Test();
        //沒有初始化各個屬性,直接輸出它們的值
        System.out.println("boolean類型默認值:" + t.bool);
        System.out.println("byte類型默認值:" + t.by);
        System.out.println("char類型默認值:" + t.ch);
        System.out.println("double類型默認值:" + t.d);
        System.out.println("float類型默認值:" + t.f);
        System.out.println("int類型默認值:" + t.i);
        System.out.println("long類型默認值:" + t.l);
        System.out.println("short類型默認值:" + t.sh);
        System.out.println("string類型默認值:" + t.str);
    }
}

02

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章