Java對象和類
Java是面向對象的語言。 作爲具有面向對象功能的語言,Java支持以下基本概念 -
- 多態性
- 繼承
- 封裝
- 抽象化
- 類
- 對象
- 實例
- 方法
- 消息傳遞
在本節中,我們將學習兩個概念 - 類和對象。
- 對象 - 對象具有狀態和行爲。 例如:一隻狗的狀態有:顏色,名稱,品種,它的行爲有:搖尾巴,吠叫,吃東西。 對象是類的實例。
- 類 - 可以將類定義爲描述其類型對象支持的行爲/狀態的模板/藍圖。
1. Java對象
下面將深入瞭解什麼是對象。 如果考慮現實世界,可以在我們周圍找到許多對象,如:汽車,狗,人等等。所有這些對象都有狀態和行爲。
如果考慮一隻狗,那麼它的狀態是 - 名稱,品種,顏色,並且它的行爲是 - 吠叫,搖尾巴,跑步。
如果將軟件對象與實際對象進行比較,則它們具有非常相似的特徵。
軟件對象也具有狀態和行爲。 軟件對象的狀態存儲在字段中,行爲通過方法顯示。
因此,在軟件開發中,方法對對象的內部狀態進行操作,並且對象到對象的通信是通過方法完成的。
2. Java類
類是創建單個對象的藍圖(模板)。以下是一個類的示例代碼。
public class Dog {
String breed;
int age;
String color;
void barking() {
}
void hungry() {
}
void sleeping() {
}
}
類可以包含以下任何變量類型。
- 局部變量 - 在方法,構造函數或塊中定義的變量稱爲局部變量。 變量將在方法中聲明和初始化,並且在方法完成時將銷燬變量。
- 實例變量 - 實例變量是類中的變量,但在方法之外。 在實例化類時初始化這些變量。 可以從類的任何方法,構造函數或塊內部訪問實例變量。
- 類變量 - 類變量是使用
static
關鍵字修飾,它是在類中的方法之外聲明的變量。
一個類可以有任意數量的方法。 在上面的例子中,barking()
,hungry()
和sleeping()
都是類的方法。
以下是在學習Java語言類和對象時,需要了解的一些重要主題內容。
構造函數
在討論類時,最重要的子主題之一是構造函數。 每個類都有一個構造函數。 如果沒有爲類顯式編寫構造函數,Java編譯器會自動爲該類構建一個默認構造函數。
每次創建新對象時,都將至少調用一個構造函數。構造函數的主要規則是它與類具有相同的名稱。 一個類可以有多個構造函數。
以下是構造函數的示例 -
public class Dog {
// 無參數構造函數
public Dog() {
}
// 有參數構造函數
public Dog(String name) {
// 此構造函數有一個參數:name。
}
}
Java還支持單實例類,它是一種創建一個類只有一個實例設計模式。
注意 - 有兩種不同類型的構造函數。 我們將在後續章節中詳細討論構造函數。
創建對象
如前所述,類提供了對象的藍圖。一個對象是從一個類創建的。 在Java中,new
關鍵字用於創建新對象。
從類創建對象時有三個步驟 -
- 聲明 - 具有變量名稱和對象類型的變量聲明。
- 實例化 -
new
關鍵字用於創建對象。 - 初始化 -
new
關鍵字後跟對構造函數的調用,此調用初始化新對象。
以下是創建對象的示例代碼 -
public class Dog {
public Dog(String name) {
// 這個構造函數有一個參數:anem
System.out.println("傳入的參數值是: " + name );
}
public static void main(String []args) {
// 以下語句將創建一個對象: myDog
Dog myDog = new Dog( "小屁狗" );
}
}
編譯並執行上面示例代碼,得到以下結果:
傳入的參數值是: 小屁狗
訪問實例變量和方法
通過創建的對象訪問實例變量和方法。 要訪問實例變量,以下是完全限定的路徑 -
/* 首先創建一個對象 */
ObjectReference = new Constructor();
/* 調用變量如下 */
ObjectReference.variableName;
/* 現在,可以按如下方式調用類方法 */
ObjectReference.MethodName();
下面示例說明如何訪問類的實例變量和方法。
public class Dog {
int dogAge;
public Dog(String name) {
// 此構造函數有一個參數:name
System.out.println("設置的小狗名字是: " + name);
}
public void setAge(int age) {
dogAge = age;
}
public int getAge() {
System.out.println("小狗的年齡是: " + dogAge);
return dogAge;
}
public static void main(String[] args) {
/* 創建對象 */
Dog myDog = new Dog("小屁狗");
/* 調用方法來設置狗的年齡 */
myDog.setAge(2);
/* 調用另一個方法來獲取狗的年齡 */
myDog.getAge();
/* 也可以按如下方式訪問實例變量:dogAge */
System.out.println("變量的值是:" + myDog.dogAge);
}
}
編譯並執行上面示例代碼,得到以下結果:
設置的小狗名字是: 小屁狗
小狗的年齡是: 2
變量的值是:2
源文件聲明規則
在源文件中聲明類,import
語句和package
語句時,這些規則是必不可少的。
- 每個源文件只能有一個
public
類。 - 源文件可以有多個非
public
類。 -
public
類名稱也應該是源文件的名稱,最後以.java
作爲擴展名。 例如:類名是public class Employee{}
,那麼源文件應該是:Employee.java
。 - 如果在包內定義了類,則
package
語句應該是源文件中的第一個語句。 - 如果存在
import
語句,則必須在package
語句和類聲明之間寫入它們。如果沒有package
語句,則import
語句應該是源文件中的第一行。
類具有多個訪問級別,並且有不同類型的類; 抽象類,final
類等。我們將在訪問修飾符章節中解釋所有這些。
除了上面提到的類類型之外,Java還有一些特殊類:內部類和匿名類。
Java包
簡而言之,它是一種對類和接口進行分類的方法。 在Java中開發應用程序時,將編寫數百個類和接口,因此必須對這些類進行分類,以使生活變得更加容易。Java包也是用於解決命名衝突的問題。
import語句
在Java中,如果給出了包含包和類名的完全限定名稱,則編譯器可以快速地找到源代碼或類。 import
語句是一種爲編譯器提供正確位置以查找特定類的方法。
例如,以下行將要求編譯器加載目錄java_installation/java /io
中可用的所有類 -
import java.io.*;
3. 一個簡單學習案例
在這個學習案例中,將創建兩個類。 它們是:Employee
和EmployeeTest
。
首先打開記事本並添加以下代碼。Employee
類是公共(public
)類。因此使用文件名稱爲:Employee.java 保存此源文件。
Employee
類有四個實例變量 - name
, age
, designation
和 salary
。 該類有一個顯式定義的構造函數,它接受一個參數。
import java.io.*;
public class Employee {
String name;
int age;
String jobPosition;
double salary;
// 這是Employee類的構造函數
public Employee(String name) {
this.name = name;
}
// 設置員工的年齡,將empAge的分配給變量:age。
public void empAge(int empAge) {
age = empAge;
}
/* 設置員工的工作崗位. */
public void setJobPosition(String jobPosit) {
jobPosition = jobPosit;
}
/* 設置員工的薪水,將empSalary的分配給變量:salary。 */
public void empSalary(double empSalary) {
salary = empSalary;
}
/* 打印員工詳細信息 */
public void printEmployee() {
System.out.println("------------------------------------");
System.out.println("姓名:" + name);
System.out.println("年齡:" + age);
System.out.println("工作崗位:" + jobPosition);
System.out.println("薪水:" + salary);
}
}
如本教程前面所述,程序從main
方法開始執行。 因此,要運行這個Employee
類,應該有一個main
方法,並且應該創建對象。接下來將爲這些任務創建一個單獨的類:EmployeeTest
。
在EmployeeTes
t類中,它創建Employee
類的兩個實例,併爲每個對象調用方法以爲每個變量賦值。將以下代碼保存在EmployeeTest.java 文件中。
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* 使用構造函數創建兩個對象 */
Employee empOne = new Employee("Maxsu");
Employee empTwo = new Employee("張小龍");
// 爲每個創建的對象調用方法
empOne.empAge(26);
empOne.setJobPosition("高級軟件工程師");
empOne.empSalary(15999);
empOne.printEmployee();
empTwo.empAge(42);
empTwo.setJobPosition("產品經理");
empTwo.empSalary(999999);
empTwo.printEmployee();
}
}
現在,編譯這兩個類,然後運行得到結果如下 -
D:/worksp/java> javac Employee.java
D:/worksp/java> javac EmployeeTest.java
D:/worksp/java> java EmployeeTest
------------------------------------
姓名:Maxsu
年齡:26
工作崗位:高級軟件工程師
薪水:15999.0
------------------------------------
姓名:張小龍
年齡:42
工作崗位:產品經理
薪水:999999.0