天天看點

JAVA 核心技術 卷Ⅰ 第四章面向對象程式設計(OOP)

對象與類

  • 面向對象程式設計(OOP)
    • 類(class)
      • 構造器
      • 方法
      • 靜态域與靜态方法
        • 靜态域
        • 靜态常量
        • 靜态方法
    • 方法參數
      • 按值調用(call by value)
      • 按引用調用(call by reference)
    • 包(package)
      • 類的導入
      • 靜态導入

面向對象程式設計(OOP)

不關心對象的具體實作,隻要能滿足使用者需求即可。

類(class)

由類(class)構造(construct)對象的過程稱為建立類的執行個體(instance)。

構造器

  1. 構造器與類同名
  2. 每個類可以有一個以上的構造器
  3. 每個構造器可以有0個、1個或多個參數
  4. 構造器沒有傳回值
  5. 構造器總是伴随着new操作一起調用

方法

在JAVA中所有的方法都在類中(但并不表示它們是内聯方法)。

在C++中通常在類外,如果定義在類内部,這個方法将自動成為内聯(inline)方法。

//C++
void Employee::raiseSalry(double byPercent)
{
...
}
class Employee
{
...
int getName(){return name;}//inline in C++
}
           

靜态域與靜态方法

靜态域

每個類中隻有一個這樣的域

class Employee
{
private static int nextId = 1;
}
           

靜态常量

public class Math
{
public static final double PI = 3.1415926;
}
           

靜态方法

靜态方法是一種不能向對象實施操作的方法,大白話:靜态方法就是類的,和對象無關。

Employee類的靜态方法不能通路id執行個體域,因為它不能操作對象。但是靜态方法可以通路自身類中的靜态域。

class Employee
{
private static int nextId = 1;
private int id;

//靜态方法
	public static int getNextld()
	{
	return nextId; / / returns static field
	}
}
           

靜态對象可以通路靜态方法,但不推薦,一般還是Empoyee.getNextId();

在下面2種情況下使用靜态方法 :

1.方法不需要通路對象狀态,其所需參數都是通過顯式參數提供(例如:Math.pow())

2. 一個方法隻需要通路類的靜态域 ( 例如:Empoyee.getNextId())

方法參數

按值調用(call by value)

表示方法接收的是調用者提供的值

Java 程式設計語言總是采用按值調用

按引用調用(call by reference)

表示方法接收的是調用者提供的變量位址

方法參數共有兩種類型:

1.基本資料類型(數字 、 布爾值)

2.對象引用

java中方法參數的使用情況:

  1. 一個方法不能修改一個基本資料類型(整數型或布爾型)的參數
  2. 一個方法可以改變一個對象參數的狀态
  3. 一個方法不能讓對象參數引用一個新的對象

    針對第三點看下面這個例子:

public static void swap(Employee x,Employee y){
	Employee t;
	t=x;
	x=y;
	y=t;
}
//如果 Java 對對象采用的是按引用調用,那麼這個方法就應該能夠實作交換資料的效果
//但是!!!
Employee a = new("alice",...);
Employee b = new("bob",...);
swap(a,b);
//方法并沒有改變存儲在變量a和b中的對象引用。swap方法的參數 x和 y 被初始化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝。
//在方法結束時參數變量X 和 y 被丢棄了 
           
JAVA 核心技術 卷Ⅰ 第四章面向對象程式設計(OOP)

包(package)

java允許使用包将類組織起來,如果兩個程式員都建立了Employee類,隻需将他們放到不同的包裡,就不會引起沖突。因為網際網路域名獨一無二的特性,一般推薦已逆序的形式作為包名。

例如公司域名:aaa.bbb.com

包名推薦:com.bbb.aaa

子包名推薦:com.bbb.aaa.xxx

類的導入

一個類可以使用所屬包的所有類,一級其他包的公有類(public class)。有兩種方式可以通路其他包的公有類:

1.在類名前添加完整的包名(不推薦)。

假設兩個包裡都有Date類,如果編譯器無法識别究竟用了哪個包的Date類,就需要在前面加上完整的包名。

//都有Date類
import java.util.*;
import java.sql.*;

java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date.(...);
           

2.用import語句導入一個特定的類或整個包

//這條語句,導入java.until包中所有的類。
import java.until.*;
//這條,導入特定的類
import java.time.LocalDate;
           

靜态導入

import 語句不僅可以導人類,還增加了導人靜态方法和靜态域的功能

import static java.lang.System.*;
//就可以使用System類的靜态方法和靜态域,而不必加字首名
out.println("ye!");//平常:System.out.println("...");