面向對象之封裝
01_面向對象(構造方法Constructor概述和格式)
* A:構造方法概述和作用 * 給對象的資料(屬性)進行初始化 * B:構造方法格式特點 * a:方法名與類名相同(大小也要與類名一緻) * b:沒有傳回值類型,連void都沒有 * c:沒有具體的傳回值return; |
class Demo1_Constructor {//Constructor構造 public static void main(String[] args) { Person p = new Person();//在一建立對象的時候,系統就幫我調用了構造方法 //p.Person();//構造方法不能用對象調用 p.show(); Person p2 = new Person();//再次建立對象 p2.show(); } /* */ class Person { private String name; private int age; //構造方法 public Person() { //System.out.println("Hello World!"); //return;//構造方法也是有return語句的,格式是return; name = "張三"; age = 23; public void show() { System.out.println(name + "..." + age); |
構造方法的作用及格式特點分别是什麼? 思考:構造方法可以重載嗎? 可以 |
02_面向對象(構造方法的重載及注意事項)
* A:案例示範 * 構造方法的重載 * 重載:方法名相同,與傳回值類型無關(構造方法沒有傳回值),隻看參數清單 * B:構造方法注意事項 * a:如果我們沒有給出構造方法,系統将自動提供一個無參構造方法。 * b:如果我們給出了構造方法,系統将不再提供預設的無參構造方法。 * 注意:這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法 |
class Demo2_Person { Person p1 = new Person(); p1.show(); System.out.println("---------------------"); Person p2 = new Person("張三",23); Person p3 = new Person("李四",24); p3.show(); * A:案例示範 * 構造方法的重載 * 重載:方法名相同,與傳回值類型無關(構造方法沒有傳回值),隻看參數清單 * B:構造方法注意事項 * a:如果我們沒有給出構造方法,系統将自動提供一個無參構造方法。 * b:如果我們給出了構造方法,系統将不再提供預設的無參構造方法。 * 注意:這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法 private String name;//姓名 private int age;//年齡 public Person() {//空參構造 System.out.println("空參的構造"); public Person(String name,int age) { this.name = name; this.age = age; System.out.println("有參的構造"); |
使用構造方法的時候,注意事項有哪些? • 思考題:構造方法,set方法都可以給成員變量指派,這兩種指派方式有什 麼差別? |
03_面向對象(給成員變量指派的兩種方式的差別)
* A:setXxx()方法 * 修改屬性值 * B:構造方法 * 給對象中屬性進行初始化 |
class Demo3_Person { Person p1 = new Person("張三",23); //p1 = new Person("張天一",23);//這種方式看運作結果貌似是改名了,其實是将原對象變成垃圾 System.out.println(p1.getName() + "..." + p1.getAge()); System.out.println("--------------------"); Person p2 = new Person();//空參構造建立對象 p2.setName("李四"); p2.setAge(24); p2.setName("李鬼"); System.out.println(p2.getName() + "..." + p2.getAge()); 構造方法 給屬性進行初始化 setXxx方法 修改屬性值 這兩種方式,在開發中用setXxx更多一些,因為比較靈活 public Person(String name,int age) {//有參構造 public void setName(String name) {//設定姓名 public String getName() {//擷取姓名 return name; public void setAge(int age) {//設定年齡 public int getAge() {//擷取年齡 return age; |
04_面向對象(學生類的代碼及測試)
* 學生類: * 成員變量: * name,age * 構造方法: * 無參,帶兩個參 * 成員方法: * getXxx()/setXxx() * show():輸出該類的所有成員變量值 * B:給成員變量指派: * a:setXxx()方法 * b:構造方法 * C:輸出成員變量值的方式: * a:通過getXxx()分别擷取然後拼接 * b:通過調用show()方法搞定 |
class Demo4_Student { Student s1 = new Student();//使用空參構造 s1.setName("張三");//設定姓名 s1.setAge(23);//設定年齡 System.out.println("我的姓名是:" + s1.getName() + ",我的年齡是:" + s1.getAge()); //getXxx()擷取屬性值,可以列印,也可以指派給其他的變量,做其他的操作 Student s2 = new Student("李四",24); s2.show();//隻是為了顯示屬性值 class Student { public Student(){}//空參構造 public Student(String name,int age) {//有參構造 System.out.println("我的姓名是:" + name + ",我的年齡是:" + age); |
• 模仿剛才的學生類代碼,寫一個手機類并測試。 手機類: 成員變量: 品牌(brand),價格(price) 構造方法: 無參構造,帶參構造 成員方法: 各個字段對應的setXXX()和getXXX()方法, show()方法:這個方法用來顯示手機的品牌和價格 |
05_面向對象(手機類的代碼及測試)
* 模仿學生類,完成手機類代碼 |
class Demo5_Phone { Phone p1 = new Phone(); p1.setBrand("蘋果"); p1.setPrice(1500); System.out.println(p1.getBrand() + "..." + p1.getPrice()); Phone p2 = new Phone("小米",98); 手機類: 成員變量: 品牌brand,價格price 無參,有參 成員方法 setXxx和getXxx show class Phone { private String brand;//品牌 private int price;//價格 public Phone(){}//空參構造 public Phone(String brand,int price) {//有參構造 this.brand = brand; this.price = price; public void setBrand(String brand) {//設定品牌 public String getBrand() {//擷取品牌 return brand; public void setPrice(int price) {//設定價格 public int getPrice() {//擷取價格 return price; System.out.println(brand + "..." + price); |
06_面向對象(建立一個對象的步驟)
* A:畫圖示範 * 畫圖說明一個對象的建立過程做了哪些事情? * Student s = new Student(); * 1,Student.class加載進記憶體 * 2,聲明一個Student類型引用s * 3,在堆記憶體建立對象, * 4,給對象中屬性預設初始化值 * 5,屬性進行顯示初始化 * 6,構造方法進棧,對對象中的屬性指派,構造方法彈棧 * 7,将對象的位址值指派給s |
![]() |
一個對象的建立過程做了哪些事情? 需求:定義一個長方形類,類中有兩個方法,分别求長方形的周長和面積的方法,然後定義一個測試類進行測試。 |
矩形:Rectangle 求周長的方法: getLength() 求面積的方法: getArea() |
07_面向對象(長方形案例練習)
* 需求: * 定義一個長方形類,定義 求周長和面積的方法, * 然後定義一個測試類進行測試。 |
class Test1_Rectangle {//Rectangle矩形 Rectangle r = new Rectangle(10,20); System.out.println(r.getLength());//周長 System.out.println(r.getArea());//面積 * 需求: * 定義一個長方形類,定義 求周長和面積的方法, * 然後定義一個測試類進行測試。 分析: 寬width,高high 空參有參構造 成員方法: 求周長:getLength() 求面積:getArea() class Rectangle { private int width;//寬 private int high;//高 public Rectangle(){}//空參構造 public Rectangle(int width,int high) { this.width = width;//有參構造 this.high = high; public void setWidth(int width) {//設定寬 this.width = width; public int getWidth() {//擷取寬 return width; public void setHigh(int high) {//設定高 public int getHigh() {//擷取高 return high; public int getLength() {//擷取周長 return 2 * (width + high); public int getArea() {//擷取面積 return width * high; |
根據給定的需求,定義出員工類并測試。 |
08_面向對象(員工類案例練習)
* 需求:定義一個員工類Employee * 自己分析出幾個成員,然後給出成員變量 * 姓名name,工号id,工資salary * 構造方法, * 空參和有參的 * getXxx()setXxx()方法, * 以及一個顯示所有成員資訊的方法。并測試。 * work |
class Test2_Employee {//employee員工 Employee e = new Employee("令狐沖","9527",20000); e.work(); * 需求:定義一個員工類Employee * 自己分析出幾個成員,然後給出成員變量 * 姓名name,工号id,工資salary * 構造方法, * 空參和有參的 * getXxx()setXxx()方法, * 以及一個顯示所有成員資訊的方法。并測試。 * work class Employee { private String id;//工号 private double salary;//工資 public Employee() {}//空參構造 public Employee(String name, String id, double salary) {//有參構造 this.id = id; this.salary = salary; public void setId(String id) {//設定id public String getId() {//擷取id return id; public void setSalary(double salary) {//設定工資 public double getSalary() {//擷取工資 return salary; public void work() { System.out.println("我的姓名是:" + name + ",我的工号是:" + id + ",我的工資是:" + salary + ",我的工作内容是敲代碼"); |
09_面向對象(static關鍵字及記憶體圖)
* 通過一個案例引入static關鍵字。 * 人類:Person。每個人都有國籍,中國。 * B:畫圖示範 * 帶有static的記憶體圖 |
class Demo1_Static { /*Person p1 = new Person();//建立對象 p1.name = "蒼老師";//調用姓名屬性并指派 p1.country = "日本";//調用國籍屬性并指派 Person p2 = new Person(); p2.name = "小澤老師";//調用姓名屬性并指派 //p2.country = "日本";//調用國籍屬性并指派 p1.speak(); p2.speak();*/ Person.country = "日本";//靜态多了一種調用方式,可以通過類名. System.out.println(Person.country); String name;//姓名 static String country;//國籍 public void speak() {//說話的方法 System.out.println(name + "..." + country); |
|
10_面向對象(static關鍵字的特點)
* A:static關鍵字的特點 * a:随着類的加載而加載 * b:優先于對象存在 * c:被類的所有對象共享 * 舉例:咱們班級的學生應該共用同一個班級編号。 * 其實這個特點也是在告訴我們什麼時候使用靜态? * 如果某個成員變量是被所有對象共享的,那麼它就應該定義為靜态的。 * 舉例: * 飲水機(用靜态修飾) * 水杯(不能用靜态修飾) * 共性用靜态,特性用非靜态 * d:可以通過類名調用 * 其實它本身也可以通過對象名調用。 * 推薦使用類名調用。 * 靜态修飾的内容一般我們稱其為:與類相關的,類成員 * B:案例示範 * static關鍵字的特點 |
• static關鍵字的特點有哪些? |
11_面向對象(static的注意事項)
* A:static的注意事項 * a:在靜态方法中是沒有this關鍵字的 * 如何了解呢? * 靜态是随着類的加載而加載,this是随着對象的建立而存在。 * 靜态比對象先存在。 * b:靜态方法隻能通路靜态的成員變量和靜态的成員方法 * 靜态方法: * 成員變量:隻能通路靜态變量 * 成員方法:隻能通路靜态成員方法 * 非靜态方法: * 成員變量:可以是靜态的,也可以是非靜态的 * 成員方法:可是是靜态的成員方法,也可以是非靜态的成員方法。 * 簡單記: * 靜态隻能通路靜态。 * B:案例示範 * static的注意事項 |
• 使用static關鍵字,有哪些注意事項? • 思考題:靜态變量和成員變量有哪些差別?(1分鐘) |
12_面向對象(靜态變量和成員變量的差別)
* 靜态變量也叫類變量 成員變量也叫對象變量 * A:所屬不同 * 靜态變量屬于類,是以也稱為為類變量 * 成員變量屬于對象,是以也稱為執行個體變量(對象變量) * B:記憶體中位置不同 * 靜态變量存儲于方法區的靜态區 * 成員變量存儲于堆記憶體 * C:記憶體出現時間不同 * 靜态變量随着類的加載而加載,随着類的消失而消失 * 成員變量随着對象的建立而存在,随着對象的消失而消失 * D:調用不同 * 靜态變量可以通過類名調用,也可以通過對象調用 * 成員變量隻能通過對 象名調用 |
class Demo2_Static { //Demo d = new Demo(); //d.print1(); Demo.print2(); class Demo { int num1 = 10;//非靜态的成員變量 static int num2 = 20;//靜态的成員變量 /*public void print1() {//非靜态的成員方法,既可以通路靜态的成員也可以通路非靜态的 System.out.println(num1); System.out.println(num2); }*/ public static void print2() {//靜态的成員方法 //System.out.println(this.num1);//靜态的成員方法不能通路非靜态的,錯誤: 無法從靜态上下文中引用非靜态 變量 num1 |
|
• 回顧下,咱們之前學習的局部變量和成員變量的差別是什麼? |
13_面向對象(main方法的格式詳細解釋)
* A:格式 * public static void main(String[] args) {} * B:針對格式的解釋 * public 被jvm調用,通路權限足夠大。 * static 被jvm調用,不用建立對象,直接類名通路 * void被jvm調用,不需要給jvm傳回值 * main 一個通用的名稱,雖然不是關鍵字,但是被jvm識别 * String[] args 以前用于接收鍵盤錄入的 * C:示範案例 * 通過args接收鍵盤例如資料 |
class Demo3_Main { public : 被jvm調用,是以權限要足夠大 static : 被jvm調用,不需要建立對象,直接類名.調用即可 void : 被jvm調用,不需要有任何的傳回值 main : 隻有這樣寫才能被jvm識别,main不是關鍵字 String[] args : 以前是用來接收鍵盤錄入的 System.out.println(args.length); for (int i = 0;i < args.length ;i++ ) { System.out.println(args[i]); |
14_面向對象(工具類中使用靜态)
* A:制作一個工具類 * ArrayTool * 1,擷取最大值 * 2,數組的周遊 * 3,數組的反轉 |
/** 這是一個數組工具類,裡面封裝了查找數組最大值,列印數組,數組反轉的方法 @author fengjia @version v1.0 public class ArrayTool { //如果一個類中所有的方法都是靜态的,需要再多做一步,私有構造方法,目的是不讓其他類建立本類對象 //直接用類名.調用即可 私有構造方法 private ArrayTool(){} //1,擷取最大值 這是擷取數組中最大值的方法 @param arr 接收一個int類型數組 @return 傳回數組中最大值 public static int getMax(int[] arr) { int max = arr[0];//記錄第一個元素 for (int i = 1;i < arr.length ;i++ ) {//從第二個元素開始周遊 if (max < arr[i]) {//max與數組中其他的元素比較 max = arr[i];//記錄住較大的 return max;//将最大值傳回 //2,數組的周遊 這是周遊數組的方法 public static void print(int[] arr) { for (int i = 0;i < arr.length ;i++ ) {//周遊數組 System.out.print(arr[i] + " "); //3,數組的反轉 這是數組反轉的方法 public static void revArray(int[] arr) { for (int i = 0;i < arr.length / 2 ;i++ ) {//循環次數是元素個數的一半 arr[0]與arr[arr.length-1-0]交換 arr[1]與arr[arr.length-1-1]交換 arr[2]與arr[arr.length-1-2] 交換 int temp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = temp; |
class Demo1_ArrayTool { int[] arr = {33,11,22,66,55,44}; /*ArrayTool at = new ArrayTool(); int max = at.getMax(arr);//擷取最值 System.out.println(max); System.out.println("---------------"); at.print(arr);//列印 System.out.println(); System.out.println("反轉後:"); at.revArray(arr);//反轉 at.print(arr);*/ ArrayTool.print(arr); |
============ 作業 =============
1:構造方法的作用是什麼?構造方法的特點是什麼?構造方法的注意事項是什麼?構造方法中可不可以寫return語句呢?
答:構造方法是用于初始化,成員變量的...構造方法當建立對象時,被調用.不能用對象名調用,如果沒有給出構造方法,系統會預設給出一個空參構造方法..構造方法中可以有return 但是不能有具體的傳回值
2:給成員變量指派有幾種方式?
直接給出
構造方法中初始化成員變量
set/get
3:标準的代碼編寫及測試:
A:學生類的案例
B:手機類的案例
C:長方形類的案例
4:一個類的成員變量初始化過程
Student s = new Student();
位元組碼檔案加載進方法去
mian方法加載進棧記憶體
主方法中聲明一個類型引用
在堆記憶體中建立一個對象
成員變量預設初始化
成員變量顯示初始化
構造方法初始化成員變量
把位址值賦給對象引用
5:static關鍵字是什麼?有什麼特點?什麼時候用呢?
靜态關鍵子,讓所有對象共享被修飾的内容
随着類加載而加載
優先于對象存在
被所有對象和類所共享
ending...