《 Java 編程思想》CH02 一切都是對象

用引用操縱對象

儘管Java中一切都看做爲對象,可是操縱的標識符實際上對象的一個「引用」。css

String s; // 這裏只是建立了一個引用,而不是一個對象
String s = new String("abcd"); // 使用`new`操做符來建立一個對象,並將其與一個引用相關聯
String s = "abcd"; // 字符串能夠直接用帶引號的文本初始化複製代碼

必須由你建立全部對象

使用new操做符建立一個對象html

存儲到什麼位置

由五個地方能夠存儲數據:java

  1. 寄存器:因爲寄存器數量有限,全部沒法直接控制
  2. 堆棧(棧):RAM中,存儲在棧中的數據必須明確知道其生命週期,一般局部存放對象引用和局部基本類型的變量。
  3. 堆:存放全部的對象
  4. 常量存儲:一般直接存放在代碼內部,其永遠不會改變
  5. 非RAM存儲:數據存放在程序以外,不受程序的控制,如流對象(System.out)和持久化對象(存放在磁盤的文件)。

特例:基本類型

一些比較小的,簡單的類型,若是放在堆中每每效率不高,因此這些類型不須要使用new來建立,而是建立一個「自動」變量來直接存儲「值」,並置於棧中。編程

Java 中全部基本類型所佔據存儲空間的大小都是明確的.數組

Java基本類型大小

  • 全部數值類型都有正負號
  • boolean類型所佔存儲空間的大小沒有明確,僅定義爲可以去字面值truefalse
  • 基本類型和其對應的包裝類之間能夠自動裝包、自動解包
  • Java 提供了兩個用於高精度計算的類:BigIntegerBigDecimal

Java 中的數組

  • Java 確保數組會被初始化,且會進行範圍檢查
  • 當建立一個數組對象時實際就是建立一個引用數組,而且每一個引用都會被自動初始化爲一個特定值null
  • 也能夠建立用來存放基本數據類型的數組,此時的初始化則是置零

永遠不須要銷燬對象

做用域

  • 做用域決定了在其內定義的變量的可見性和生命週期
  • 在做用域裏定義的變量只可用於做用域結束前
  • Java 中不容許「覆蓋」變量的可見性
{
    int x = 12;
    // x available
    {
        int q = 96;
        // Both x & q available
        int x = 96 // Illegal
    }
    // only x available
}複製代碼

對象的做用域

  • Java 對象不具有和基本類型同樣的生命週期,由new建立的對象,只要你須要,其會一直保留下去。
  • Java 使用垃圾回收器來監視new建立的對象,辨別並釋放那些不會再被引用的對象

建立新的數據類型:類

使用class來建立一個新的類型:函數

class ATypeName { }複製代碼

字段和方法

一旦定義了一個類,就能夠在類中設置兩種元素:字段(數據成員)和方法(成員函數)。字段能夠是任何類型的對象或基礎類型。每一個對象都有存儲其字段的空間,即普通字段不在對象間共享。工具

引用一個對象的成員的方式:objectReference.member編碼

基本數據類型的變量只有是類的成員時,才確保其得到一個默認值,不然的話,與C++同樣,該變量多是任意值(其實就是在堆仍是棧的問題嘛),不過這種狀況下Java會報編譯錯誤。spa

方法、參數和返回值

方法的基本組成部分包括:名稱、參數、返回值和方法體:code

ReturnType methodName ( /* Argument list */) {
    /* Method body */
}複製代碼

方法名和參數列表惟一地標識某個方法(合起來稱爲「方法簽名」)注意:方法簽名不包含返回值

Java 中的方法只能做爲類的一部分來建立,方法一般只有經過對象才能調用,且這個對象必須有這個方法。

參數列表

方法的參數列表指定要傳遞給方法什麼樣的信息,這裏採用的都是對象的類型,即包含指定的類型和名字,這裏傳遞的其實是引用,傳遞基礎類型則經過自動包裝來實現。

構建一個 Java 程序

名字可見性

