面向對象(Object Oriented)
一、面向對象雜談
面向對象(Object Oriented),我的翻譯是以物體為目標的,就是說編程的時候是建立一個物體,然后對這個物體進行操作。
Java語言是面向對象的(有95%都是面向對象的內容),C++是基於對象的
計算機語言的發展向接近人的思維方式演變
- 匯編語言 [面向機器]
- c語言 [面向過程]
- java語言 [面向對象]
- spring [面向切面]———— 把類在進行切分
二、類和對象的關系————(類class,對象object)
三、創建一個簡單的類
class Cat //類名首字母要大寫 { int age; String name; String color; }
四、類和對象的區別和聯系
- 類是抽象的,概念的,代表一類事物——只能找到人,找不到人類
- 對象是具體的,實際的,代表一個具體的事物
- 類是對象的模板,對象是類的一個個體,實例
五、定義一個全面的類 —— 一個全面的類定義比較復雜
package 包名; class 類名 extends 父類 implements 接口名{ 成員變量; 構造方法; 成員方法; }
類——類的成員變量
成員變量是類的一個組成部分,一般是基本數據類習慣,也可是引用類型。比如我們前面定義貓類的 int age 就是實例變量,屬於成員變量。
實例變量、類變量、常量都是屬於成員變量的,成員變量又被稱為全局變量
引用類型是什么呢?
假如說貓要有一個主人,這個主人也有年齡,身高等信息
通俗來講就是類指向另外一個類,叫做引用,例如:
class Cat { int age; String name; String color; //其實它也是一個引用類型,Java中String本身就是一個類 Myster myMaster; //這就是一個引用類型 } class Master { int age; String name; String address; }
類與對象
一、創建對象的兩種方法
- 1、先聲明再創建——沒人用了!
- 2、一步到位法
1、先聲明再創建 對象聲明:類名 對象名 對象創建:對象名 = new 類名() Cat cat1=new Cat(); 2、一步到位法 類名 對象名 = new 類名(); Cat cat1; cat1 = new Cat;
二、如何 訪問/使用 對象的成員變量
對象名.變量名 cat1.age=3; cat1.name="小白"; cat1.color="黃色";
思考:
public class Demo6 { public static void main(String []args) { Person a=new Person(); a.age = 10; a.name="小明"; Person b; b = a; //問b.age是多少?? System.out.println("b.age="+b.age); Person c; c = a; c.age = 9; //問改變c.age的值,a.age和b.age的值會變嗎?? System.out.println("a.age="+a.age); System.out.println("b.age="+b.age); System.out.println("c.age="+c.age); } } class Person { int age; String name; } 運行結果: D:\myJavaDemo>java Demo6 b.age=10 a.age=9 b.age=9 c.age=9
原理:創建對象a的時候開辟了一塊內存,之后相當於讓b和c的地址也指向了那塊地址,所以對c.age進行操作時,a.age和b.age的值也跟着變化了
三、對象在內存中的存在形式
我們用new這個方法創造的對象,放到了內存中
了解一下:java的垃圾回收機制,如果對象沒有人指向,就認為這個對象是垃圾,在適當的時候去回收。
類的成員方法
在某些情況下我們需要定義類的成員方法。比如人類:
- 除了有一些屬性外(例如:成員變量表示的年齡,姓名等)
- 我們人類還有一些行為比如:可以說話,跑步
- 通過學習我們還可以做算術題
- 這時就要用成員方法才能完成
現在我們來對Person類完善
- 添加speak 成員方法,輸出——我是一個好人
- 添加jisuan 成員方法,可以計算從1+..+1000的結果
- 修改jisuan 成員方法,該方法可以接受一個數n,計算從1+..+n的結果
- 添加add 成員方法, 可以計算兩個數的和
成員方法的定義
成員方法也叫成員函數
public 返回數據類型 方法名 (參數列表) { 語句; //函數(方法)主體 } /* 1. 參數列表: 表示成員函數輸入 2. 數據類型(返回類型): 表示成員函數輸出 3. 函數主體: 表示為了實現某一功能代碼塊 */
speak成員方法

1 public class Demo6 2 { 3 public static void main(String []args) 4 { 5 //使用成員方法 6 Person p1=new Person(); 7 p1.speak(); //調用speak方法 8 } 9 } 10 class Person 11 { 12 int age; 13 String name; 14 15 //定義成員方法 16 public void speak() 17 { 18 System.out.println("我是一個好人"); 19 } 20 21 }
jisuan成員方法
注:類名的首字母是大寫的,方法名的首字母是小寫的,常用的命名方法有
- 駝峰法(匈牙利法)——myCry
- 下划線法——my_cry

1 public class Demo6 2 { 3 public static void main(String []args) 4 { 5 //使用成員方法 6 Person p1=new Person(); 7 p1.jiSuan(); //調用jisuan方法 8 } 9 } 10 class Person 11 { 12 int age; 13 String name; 14 15 //計算方法 16 public void jiSuan() 17 { 18 int result = 0; 19 for (int i=1;i<=1000;i++) 20 { 21 result+=i; 22 } 23 //輸出結果 24 System.out.println(result); 25 } 26 27 }
強換版計算成員方法

1 public class Demo6 2 { 3 public static void main(String []args) 4 { 5 //使用成員方法 6 Person p1=new Person(); 7 p1.jiSuan(); 8 p1.jiSuan(8); //調用jisuan方法 9 } 10 } 11 class Person 12 { 13 int age; 14 String name; 15 //jisuan成員方法 16 public void jiSuan() 17 { 18 int result = 0; 19 for (int i=1;i<=1000;i++) 20 { 21 result+=i; 22 } 23 //輸出結果 24 System.out.println(result); 25 } 26 27 //帶參數的成員方法 28 public void jiSuan(int n) 29 { 30 int result = 0; 31 for (int i=1;i<=n;i++) 32 { 33 result+=i; 34 } 35 //輸出結果 36 System.out.println(result); 37 } 38 }
從中可以看出兩個問題,
- 第一個是:定義兩個成員方法時都使用了result這個變量,但不會引起沖突,因為作用域不同
- 第二個是:兩個成員方法的名字相同都是 jiSuan ,但不會報錯,因為區別是一個帶參數,另一個不帶
函數調用的原理圖
注意:如果語句三也調用了一個函數,則它也會開辟一個新的函數棧,這也解釋了為什么兩個函數中都有result
add成員方法

1 public class Demo6 2 { 3 public static void main(String []args) 4 { 5 //使用成員方法 6 Person p1=new Person(); 7 p1.jiSuan(); 8 p1.jiSuan(20); 9 p1.add(20,35); 10 } 11 } 12 class Person 13 { 14 int age; 15 String name; 16 17 //jisuan成員方法 18 public void jiSuan() 19 { 20 int result = 0; 21 for (int i=1;i<=1000;i++) 22 { 23 result+=i; 24 } 25 //輸出結果 26 System.out.println(result); 27 } 28 29 //帶參數的成員方法 30 public void jiSuan(int n) 31 { 32 int result = 0; 33 for (int i=1;i<=n;i++) 34 { 35 result+=i; 36 } 37 //輸出結果 38 System.out.println(result); 39 } 40 41 //計算兩個數的和 42 public void add(int num1,int num2) 43 { 44 int result = 0; 45 result = num1+num2; 46 System.out.println(result); 47 } 48 }
把add成員方法也改名為jiSuan

1 /* 2 作者:侯召暉 3 日期:28.9.6 4 功能:找貓問題 5 */ 6 public class Demo6 7 { 8 public static void main(String []args) 9 { 10 //使用成員方法 11 Person p1=new Person(); 12 p1.jiSuan(); 13 p1.jiSuan(20); 14 p1.jiSuan(20,35); 15 } 16 } 17 class Person 18 { 19 int age; 20 String name; 21 22 //jisuan成員方法 23 public void jiSuan() 24 { 25 int result = 0; 26 for (int i=1;i<=1000;i++) 27 { 28 result+=i; 29 } 30 //輸出結果 31 System.out.println(result); 32 } 33 34 //帶參數的成員方法 35 public void jiSuan(int n) 36 { 37 int result = 0; 38 for (int i=1;i<=n;i++) 39 { 40 result+=i; 41 } 42 //輸出結果 43 System.out.println(result); 44 } 45 46 //計算兩個數的和 47 public void jiSuan(int num1,int num2) 48 { 49 int result = 0; 50 result = num1+num2; 51 System.out.println(result); 52 } 53 }
帶返回結果的成員方法

1 public class example1 2 { 3 public static void main(String []args) 4 { 5 Person p1 = new Person(); 6 int res = p1.add(12,24); 7 System.out.println(res); 8 System.out.println(p1.add(12,24)); 9 } 10 } 11 12 13 class Person 14 { 15 //返回類型一定要和public后的返回數據類型一致 16 public int add(int num1,int num2) 17 { 18 return num1 + num2; //返回結果 19 } 20 }
注意:
- 兩個成員方法如果只有返回類型不同的話,是不能通過編譯的
- 不能將空類型進行賦值
- returen 的作用是把表達式的值返回給注調用方法,當然也可以返回
類成員方法的聲明
類成員方法——聲明
public int test ( int a ); //方法聲明
方法聲明和定義的區別是,方法聲明沒有函數體,聲明只是說明有這個函數
//聲明的格式 public int test (int a);
訪問修飾符 數據類型 函數名 (參數列表);
類的成員方法的——特別說明
一、方法的參數列表可以是多個,並且參數列表的類型也可以是任意的
二、調用某個成員方法的時候,傳入的實參要和形參的類型相匹配
例如:

1 public class example1 2 { 3 public static void main(String []args) 4 { 5 Person p1 = new Person(); 6 System.out.println(p1.add(2,2.3,4.5)); 7 } 8 } 9 10 11 class Person 12 { 13 //public double add(int num1.float num2,float num3) 14 //會報錯,因為穿的參數是2,2.3和4.5,小數默認是double類型,損失精度報錯 15 public double add(int num1,double num2,double num3) 16 { 17 return num1+num2+num3; 18 } 19 }
練習:
- 1、編寫一個成員函數,從鍵盤輸入一個整數(1 - 9),打印出對應的乘法表
- 2、編寫函數,使給定的一個二維數組(3 x 3)轉置(橫坐標和縱坐標對調)
1 2 3 ——> 1 4 7
4 5 6 ——> 2 5 8
7 8 9 ——> 3 6 9 - 3、設計計算機類
- 4、模擬一下馬里奧
構造方法(函數)
構造方法使類的一種特殊方法,它的主要作用是完成對新對象的初始化(闖進新對象時,給新對象幾個默認值)。它有幾個特點
- 方法名和類名相同
- 沒有返回值
- 在創建一個類的新對象是,系統會自動調用該類的構造方法完成對新對象的初始化

1 public class example1 2 { 3 public static void main(String []args) 4 { 5 //Person p = new Person(); 6 //在加入了構造方法后,不加參數的聲明會報錯 7 Person p1 = new Person(1,"rotk"); 8 System.out.println(p1.age); 9 System.out.println(p1.name); 10 } 11 } 12 13 14 class Person 15 { 16 int age; 17 String name; 18 public Person(int age,String name) 19 { 20 age=age; //前面是成員屬性,后面是傳進來的值 21 name=name; 22 } 23 24 }
注意:一個類可以指定多個不同的構造方法,例如

1 public class example1 2 { 3 public static void main(String []args) 4 { 5 //因為有兩個構造方法,所以調用哪個構造方法是由傳遞幾個參數決定的 6 Person p1 = new Person(7); 7 Person p2 = new Person(2,"小白"); 8 } 9 } 10 11 12 class Person 13 { 14 int age; 15 String name; 16 //構造方法一 17 public Person(int age,String name) 18 { 19 System.out.println("我是構造一"); 20 age=age; //前面是成員屬性,后面是傳進來的值 21 name=name; 22 } 23 //構造方法二 24 public Person(int age) 25 { 26 System.out.println("我是構造二"); 27 age = age; 28 } 29 30 }
默認構造方法
如果程序員沒有定義構造方法,系統會自動生成一個默認的構造方法。
//Person類中的默認構造方法 Person () { //nothing } //當創建一個Person對象時 Person perl=new Person; //默認的構造方法(函數)就會被自動調用
如果程序員寫了一個構造方法后,這個默認的構造方法就沒了,但可以自己把這個默認構造方法寫回來,就可以不加參數創建對象了
構造方法小節
- 構造方法名和類名相同,如果不相同就不是構造方法
- 構造方法沒有返回值,如果有返回值就不是構造方法
- 主要作用是完成新對象的初始化
- 在創建新對象時,系統自動的調用該類的構造方法
- 一個類可以有多個構造方法,但是不能完全相同
- 每個類都有一個默認的構造方法
一般來說構造方法的作用就是去初始化你的成員變量,不干別的事