Java基礎6--類和物件
阿新 • • 發佈:2020-12-13
1. 類和物件
1.1 類和物件的理解
客觀存在的事物皆為物件 ,所以我們也常常說萬物皆物件。
- 類
- 類的理解
- 類是對現實生活中一類具有共同屬性和行為的事物的抽象
- 類是物件的資料型別,類是具有相同屬性和行為的一組物件的集合
- 簡單理解:類就是對現實事物的一種描述
- 類的組成
- 屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
- 行為:指事物能執行的操作,例如:手機事物(打電話,發簡訊)
- 類的理解
- 類和物件的關係
- 類:類是對現實生活中一類具有共同屬性和行為的事物的抽象
- 物件:是能夠看得到摸的著的真實存在的實體
- 簡單理解:類是對事物的一種描述,物件則為具體存在的事物
1.2 類的定義
類的組成是由屬性和行為兩部分組成
- 屬性:在類中通過成員變數來體現(類中方法外的變數)
- 行為:在類中通過成員方法來體現(和前面的方法相比去掉static關鍵字即可)
類的定義步驟:
①定義類
②編寫類的成員變數
③編寫類的成員方法
public class 類名 {
// 成員變數
變數1的資料型別 變數1;
變數2的資料型別 變數2;
…
// 成員方法
方法1;
方法2;
}
示例程式碼:
/* 手機類: 類名: 手機(Phone) 成員變數: 品牌(brand) 價格(price) 成員方法: 打電話(call) 發簡訊(sendMessage) */ public class Phone { //成員變數 String brand; int price; //成員方法 public void call() { System.out.println("打電話"); } public void sendMessage() { System.out.println("發簡訊"); } }
1.3 物件的使用
- 建立物件的格式:
- 類名 物件名 = new 類名();
- 呼叫成員的格式:
- 物件名.成員變數
- 物件名.成員方法();
- 示例程式碼
/* 建立物件 格式:類名 物件名 = new 類名(); 範例:Phone p = new Phone(); 使用物件 1:使用成員變數 格式:物件名.變數名 範例:p.brand 2:使用成員方法 格式:物件名.方法名() 範例:p.call() */ 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 = "小米"; p.price = 2999; System.out.println(p.brand); System.out.println(p.price); //使用成員方法 p.call(); p.sendMessage(); } }
1.4 學生物件-練習
- 需求:首先定義一個學生類,然後定義一個學生測試類,在學生測試類中通過物件完成成員變數和成員方法的使用
- 分析:
- 成員變數:姓名,年齡…
- 成員方法:學習,做作業…
- 示例程式碼:
class Student {
//成員變數
String name;
int age;
//成員方法
public void study() {
System.out.println("好好學習,天天向上");
}
public void doHomework() {
System.out.println("996福報");
}
}
/*
學生測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s = new Student();
//使用物件
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
2. 物件記憶體圖
2.1 單個物件記憶體圖
- 成員變數使用過程
- 成員方法呼叫過程
2.2 多個物件記憶體圖
- 成員變數使用過程
- 成員方法呼叫過程
-
總結:
多個物件在堆記憶體中,都有不同的記憶體劃分,成員變數儲存在各自的記憶體區域中,成員方法多個物件共用的一份
2.3 多個物件指向相同記憶體圖
-
總結
當多個物件的引用指向同一個記憶體空間(變數所記錄的地址值是一樣的)
只要有任何一個物件修改了記憶體中的資料,隨後,無論使用哪一個物件進行資料獲取,都是修改後的資料。
3. 成員變數和區域性變數
3.1 成員變數和區域性變數的區別
- 類中位置不同:成員變數(類中方法外)區域性變數(方法內部或方法宣告上)
- 記憶體中位置不同:成員變數(堆記憶體)區域性變數(棧記憶體)
- 生命週期不同:成員變數(隨著物件的存在而存在,隨著物件的消失而消失)區域性變數(隨著方法的呼叫而存在,醉著方法的呼叫完畢而消失)
- 初始化值不同:成員變數(有預設初始化值)區域性變數(沒有預設初始化值,必須先定義,賦值才能使用)
4. 封裝
4.1 private關鍵字
private是一個修飾符,可以用來修飾成員(成員變數,成員方法)
-
被private修飾的成員,只能在本類進行訪問,針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作
- 提供“get變數名()”方法,用於獲取成員變數的值,方法用public修飾
- 提供“set變數名(引數)”方法,用於設定成員變數的值,方法用public修飾
-
示例程式碼:
/* 學生類 */ class Student { //成員變數 String name; private int age; //提供get/set方法 public void setAge(int a) { if(a<0 || a>120) { System.out.println("你給的年齡有誤"); } else { age = a; } } public int getAge() { return age; } //成員方法 public void show() { System.out.println(name + "," + age); } } /* 學生測試類 */ public class StudentDemo { public static void main(String[] args) { //建立物件 Student s = new Student(); //給成員變數賦值 s.name = "林青霞"; s.setAge(30); //呼叫show方法 s.show(); } }
4.2 private的使用
-
需求:定義標準的學生類,要求name和age使用private修飾,並提供set和get方法以及便於顯示資料的show方法,測試類中建立物件並使用,最終控制檯輸出 林青霞,30
-
示例程式碼:
/* 學生類 */ class Student { //成員變數 private String name; private int age; //get/set方法 public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } public void show() { System.out.println(name + "," + age); } } /* 學生測試類 */ public class StudentDemo { public static void main(String[] args) { //建立物件 Student s = new Student(); //使用set方法給成員變數賦值 s.setName("林青霞"); s.setAge(30); s.show(); //使用get方法獲取成員變數的值 System.out.println(s.getName() + "---" + s.getAge()); System.out.println(s.getName() + "," + s.getAge()); } }
4.3 this關鍵字
- this修飾的變數用於指代成員變數,其主要作用是(區分區域性變數和成員變數的重名問題)
- 方法的形參如果與成員變數同名,不帶this修飾的變數指的是形參,而不是成員變數
- 方法的形參沒有與成員變數同名,不帶this修飾的變數指的是成員變數
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
4.4 this記憶體原理
-
this代表當前呼叫方法的引用,哪個物件呼叫的方法,this就代表哪一個物件
-
示例程式碼:
public class StudentDemo { public static void main(String[] args) { Student s1 = new Student(); s1.setName("林青霞"); Student s2 = new Student(); s2.setName("張曼玉"); } }
-
圖解:
4.5 封裝思想
- 封裝概述
是面向物件三大特徵之一(封裝,繼承,多型)
是面向物件程式語言對客觀世界的模擬,客觀世界裡成員變數都是隱藏在物件內部的,外界是無法直接操作的 - 封裝原則
將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問
成員變數private,提供對應的getXxx()/setXxx()方法 - 封裝好處
通過方法來控制成員變數的操作,提高了程式碼的安全性
把程式碼用方法進行封裝,提高了程式碼的複用性
5. 構造方法
5.1 構造方法概述
構造方法是一種特殊的方法
-
作用:建立物件 Student stu = new Student();
-
格式:
public class 類名{
修飾符 類名( 引數 ) {
}
}
-
功能:主要是完成物件資料的初始化
-
示例程式碼:
class Student {
private String name;
private int age;
//構造方法
public Student() {
System.out.println("無參構造方法");
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s = new Student();
s.show();
}
}
5.2 構造方法的注意事項
- 構造方法的建立
如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
如果定義了構造方法,系統將不再提供預設的構造方法
- 構造方法的過載
如果自定義了帶參構造方法,還要使用無引數構造方法,就必須再寫一個無引數構造方法
- 推薦的使用方式
無論是否使用,都手工書寫無引數構造方法
- 重要功能!
可以使用帶參構造,為成員變數進行初始化
- 示例程式碼
/*
學生類
*/
class Student {
private String name;
private int age;
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測試類
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件
Student s1 = new Student();
s1.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(30);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",30);
s4.show();
}
}
5.3 標準類製作
- 需求:定義標準學生類,要求分別使用空參和有參構造方法建立物件,空參建立的物件通過setXxx賦值,有參建立的物件直接賦值,並通過show方法展示資料。
- 示例程式碼:
class Student {
//成員變數
private String name;
private int age;
//構造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成員方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
建立物件併為其成員變數賦值的兩種方式
1:無參構造方法建立物件後使用setXxx()賦值
2:使用帶參構造方法直接建立帶有屬性值的物件
*/
public class StudentDemo {
public static void main(String[] args) {
//無參構造方法建立物件後使用setXxx()賦值
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用帶參構造方法直接建立帶有屬性值的物件
Student s2 = new Student("林青霞",30);
s2.show();
}
}