1. 程式人生 > >[Java] Introduction to Java Programming 筆記 Chapter 9. 物件和類

[Java] Introduction to Java Programming 筆記 Chapter 9. 物件和類

如果一個檔案含有兩個類,只有一個類可以為public,public 類和檔名同名,但此檔案編譯後,將生成兩個.class 檔案,一個類對應一個class檔案。

匿名物件:建立一個物件,但是並不將其引用賦給變數

new Circle();
// or
System.out.println("Area is " + new Circle(5).getArea());

資料域的預設值:

  • 引用型別:null
  • 數值型別:0
  • boolean型別:false
  • char:\u0000

區域性變數沒有預設值。

可見性修飾符:
public: 對任意類可見,使用時仍要加 import
省略:對當前package可見
private

:私有, 同C++

為防止對資料域的直接修改,資料域應宣告為私有,稱為資料域封裝。同時,為了能訪問它們,必須提供getter(accessor) 和 setter(mutator)), 約定簽名如下:

// getter
public returnType getPropertyName()
// getter, 因為是返回boolean型別,get變成is
public boolean isPropertyName()
// setter
public void setPropertyName(dataType propertyValue)

物件陣列的宣告和建立:

   Circle[] circleArray = new
Circle[10];

初始化:

for (int i = 0; i < circleArray.length; i++) {
    circleArray[i] = new Circle();
}

物件陣列作為引數傳遞的例子:

public class TotalArea {
    /** Main method */
    public static void main(String[] args) {
        // Declare circleArray
        CircleWithPrivateDataFields[] circleArray;

        // Create circleArray
circleArray = createCircleArray(); // Print circleArray and total areas of the circles printCircleArray(circleArray); } /** Create an array of Circle objects */ public static CircleWithPrivateDataFields[] createCircleArray() { CircleWithPrivateDataFields[] circleArray = new CircleWithPrivateDataFields[5]; for (int i = 0; i < circleArray.length; i++) { circleArray[i] = new CircleWithPrivateDataFields(Math.random() * 100); } // Return Circle array return circleArray; } /** Print an array of circles and their total area */ public static void printCircleArray( CircleWithPrivateDataFields[] circleArray) { System.out.printf("%-30s%-15s\n", "Radius", "Area"); for (int i = 0; i < circleArray.length; i++) { System.out.printf("%-30f%-15f\n", circleArray[i].getRadius(), circleArray[i].getArea()); } System.out.println("—————————————————————————————————————————-"); // Compute and display the result System.out.printf("%-30s%-15f\n", "The total area of circles is", sum(circleArray)); } /** Add circle areas */ public static double sum(CircleWithPrivateDataFields[] circleArray) { // Initialize sum double sum = 0; // Add areas to sum for (int i = 0; i < circleArray.length; i++) sum += circleArray[i].getArea(); return sum; } }

輸出結果:

Radius                        Area           
89.893550                     25386.740016   
97.250042                     29711.834270   
62.785025                     12384.030480   
29.297762                     2696.613926    
2.639443                      21.886411      
—————————————————————————————————————————
The total area of circles is  70201.105103   

以下4段程式碼:
A.

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = null;
        m1(date);
        System.out.println(date);
    }
    public static void m1(Date date) {
        date = new Date();
    }
}

輸出:

null

B.

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = new Date(1234567);
        m1(date);
        System.out.println(date.getTime());
    }
    public static void m1(Date date) {
        date = new Date(7654321);
    }
}

輸出:

1234567

C.

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = new Date(1234567);
        m1(date);
        System.out.println(date.getTime());
    }
    public static void m1(Date date) {
        date.setTime(7654321);
    }
}

輸出:

7654321

D.

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = new Date(1234567);
        m1(date);
        System.out.println(date.getTime());
    }
    public static void m1(Date date) {
        date = null;
    }
}

輸出:

1234567

下列程式碼有何錯誤?

public class TestClass {
    public static void main(String[] args) {
        java.util.Date[] dates = new java.util.Date[10]; // 未初始化,初值為null
        System.out.println(dates[0]);

        // ERROR! java.lang.NullPointerException
        System.out.println(dates[0].toString()); 
    }
}

當使用new操作符建立物件陣列時,陣列中的每一個元素都是一個引用變數,具有預設值null

如果一個物件一旦建立,其內容不可變,那麼這個物件稱為不可變物件,對應的類稱為不可變類。不可變物件和類必須滿足的條件:

  • 所有的資料域必須為私有
  • 不能有setter
  • getter不允許返回可變資料域的引用。

Introduction to Java Programming 10th.