目錄 一、面向對象編程快速入門 二、深刻認識面向對象 三、對象在電腦中的執行原理 四、類和對象的一些註意事項 五、其他語法:this 六、其他語法:構造器 七、其他語法:封裝 八、其他語法:實體JavaBean 九、面向對象編程綜合案例 十、補充知識:成員變數、局部變數的區別小結 前言 Stude ...
目錄
一、面向對象編程快速入門
二、深刻認識面向對象
三、對象在電腦中的執行原理
四、類和對象的一些註意事項
五、其他語法:this
六、其他語法:構造器
七、其他語法:封裝
八、其他語法:實體JavaBean
九、面向對象編程綜合案例
十、補充知識:成員變數、局部變數的區別小結
前言
Student類
package com.ctgu.object; public class Student { String name; double chinese; double math; public void printTotalScore(){ System.out.println(name + "的總成績是:" + (chinese + math)); } public void printAverageScore(){ System.out.println(name + "的平均成績是:" + (chinese + math) / 2); } }
Test類
package com.ctgu.object; public class Test { public static void main(String[] args) { // 目標:面向對象編程快速入門 // 1、創建一個學生對象,封裝波妞的數據 Student s1 = new Student(); s1.name = "波妞"; s1.chinese = 100; s1.math = 100; s1.printTotalScore(); s1.printAverageScore(); // 2、再創建一個學生對象,封裝波仔的數據 Student s2 = new Student(); s2.name = "波仔"; s2.chinese = 59; s2.math = 100; s2.printTotalScore(); s2.printAverageScore(); } }
一、面向對象編程快速入門
- 開發一個一個的對象,把數據交給對象,再調用對象的方法來完成對數據的處理。
二、深刻認識面向對象
1、面向對象編程有啥好處?
- 汽車的數據 找汽車對象處理
- 手機的數據 找手機對象處理
- 學生的數據 找學生對象處理
- 符合人類思維習慣,編程更簡單、更直觀
2、程式中的對象到底是個啥?
- 對象本質上是一種特殊的數據結構。
- class也就是類,也稱為對象的設計圖(或者對象的模板)。
總結
1、面對對象編程有啥好處?
- 凡事找對象的編程思路,更加符合人類思維習慣,編程也會更直觀。
2、對象是啥?如何得到?
- 對象是一種特殊的數據結構。
- 對象是用類new出來的,有了類就可以創建出對象。
3、面向對象編程這種套路是咋回事?
- 祖師爺認為萬物皆對象,誰的數據誰處理。
三、對象在電腦中的執行原理
多個對象在電腦中的執行原理
總結
1、對象在電腦中的執行原理是怎麼回事?
- Student s1 = new Student();
- 每次new Student(),就是在堆記憶體中開闢一塊區域代表一個學生對象。
- s1變數裡面記住的是學生對象的地址。
四、類和對象的一些註意事項
類和對象的一些註意事項
- 類名建議用英文單詞,首字母大寫,滿足駝峰模式,且要有意義,比如:Student、Car...
- 類中定義的變數也稱為成員變數(對象的屬性),類中定義的方法也稱為成員方法(對象的行為)。
- 成員變數本身存在預設值,同學們在定義成員變數時一般來說不需要賦初始值(沒有意義)。
- 一個代碼文件中,可以寫多個class類,但只能一個用public修飾,且public修飾的類名必須成為代碼文件名。
- 對象與對象之間的數據不會相互影響,但多個變數指向同一個對象時就會相互影響了。
- 如果某個對象沒有一個變數引用它,則該對象無法被操作了,該對象會成為所謂的垃圾對象。
如果某個對象沒有任何變數指向它,需要註意說明?
註意:當堆記憶體中的對象,沒有被任何變數引用(指向)時,就會被判定為記憶體中的“垃圾”。
java存在自動垃圾回收機制,會自動清除掉垃圾對象,程式員不用操心。
五、this
this是什麼
- this就是一個變數,可以用在方法中,來拿到當前對象。
Student類
package com.ctgu.thisdemo; public class Student { public void printThis(){ System.out.println(this); } }
Test類
package com.ctgu.thisdemo; public class Test { public static void main(String[] args) { // 目標:認識this,掌握this的應用場景。 Student s1 = new Student(); System.out.println(s1); s1.printThis(); System.out.println("---------------------"); Student s2 = new Student(); System.out.println(s2); s2.printThis(); } }
This的執行原理
this有啥應用場景呢?
- this主要用來解決:變數名稱衝突問題的。
package com.ctgu.thisdemo; public class Student { double score; public void printThis(){ System.out.println(this); } public void printPass(double score){ if(this.score > score){ System.out.println("恭喜您,您成功考入了哈弗大學了~~"); }else{ System.out.println("落選了"); } } }
總結
1、this關鍵字是什麼?
- this就是一個變數,可以用在方法中,用來拿到當前對象;哪個對象調用方法,this就指向哪個對象,也就是拿到哪個對象。
2、this關鍵字在實際開發中常用來幹啥?
- 用來解決對象的成員變數與方法內部變數的名稱一樣時,導致訪問衝突問題的。
多學一招:方法里的this到底是如何拿到調用它的對象的
六、構造器
關於構造器,需要同學們掌握的目標
構造器是什麼樣子?
構造器有什麼特點?
- 創建對象時,對象會去調用構造器。
Student s = new Student();
構造器的常見應用場景
- 創建對象時,同時完成對對象成員變數(屬性)的初始化賦值。
Student類
package com.ctgu.constructor; public class Student { String name; double score; // 無參構造器 public Student(){ System.out.println("無參數構造器被觸發執行了~"); } // 有參構造器 public Student(String name,double score){ System.out.println("有參數的構造器被觸發執行了~"); } }
Test類
package com.ctgu.constructor; public class Test { public static void main(String[] args) { // 目標:認識構造器,並掌握構造器的特點,應用場景,註意事項 Student s1 = new Student(); s1.name = "波妞"; s1.score = 100; Student s2 = new Student("小黑",59); System.out.println(s2.name); System.out.println(s2.score); } }
構造器的註意事項
- 類在設計時,如果不寫構造器,java是會為類自動生成一個無參構造器的。
- 一旦定義了有參數構造器,java就不會幫我們的類自動生成無參構造器了,此時就建議自己手寫一個無參數構造器出來了。
總結
1、構造器長什麼樣子?
2、構造器在哪裡調用,我們常用它來幹嘛?
- 對象創建時,我們可以指定對象去調用哪個構造器執行。
- 構造器常用於完成對象初始化(常見的應用場景是完成對象的成員變數的初始化賦值)
3、構造器在使用時,有哪2個註意事項?
- 類在設計時,如果不寫構造器,java是會為類自動生成一個無參構造器的。
- 一旦定義了有參數構造器,java就不會幫我們的類自動生成無參構造器了,此時就建議自己手寫一個無參數構造器出來了。
七、封裝
面對對象的三大特性:封裝、繼承、多態
什麼是封裝?
- 就是用類設計對象處理某一個事物的數據時,應該把要處理的數據,以及處理這些數據的方法,設計到一個對象中去。
封裝的設計規範:合理隱藏、合理暴露
Student類
package com.ctgu.encapsulation; public class Student { private double score; private void printPass(){ System.out.println(score >= 60 ? "成績及格" : "成績不及格"); } public void setScore(double score) { if(score >= 0 && score <= 100) { this.score = score; }else{ System.out.println("數據非法"); } } public double getScore() { return score; } }
Test類
package com.ctgu.encapsulation; public class Test { public static void main(String[] args) { // 目標:掌握封裝的設計規範:合理隱藏、合理暴露。 Student s1 = new Student(); s1.setScore(-99); } }
總結
1、什麼是封裝?
- 就是用類設計對象處理某一個事物的數據時,應該把要處理的數據,以及處理這些數據的方法,設計到一個對象中去。
- 面向對象三大特征:封裝、繼承、多態。
2、封裝的設計規範是什麼樣的?
- 合理隱藏,合理暴露。
3、代碼層面如何控制對象的成員公開或隱藏?
- 公開成員,可以使用public(公開)進行修飾。
- 隱藏成員,使用private(私有,隱藏)進行修飾。
八、實體JavaBean
什麼是實體類?
- 就是一種特殊形式的類。
get、set快捷生成
- 右鍵Generate..,再點擊Getter and Setter,選擇成員變數。
有參、無參構造器快捷生成
- 右鍵Generate..,再點擊Constructor,選擇參數。
Student類
package com.ctgu.javabean; public class Student { // 1、必須私有成員變數,併為每個成員變數都提供get、set方法。 private String name; private double score; // 2、必須為類提供一個公開的無參構造器 public Student(String name, double score) { this.name = name; this.score = score; } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } }
Test類
package com.ctgu.javabean; public class Test { public static void main(String[] args) { // 目標:掌握實體類的書寫要求,特點,應用場景。 Student s1 = new Student(); s1.setName("波妞"); s1.setScore(99); System.out.println(s1.getName()); System.out.println(s1.getScore()); } }
StudentOpreator類
package com.ctgu.javabean; public class StudentOperator { private Student student; public StudentOperator(Student student){ this.student = student; } public void printPass(){ if(student.getScore() >= 60){ System.out.println(student.getName() + "學生成績及格"); }else{ System.out.println(student.getName() + "學生成績不及格"); } } }
實體類有啥應用場景?
- 實體類只負責數據存取,而對數據的處理交給其他類來完成,以實現數據和數據業務處理相分離。
總結
1、什麼是實體類?有啥特點?
- 成員變數必須私有,且為他們提供get、set方法;必須有無參數構造器。
- 實體類僅僅只是一個用來保存數據的java類,可以用它創造對象,保存某個事物的數據。
2、實體類有啥應用場景?
- 實體類對應的是軟體開發里比較流行的開發方式,數據和數據的業務處理相分離。
九、面向對象編程綜合案例
案例 面向對象綜合案例-模仿電影信息系統
需求
- 展示系統中的全部電影(每部電影展示:名稱、價格)
- 允許用戶根據電影編號(id)查詢出某個電影的詳細信息。
目標
- 使用所學的面向對象編程實現以上2個需求。
實訓
movie類
package com.ctgu.demo; public class Movie { private int id; private String name; private double price; private double score; private String director; private String actor; private String info; public Movie() { } public Movie(int id, String name, double price, double score, String director, String actor, String info) { this.id = id; this.name = name; this.price = price; this.score = score; this.director = director; this.actor = actor; this.info = info; } /** * 獲取 * @return id */ public int getId() { return id; } /** * 設置 * @param id */ public void setId(int id) { this.id = id; } /** * 獲取 * @return name */ public String getName() { return name; } /** * 設置 * @param name */ public void setName(String name) { this.name = name; } /** * 獲取 * @return price */ public double getPrice() { return price; } /** * 設置 * @param price */ public void setPrice(double price) { this.price = price; } /** * 獲取 * @return score */ public double getScore() { return score; } /** * 設置 * @param score */ public void setScore(double score) { this.score = score; } /** * 獲取 * @return director */ public String getDirector() { return director; } /** * 設置 * @param director */ public void setDirector(String director) { this.director = director; } /** * 獲取 * @return actor */ public String getActor() { return actor; } /** * 設置 * @param actor */ public void setActor(String actor) { this.actor = actor; } /** * 獲取 * @return info */ public String getInfo() { return info; } /** * 設置 * @param info */ public void setInfo(String info) { this.info = info; } }
MovieOperator類
package com.ctgu.demo; public class MovieOperator { private Movie[] movies; public MovieOperator(Movie[] movies){ this.movies = movies; } /** 1、展示系統全部電影信息 */ public void printAllMovies(){ System.out.println("-----系統全部電影信息如下-----"); for (int i = 0; i < movies.length; i++) { Movie m = movies[i]; System.out.println("編號:"+ m.getId()); System.out.println("名稱:"+ m.getName()); System.out.println("價格:"+ m.getPrice()); System.out.println("----------------------"); } } /**2、根據電影的編號查詢出該電影的詳細信息並展示 */ public void searchMovieById(int id){ for (int i = 0; i < movies.length; i++) { Movie m = movies[i]; if(m.getId() == id){ System.out.println("該電影詳情如下:"); System.out.println("編號:"+ m.getId()); System.out.println("名稱:"+ m.getName()); System.out.println("價格:"+ m.getPrice()); System.out.println("得分:"+ m.getScore()); System.out.println("導演:"+ m.getDirector()); System.out.println("主演:"+ m.getActor()); System.out.println("其他信息:"+ m.getInfo()); return; //已經找到了電影信息,沒有必要再執行看 }else{ System.out.println("查詢無果"); } } } }
Test類
package com.ctgu.demo; import java.util.Scanner; public class Test { public static void main(String[] args) { // 1、設計一個電影類 Movie // 2、設計一個電影的操作類 MovieOperator // 3、準備 全部電影數據 Movie[] movies = new Movie[4]; movies[0] = new Movie(1,"水門橋",38.9,9.8,"徐克","吳京","12萬人想看"); movies[1] = new Movie(2,"出拳吧",39,7.8,"唐曉白","田雨","3.5萬人想看"); movies[2] = new Movie(3,"月球隕落",42,7.9,"羅蘭","貝瑞","17.9萬人想看"); movies[3] = new Movie(4,"一點就到家",35,8.7,"徐巨集寧","劉昊然","18.8萬人想看"); // 4、創建一個電影操作類的對象,接受電影數據,並對其進行業務處理 MovieOperator operator = new MovieOperator(movies); operator.printAllMovies(); operator.searchMovieById(3); Scanner sc = new Scanner(System.in); while (true) { System.out.println("==電影信息系統=="); System.out.println("1、查詢全部電影信息"); System.out.println("2、根據id查詢某個電影的詳細信息展示"); int commend = sc.nextInt(); switch (commend){ case 1: // 展示全部電影信息 operator.printAllMovies(); break; case 2: // 根據id查詢某個電影的詳細信息展示 System.out.println("請您輸入查詢的電影id:"); int id = sc.nextInt(); operator.searchMovieById(id); break; default: System.out.println("您輸入的命令有問題~"); } } } }
十、補充知識:成員變數、局部變數的區別
成員變數和局部變數的區別