1130面向對象
1.設計對象並使用
1.1類和對象
類(設計圖)
類就是對現實事物的一種描述
類的組成
屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
行為:指事物能執行的操作,例如:手機事物(打電話,發短信)
對象(實際的物)
客觀存在的事物皆為對象 ,所以我們也常常説萬物皆對象。
類和對象的關係
類是對事物的一種描述,對象則為具體存在的事物
1.2類的定義
類的組成是由屬性和行為兩部分組成
屬性:在類中通過成員變量來體現(類中方法外的變量)
行為:在類中通過成員方法來體現(和前面的方法相比去掉static關鍵字即可)
類的定義步驟:
public class 類名 {//①定義類
// ②編寫類的成員變量(表示類的屬性)
變量1的數據類型 變量1;
變量2的數據類型 變量2;
…
// ③編寫類的成員方法(表示類的方法)
方法1;
方法2;
}
示例代碼:
public class Phone {
//成員變量
String brand;
double price;
//成員方法
public void call() {
System.out.println("打電話");
}
public void sendMessage() {
System.out.println("發短信");
}
}
1.3對象的使用
/* 創建對象
格式:類名 對象名 = 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);//打印"null"
System.out.println(p.price);//打印"0.0"
//給手機1賦值
p.brand = "小米";
p.price = 2999;
//獲取手機1中的值
System.out.println(p.brand);//打印"小米"
System.out.println(p.price);//打印"2999"
//使用成員方法
p.call();
p.sendMessage();
//創建對象2
Phone p2 = new Phone();
//給手機2賦值
p.brand = "蘋果";
p.price = 8999;
//獲取手機2中的值
System.out.println(p.brand);//打印"蘋果"
System.out.println(p.price);//打印"8999"
}
1.4 some notes
Javabean類:用來描述一類事物的類,在Javabean類中,是不寫main方法的
測試類:編寫main方法的類. 我們可以在測試類中創建javabean類的對象並進行賦值調用
1.類名首字母建議大寫,需要見名知意,駝峯模式
2.一個Java文件中可以定義多個class類,且只能一個類是public修飾,而且public修飾的類名必須成為代碼文件名(實際開發中建議還是一個文件定義一個class類)
3.定義成員變量的完整格式:
//修飾符 數據類型 變量名稱 = 初始化值
一般無需指定初始化值,但是存在默認值
2.封裝
4.1 封裝思想
封裝是面向對象三大特徵之一(封裝,繼承,多態)
封裝告訴我們,如何正確設計對象的屬性和方法
封裝原則:對象代表什麼,就得封裝對應的數據,並提供數據對應的行為
理解封裝思想的好處?
1.讓編程變得很簡單,有什麼事,找對象,調方法就行。
2.降低我們的學習成本,可以少學、少記,或者説壓根不用學,不用記對象有哪些
方法,有需要時去找就行
封裝好處
通過隱藏對象的內部細節,只暴露公共的getter和setter方法,可以減少外部代碼對內部數據結構的依賴。
通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進行封裝,提高了代碼的複用性
編寫getter和setter方法是Java中實現對象封裝、增強代碼健壯性和靈活性的重要手段。雖然對於簡單的屬性直接暴露可能看起來更簡潔,但從長遠來看,採用getter和setter能夠提升代碼的質量和可維護性。
封裝代碼實現
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問
成員變量private,提供對應的getXxx()/setXxx()方法
4.2 private關鍵字
1.private是一個權限修飾符,可以用來修飾成員(成員變量,成員方法)
2.被private修飾的成員,只能在本類進行訪問
3.針對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:
//如果Student類需要被其他包中的類導入和使用,那麼就需要在類前面添加public修飾符。
//例如,如果有一個在不同包中的測試類需要創建Student對象並調用其方法,那麼Student類就必須是public的。
//
//總結:
//該Student類省略public修飾符,表明它被設計為只能在當前包內使用,這是一種合理的封裝策略,有助於控制類的可見範圍。
public class StudentTest {
public static void main(String[] args) {
//創建對象
Student s = new Student();
//給成員變量賦值
s.name = "林青霞";
s.setAge(30);
//調用show方法
s.show();
}
}
兩個類的作用與區別
- Student類(業務類/實體類):
- 這是一個實體類,用於封裝學生的數據(如姓名、年齡)和行為(如顯示信息)
- 它定義了類的屬性、構造方法、getter/setter方法以及其他業務方法
- 主要負責數據的存儲和相關業務邏輯的實現
- 不包含程序的入口點(main方法)
- StudentTest類(測試類/主類):
- 這是一個包含main方法的類,作為程序的入口點
- 負責創建Student類的實例並測試其功能
- 可以模擬用户交互或業務流程
- 體現了"客户端代碼"如何使用我們定義的業務類
為什麼要分離這兩個類?
- 關注點分離:
- Student類專注於數據和業務邏輯
- StudentTest類專注於程序的執行流程和測試
- 代碼複用:
- 當Student類需要在不同場景中使用時,可以被多個測試類或其他業務類引用
- 如果將所有代碼都放在一個類中,這個類會變得臃腫且難以維護
- 更好的封裝和安全性:
- 業務類的內部實現細節對測試類是隱藏的(如Student類中的私有屬性age)
- 測試類只能通過公開的方法(如setAge、getAge)與業務類交互
- 更符合面向對象的設計理念:
- 每個類都有明確的單一職責
- 提高了代碼的可讀性和可維護性
實際開發中的應用
在實際開發中,這種模式更為明顯:
- 實體類(如User、Product等)負責數據和核心業務邏輯
- 測試類用於單元測試
- 控制類(如Controller)用於處理請求並調用實體類的方法
這種分離設計使代碼結構更清晰,也更便於團隊協作開發。
3. this關鍵字
在Java中,當局部(或者形參)變量和成員變量重名的時候,在方法中使用this表示成員變量以示區分。
- 方法的形參如果與成員變量同名,不帶this修飾的變量指的是形參,而不是成員變量
- 方法的形參沒有與成員變量同名,不帶this修飾的變量指的是成員變量
public class This{
public static void main(String args[]){
Demo demo = new Demo();
demo.fun("這是局部變量");
}
}
class Demo{
String str = "這是成員變量";
void fun(String str){
System.out.println(str); //就近原則,打印出"這是局部變量"
System.out.println(this.str);//成員變量
this.str = str;
System.out.println(this.str); //(形參)局部變量
}
}
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.構造方法
構造方法(也叫構造器 構造函數)
作用:在創建對象的時候,由虛擬機自動調用,給成員變量進行初始化
格式:
public class 類名{
修飾符 類名( 參數 ) {
}
}
特點:
1.方法名與類名相同,大小寫也要一致
2.沒有返回值類型,連void都沒有
3.沒有具體的返回值(不能由retrun帶回結果數據)
種類:
無參構造方法:初始化的對象時,成員變量的數據均採用默認值
有參構造方法:在初始化對象的時候,同時可以為對象進行賦值
note:
創建:如果沒有定義構造方法,系統將給出一個默認的無參數構造方法;
如果定義了構造方法,系統將不再提供默認的構造方法
重載:如果自定義了帶參構造方法,還要使用無參數構造方法,就必須再寫一個無參數構造方法
推薦:無論是否使用,都手工書寫無參數構造方法
5.標準JavaBean
一個標準的JavaBean類
1. 類名需要見名知意
2.成員變量使用private修飾
3.提供至少兩個構造方法
無參構造方法
帶全部參數的構造方法
4.成員方法
提供每一個成員變量對應的setXxx()/getXxx()
如果還有其他行為,也需要寫上
public class User{
private String username;
private String password;
private String email;
private String gender;
private int age;
//空參
public User() {
}
//帶全部參數的構造
public User(String username, String password, String email, String gender, int age) {
this.username = username;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
//get和set方法
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return username;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//快捷鍵:
//alt + insert
//插件:
//ptg