6.類和物件
阿新 • • 發佈:2020-10-28
類和物件
物件
物件: 一切事物都是物件
物件的屬性: 物件具有的各種特徵, 每個物件的每個屬性都擁有特定的值.
物件的行為: 物件能夠執行的操作
類
類: 現實生活中一類具有共同屬性
和行為
的事物的抽象.
類的特點:
- 類是物件的資料型別
- 類是具有相同屬性和行為的一組物件的集合
類與物件的關係
類: 現實生活中一類具有共同屬性
和行為
的事物的抽象.
物件: 能夠看得見摸得著的真實存在的實體.
類是物件的抽象, 物件是類的實體
類的定義
類: 是java 程式的基本組成單位
類的組成: 屬性和行為
- 屬性: 在類中通過成員變數來體現(類中方法外的變數)
- 行為: 在類中通過成員方法來體現(和前面的方法相比去掉static關鍵字即可)
類的定義步驟
- 定義類
- 編寫類的成員變數
- 編寫類的成員方法
public class 類名 {
// 成員變數
變數1資料型別 變數1;
變數2資料型別 變數2;
...
// 成員方法
方法1;
方法2;
...
}
示例
package ClassInstance; public class Phone { // 成員變數 String brand; Float price; // 成員方法 public void call() { System.out.println("打電話"); } public void sendMessage() { System.out.println("發簡訊"); } }
物件的使用
建立物件
-
格式: 類名 物件名 = new 類名();
-
範例: Phone p = new Phone();
使用物件
- 使用成員變數
- 格式: 物件名.變數名
- 範例:p.brand
- 使用成員方法
- 格式: 物件名.方法名()
- 範例: p.call()
package ClassInstance; import org.w3c.dom.ls.LSOutput; public class PhoneDemo { public static void main(String[] args) { // 建立物件 Phone p = new Phone(); // 使用成員變數 System.out.println(p.brand); System.out.println(p.price); // 成員變數賦值 p.brand = "apple"; p.price = 5499.00; System.out.println(p.brand); System.out.println(p.price); // 使用成員方法 p.call(); } }
物件記憶體圖
單個物件
成員變數
成員方法
多個物件
多個物件指向相同
成員變數和區域性變數
成員變數: 類方法外的變數
區域性變數: 方法中的變數
區別 | 成員變數 | 區域性變數 |
---|---|---|
類中位置不同 | 類種方法外 | 方法內或方法宣告上 |
記憶體中位置不同 | 堆記憶體 | 棧記憶體 |
生命週期不同 | 隨著物件的存在而存在,隨物件的消失而消失 | 隨方法的呼叫而存在,隨方法的呼叫完畢而消失 |
初始化值不同 | 有預設的初始化值 | 沒有預設初始值,必須先定義,賦值,才能使用 |
封裝
private關鍵字
- 一個許可權修飾符
- 可以修飾成員(成員變數和成員方法)
- 作用是保護成員不被別的類使用,被private修飾的成員只能在本類中使用
針對private修飾的變數,如果需要被其他類使用,提供相應的操作
- 提供"get變數名()"方法, 用於獲取成員變數的值,方法用public修飾
- 提供"set變數名(引數)"方法, 用於設定成員變數的值,方法用public修飾
package ClassInstance;
public class StudentPrivate {
// 成員變數
String name;
private int age;
// 提供get/set方法
public void setAge(int a) {
if (a<0 || a>120) {
System.out.println("年齡輸入有誤!");
}
age = a;
}
public int getAge() {
return age;
}
// 成員方法
public void call() {
System.out.println("人生誰無風雨時");
}
public void sendMessage() {
System.out.println("守的雲開見月明");
}
}
使用private成員
package ClassInstance;
public class privateKeyword {
public static void main(String[] args) {
// 建立物件
StudentPrivate s = new StudentPrivate();
System.out.println(s.name);
// System.out.println(s.age); // 私有變數無法直接訪問
System.out.println(s.getAge());
s.setAge(30);
System.out.println(s.getAge());
}
}
this關鍵字
this修飾的變數用於指代成員變數
- 方法的形參如果與成員變數同名, 不帶this修飾的變數值的形參, 而不是成員變數
- 方法的形參沒有與成員變數重名, 不帶this修飾的變數指的是成員變數
什麼時候this: 解決區域性變數隱藏成員變數
this: 代表所在類的物件引用
- 方法被那個物件呼叫, this就代表那個物件.
package ClassInstance;
public class StudentThis {
// 成員變數
private String name;
private int age;
// 提供get/set方法
public void setName(String name) {
// name = name; // 方法中會優先使用區域性變數,
this.name = name; // 使用this才能指向成員變數
}
public String getName() {
return name;
}
// 成員方法
public void call() {
System.out.println("人生誰無風雨時");
}
public void sendMessage() {
System.out.println("守的雲開見月明");
}
public void show(){
System.out.println(name + ", " + age);
}
}
This記憶體原理
s1物件呼叫記憶體原理
s2物件呼叫記憶體原理
最後
封裝
- 封裝概述
面向物件的三大特徵之一(封裝, 繼承, 多型)
面向物件程式語言對客觀世界的模擬, 客觀世界成員變數都是隱藏在物件內部的, 外部是無法直接操作的
- 封裝原則
將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問, 而是通過類提供的方法來實現對隱藏資訊的操作和訪問.
- 封裝的好處
通過方法來控制成員變數的操作,提高了程式碼的安全性
把程式碼用方法進行封裝, 提高程式碼的複用性
構造方法
概述
構造方法是一種特殊的方法,
-
作用: 用於建立物件
-
功能: 完成物件資料的初始化
格式
public class 類名 {
修飾符 類名(引數) {
// 構造方法內容
}
}
示例:
package ClassInstance;
public class StudentCreateMethod {
private String name;
private int age;
// 無引數構造方法
public StudentCreateMethod () {
System.out.println("無引數構造方法");
}
// 有引數構造方法
public StudentCreateMethod (String name) {
System.out.println("有引數構造方法");
this.name = name;
}
// 有引數構造方法2
public StudentCreateMethod (int age) {
System.out.println("有引數構造方法2");
this.age = age;
}
// 完整構造方法
public StudentCreateMethod(String name, int age) {
System.out.println("有引數構造方法3");
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
測試類
package ClassInstance;
public class StudentCreateMethodTest {
public static void main(String[] args) {
// 建立物件
StudentCreateMethod s = new StudentCreateMethod();
s.show();
//
StudentCreateMethod s2 = new StudentCreateMethod("林青霞");
s2.show();
//
StudentCreateMethod s3 = new StudentCreateMethod(30);
s3.show();
StudentCreateMethod s4 = new StudentCreateMethod("林青霞",30);
s4.show();
}
}
注意事項
構造方法的建立;
- 如果沒有定義構造方法, 系統給出一個預設的無引數構造方法; 如果定義了,系統將不再提供預設構造方法.
- 構造方法需要和類名一致
構造方法的過載:
- 如果定義了帶引數構造方法, 還要使用無參構造方法, 就必須再寫一個無引數構造方法
推薦使用
- 無論是否使用,都手工書寫無引數構造方法
標準類的製作
成員變數
- 使用private修飾
構造方法
- 提供一個無參構造方法
- 提供一個帶多個引數的構造方法
成員方法
- 提供每一個成員變數對應的setXxx()/getXxx()
- 提供一個顯示物件資訊的show()
建立物件並且為成員變數賦值的兩種方式
- 無參構造方法建立物件之後使用setXxx()賦值
- 使用帶參構造直接建立帶有屬性值的物件
package ClassInstance;
public class StudentStandard {
private String name;
private int age;
public StudentStandard() {};
public StudentStandard(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
public void show() {
System.out.println(name + "," + age);
}
}