爲了防止不一樣類庫中使用了相同的類名,Java 將反過來的域名做爲惟一標識符(即包名),如個人域名爲codeand.fun,則個人類庫則使用fun.codeand.utils的形式。

包名使用小寫

運用其餘構件

使用import導入想要的包:

import java.util.ArrayList;
import java.util.*; // 導入java.util下全部的類複製代碼

java.lang默認導入到每個Java文件中。

static 關鍵字

當聲明一個事物爲static時,就意味着這個域或方法不會與包含它的類的任何對象實例關聯在一塊兒,能夠理解爲類數據類方法

class StaticTest {
    static int i = 47;
    static void inc() { i++; }
}

int j = StaticTest.i; // 47
StaticTest st1 = new StaticTest();
StaticTest.inc();
StaticTest st2 = new StaticTest();
// st1.i == st2.i == 48 // 全部i都指向同一個存儲空間複製代碼

你的第一個 Java 程序

// HelloDate.java
import java.util.*;

public class HelloDate {
    public static void main(String[] args) {
        System.out.println("Hello, it's");
        System.out.println(new Date());
    }
}複製代碼

要建立一個獨立運行的程序,那麼該文件中必須存在某個類與該文件同名,且那個類必須又一個main方法,其形式如public static void main(String[] args)

編譯和運行

$ javac HelloDate.java // 編譯,產生一個 HelloDate.class 文件
$ java HelloDate // 運行複製代碼

註釋和嵌入式文檔

  • 多行註釋:/* something */
  • 單行註釋:// something

註釋文檔

Java 中能夠將代碼與文檔放到一個文件中,這樣有利於文檔的維護,爲了實現這一目的,這裏使用一種特殊的註釋語法來標記文檔,此外還有一個工具javadoc來提取註釋。javadoc的輸出是一個html

# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:05] C:1
$ javadoc HelloDate.java 
正在加載源文件HelloDate.java...
正在構造 Javadoc 信息...
標準 Doclet 版本 1.8.0_242
正在構建全部程序包和類的樹...
正在生成./HelloDate.html...
正在生成./package-frame.html...
正在生成./package-summary.html...
正在生成./package-tree.html...
正在生成./constant-values.html...
正在構建全部程序包和類的索引...
正在生成./overview-tree.html...
正在生成./index-all.html...
正在生成./deprecated-list.html...
正在構建全部類的索引...
正在生成./allclasses-frame.html...
正在生成./allclasses-noframe.html...
正在生成./index.html...
正在生成./help-doc.html...

# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:11] 
$ ls
allclasses-frame.html    HelloDate.class  index-all.html      package-list          stylesheet.css
allclasses-noframe.html  HelloDate.html   index.html          package-summary.html
constant-values.html     HelloDate.java   overview-tree.html  package-tree.html
deprecated-list.html     help-doc.html    package-frame.html  script.js複製代碼

打開index.html

註釋語法

全部 javadoc 命令都只能在由/***/組成的註釋中

javadoc 的註釋,只能爲publicprotected成員進行文檔註釋,而privatedefaule成員的註釋會被忽視掉

