對象與類
- 面向對象程式設計(OOP)
-
- 類(class)
-
- 構造器
- 方法
- 靜态域與靜态方法
-
- 靜态域
- 靜态常量
- 靜态方法
- 方法參數
-
- 按值調用(call by value)
- 按引用調用(call by reference)
- 包(package)
-
- 類的導入
- 靜态導入
面向對象程式設計(OOP)
不關心對象的具體實作,隻要能滿足使用者需求即可。
類(class)
由類(class)構造(construct)對象的過程稱為建立類的執行個體(instance)。
構造器
- 構造器與類同名
- 每個類可以有一個以上的構造器
- 每個構造器可以有0個、1個或多個參數
- 構造器沒有傳回值
- 構造器總是伴随着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中方法參數的使用情況:
- 一個方法不能修改一個基本資料類型(整數型或布爾型)的參數
- 一個方法可以改變一個對象參數的狀态
-
一個方法不能讓對象參數引用一個新的對象
針對第三點看下面這個例子:
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 被丢棄了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9c2YsJ1MjBnTYlVN5cVWwh2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLzgTN1MDM0ATMzIDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
包(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("...");