javadoc 主要有兩種形式:

  • 嵌入HTML
  • 文檔標籤
    • 獨立文檔標籤是一些以@字符開頭的命令,且置於註釋行的最前面(除了前導的 *
    • 行內文檔標籤則能夠在 javadoc 註釋中的任何位置,一樣以@開頭,但要在花括號內。

經常使用的標籤有:

  • @see:引用其餘類,會生成一個超連接條目(不會校驗該連接是否有效),超連接文本爲「See Also」
@see classname
    @see fully-qualified-classname
    @see fully-qualified-classname@method-name複製代碼
  • {@link package.class#member label}:與@see相似,不過是行內標籤,使用「label」來處理做爲超連接文本
  • {@docRoot}:該標籤產生到文檔根目錄的相對路徑
  • {@inheritDoc}:該標籤從當前這個類最直接的基類繼承相關文檔到當前文檔註釋中
  • @version:版本信息
  • @author:做者信息
  • @since:指定JDK版本最低爲多少
  • @param:表示參數含義,形式如@param parameter-name description
  • @return:描述返回值,形式如@return description
  • @throws:異常描述,該方法可能拋出的每一個異常都須要說明,形式如@throws fully-qualified-class-name description
  • @deprecated:指出一些舊特性已由改進的新特性所取代,不建議使用。調用一個標記爲@deprecated的方法,編譯器會發出警告。
// HelloDate.java
import java.util.*;

/** A class comment
 * Test comment
 * @author wuxiaobai24
 * @version 0.1
 */
public class HelloDate {
    /** a field comment */
    public int i;
    /**
     * a <strong>protected</strong> filed comment
     * <ol>
     *  <li>one</li>
     *  <li>two</li>
     *  <li>three</li>
     * </ol>
     */
    protected int p;
    /** a private field comment */
    private int j;

    /** A method comment
     * @param args args comment
     */
    public static void main(String[] args) {
        System.out.println("Hello, it's");
        System.out.println(new Date());
    }
}複製代碼

javadoc輸出1《-Java-編程思想》CH02-一切都是對象-javadoc輸出-2020-2-8-15-7-31《-Java-編程思想》CH02-一切都是對象-javadoc輸出2-2020-2-8-15-7-59

編碼風格

  • 駝峯式寫法
  • 標識符的第一個字符采用小寫,其他用大寫

練習

練習1

// Ex1.java
public class Ex1 {
    public int i;
    public char c;

    public static void main(String[] args) {
        Ex1 e = new Ex1();
        System.out.println(e.i);
        System.out.println(e.c);
    }

}複製代碼

練習2

// Ex2.java

public class Ex2 {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}
複製代碼

練習3 & 練習4 & 練習5

// Ex3.java

class DataOnly {
    int i;
    double d;
    boolean b;
}

class ATypeName {

}

public class Ex3 {
    public static void main(String[] args) {
        ATypeName a = new ATypeName();
        DataOnly d = new DataOnly();
        d.i = 1;
        d.d = 2.0;
        d.b = false;
        System.out.println(d.i);
        System.out.println(d.d);
        System.out.println(d.b);
    }
}複製代碼

練習6

// Ex4.java

public class Ex4 {
    int storage(String s) {
        return s.length() * 2;
    }
    public static void main(String[] args) {
        String s = new String("Hello");
        Ex4 e = new Ex4();
        int len = e.storage(s);
        System.out.println(len);
    }
}複製代碼

練習7 & 練習8

// Ex7.java

class StaticTest {
    static int i = 47;
}

class Incrementable {
    static void increment() { StaticTest.i++; }
}

public class Ex7 {
    public static void main(String[] args) {
        StaticTest st1 = new StaticTest();
        Incrementable.increment();
        StaticTest st2 = new StaticTest();
        System.out.println(st1.i);
        System.out.println(st2.i);
        System.out.println(StaticTest.i);
    }
}複製代碼

練習9

// Ex9.java

public class Ex9 {
    public static void main(String[] args) {
        int i = 24;
        Integer bi = i;
        System.out.println(i);
        System.out.println(bi);
        // ....
    }
}複製代碼

練習10

// Ex10.java

public class Ex10 {
    public static void main(String[] args) {
        if (args.length == 3) {
            System.out.println(args[0]);
            System.out.println(args[1]);
            System.out.println(args[2]);
        }
    }
}
複製代碼

練習11

// Ex11.java

class AllTheColorsOfTheRainbow {
    int anIntegerRepresentingColors;

    void changeTheHueOfTheColor(int newHue) {
        anIntegerRepresentingColors = newHue;
    }
}

public class Ex11 {
    public static void main(String[] args) {
        AllTheColorsOfTheRainbow allTheColorsOfTheRainbow = new AllTheColorsOfTheRainbow();
        allTheColorsOfTheRainbow.changeTheHueOfTheColor(1);
        System.out.println(allTheColorsOfTheRainbow.anIntegerRepresentingColors);
    }
}複製代碼

本文首發於Code & Fun

相關文章
相關標籤/搜索