一、理解面向對象
結構化程序設計
1、程序=算法+數據結構
2、算法第一,數據結構第二
二、面向對象程序設計OOP
1、程序=對象+對象+…
2、據第一,算法第二
3、關鍵:讓每個對象負責執行一組相關任務
三、面向對象編程的特性
1、萬物皆對象
2、程序是一組對象彼此之間在發送消息
3、每個對象都有自己的內存占用,可以組裝成更大的對象
4、每個對象都有類型,特定對象的所有類型都可以接收相同消息
四、類和對象的概念、區別和聯系
概念:
類①類是創建對象的模板和藍圖②類是一組類似對象的共同抽象定義
對象①對象是類的實例化結果②對象是實實在在的存在,代表現實世界的某一事物
對象的兩個關鍵特性①行為:對象能干什麼②狀態:對象的屬性,行為的結果
區別:①類是靜態定義②對象是動態實例③程序代碼操作的是對象而非類④建模得到的事類而非對象
聯系:①類是對象的定義②對象的產生離不開類的建模③類存在的目的是實例化得到對象
五、類的建模:抽象和封裝的過程
定義一個類的步驟:①定義類名②編寫字段代表屬性③編寫類的方法代表行為
類的建模是一個抽象和封裝的過程
抽象:去掉不關注的、次要信息而保留重要的信息
封裝:信息打包,簡單來說:將抽象出來的屬性和行為包裝在一個類中。
案例:學生類建模
案例介紹:編寫一個學生類,描述具有一定行為和屬性的學生對象
案例設計:①建模一個學生類②定義一系列字段來描述學生的屬性③定義一系列方法來描述學生的行為
1 public class Student 2 { 3 public String number; 4 public String name; 5 public int age; 6 public String major; 7 8 //上課方法 9 public void attendClass(){ 10 11 } 12 13 public void exan(){ 14 15 } 16 } View Code
六、對象的創建和使用
創建並使用對象:使用new關鍵字創建對象
示例:
public class Example()
{
int field1;
double field2;
public class void main(String []args)
{
Example e=new Example();
}
}
使用成員訪問符“.”操作對象
給對象屬性賦值:對象名.屬性
對對象發送消息即調用方法:對象名.方法()
示例:
Example e=new Example();
e.field1=100;
e.field2=200.0;
System.out.println(e.toString());
代碼舉例
1 public class Dog 2 { 3 public String brand;//品種 4 public int age;//年齡 5 //方法 6 public String toString(){ 7 return "這是一條"+age+"歲的"+brand; 8 } 9 10 public static void main(String []args){ 11 Dog dog=new Dog();//構造了一個Dog類的對象 12 dog.brand="中華田園犬"; 13 dog.age=3; 14 System.out.println(dog.toString()); 15 } 16 } View Code
七、方法的定義和調用
類的方法代表的是實例的某種行為(或功能)
方法定義:方法類型,方法簽名(方法名+參數列表),方法體
定義類的方法
訪問修飾符 類型 方法名(參數列表){
//方法體
}
可以把方法當做是一個模塊,是個“黑匣子”,完成某個特定的功能,並返回處理結果
方法分類:①返回值為(空)void的方法②帶具體返回類型的方法③不帶參數的方法④帶參數的方法
方法返回值:如果方法有返回值,方法中必須使用關鍵字return返回該值,返回值類型為該方法所定義的返回值類型
☆方法內可以調用其他方法
調用帶參數的方法采用的是值傳遞方式:①如果參數是基本數據類型,參數傳遞是將參數的數值傳遞給方法②如果參數是對象或數組,參數傳遞是將對象或數組的引用值傳遞給方法③遞參數時都有一個值拷貝的過程
void method1(){
…
…
method2(1,2.0);//方法調用,傳入實參(1,2.0)
}
method2(int i,double d){
//i和d表示形參,調用了之後i=1;d=2.0;傳參的時候數據類型必須一致
…
…
}
public class MethodDemo { public void method1(){ System.out.println("返回類型為空且無參數的方法"); } public String method2(){ return "帶有具體返回類型且無參數的方法"; } public void method3(String name){ System.out.println("返回類型為空且帶有參數的方法,參數的值為"+name); } public String method4(String name,int age){ return "帶有具體返回類型且帶有參數的方法,參數的值為"+name+","+age; } //傳遞基本數據類型 public void operatorData(int age){ //這裡的age是定義在外面的age拷貝值,並不是外面的age+1; age++; System.out.println("方法中的age:"+age); } //傳遞引用數據類型的方法 public void operatorArray(int[] array){ array[2]=100; System.out.println("方法中的array[2]:"+array[2]); } public static void main(String []args){ MethodDemo demo=new MethodDemo(); demo.method1(); String msg=demo.method2(); System.out.println(msg); demo.method3("張三"); System.out.println(demo.method4("張三",20)); int age=20; demo.operatorData(age); System.out.println("方法外的age:"+age); int[] array={1,2,3,4}; demo.operatorArray(array); System.out.println("方法外的array[2]:"+array[2]); } } View Code上述代碼中
傳遞基本數據類型時方法內與方法外的值分別為11與10
傳遞引用數據類型時方法內與方法外的值都為100
區別分析:
基本數據類型在內存中存放在棧內存中,當使用int時開辟一個棧幀(age),調用方法後又產生了一個棧幀(age),方法內操作的是第二個,當調用完方法之後第二個age出棧了,但第二個age改變了值並打印,未影響到第一個age,主方法中繼續打印輸出age(此時是第一個age);引用數據類型使用array時開辟一個棧幀(array),指向堆中的內存空間,調用方法後又產生了一個棧幀(array),由第一個array傳遞過來(地址),也指向了堆中的內存空間,方法內操作的是第二個,當調用完方法之後第二個array出棧了,指向的堆中的內存空間中的數組array[2]中的值改變了,所以2個array[2]輸出的是相同的值。
主要區別就是基本數據類型存放在棧中,而引用數據類型只是將地址存放在棧中,真正的值存放在堆中。例如int[] a=new int[5]; 其中a存放在棧中,a只是一個引用,棧中放的數組的地址,真正的數組是放在堆中的。
八、變量的作用域
public class Example(){
public 類型 變量1;
public 類型 變量2;
public 類型 方法1(){
類型 變量3;
}
public 類型 方法2(){
類型 變量4;
}
}
上面的例子中變量3和變量4為局部變量,變量3只能在方法1中使用,變量4 只能在方法2中使用。變量1和變量2是成員變量(屬性),在方法1與方法2中都能使用。
九、String對象的聲明和操作
①常用創建方式
String s=”阿裡巴巴”;
String s1=”abcd”;
String s2=”abcd”;
如圖:s1與s2指向同一個字符串池
②不常用創建方式
String s=new String(“阿裡巴巴”);
String s1= new String(“abcd”);
String s2= new String(“abcd”);
s1==s2 → false
如圖:s1與s2指向不同字符串池
String對象是不可變的;
①類中每一個看來會修改String值的方法,其實都是創建了新的String對象(包含修改後的字符串內容);
②String的只讀特性帶來效率優化可能;
③字符串字面值存儲於字符串池中,String對象優先指向該字符串池,避免反復生成重復的字符串實例;
④系統對String的非修改處理效率很高,遠遠超過另外兩個字符串類StringBuilder和StringBuffer;
String對象的常用方法
① length()--返回此字符串的長度;
② charAt(int index)--返回指定索引處的char值;
③ concat(String str)—將指定字符串連接道此字符串的結尾;
④ contains(CharSequence s)—是否包含指定的字符串序列;
⑤ equals(Object anObject)—將此字符串與指定的對象比較;
⑥ compareTo(String anotherString)—按字典順序比較兩個字符串;
⑦ indexOf(int ch)—返回指定字符串在此字符串中第一次出現處的索引;
⑧ split(String regex)—根據匹配給定的正則表達式來拆分此字符串;
⑨ substring(int beginIndex)—截取字符串;
⑩ toLower/toUpperCase ()—將指定字符串進行大小寫轉換;
⑪ ......
在JDK API中搜索String可以看到用法
1 public class StringDemo{ 2 public static void main(String []args){ 3 String content="Hello,My Friend,You are my best friend"; 4 //返回指定索引處的字符 5 System.out.println(content.charAt(2));//輸出l 6 7 //按字典順序比較兩個字符串 8 System.out.println(content.compareTo("hello"));//-32 9 10 //將指定字符串連接到此字符串的結尾 11 //content.concat("I lied"); 12 //System.out.println(content);//Hello,My Friend,You are my best friend 13 //content=content.concat("I lied"); 14 //System.out.println(content);//Hello,My Friend,You are my best friendI lied 15 16 //測試此字符串是否以指定的後綴結束 17 System.out.println(content.endsWith("friend"));//true 18 19 //測試此字符串是否以指定的前綴開始 20 System.out.println(content.startsWith("Hello"));//true 21 22 //當且僅當此字符串包含指定的 char 值序列時,返回 true 23 System.out.println(content.contains("My"));//true 24 25 //比較 26 String s1="abc"; 27 String s2="abc"; 28 System.out.println(s1==s2);//true 29 System.out.println(s1.equals(s2));//true 30 31 String s3=new String("abc"); 32 String s4=new String("abc"); 33 System.out.println(s3==s4);//false 34 System.out.println(s3.equals(s4));//true 35 36 //返回指定子字符串在此字符串中第一次出現處的索引 37 System.out.println(content.indexOf("o"));//4 38 39 //返回指定子字符串在此字符串中最後一次出現處的索引 40 System.out.println(content.lastIndexOf("o"));//17 41 //返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始 42 System.out.println(content.indexOf("o",5));//17 43 44 //返回此字符串的長度 45 System.out.println(content.length());//38 46 47 //返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的 48 System.out.println(content.replace('e','a'));//Hallo,My Friand,You ara my bast friand 49 50 //根據給定正則表達式的匹配拆分此字符串,返回數組 51 String[] arr=content.split(" "); 52 System.out.println(arr.length);//6 53 for(int i=0;i<arr.length;i++){ 54 System.out.println(arr[i]); 55 } 56 57 //從下標5處開始截取 58 System.out.println(content.substring(5));//,My Friend,You are my best friend 59 //從下標5處開始截取(9-5)個字符 60 System.out.println(content.substring(5,9));//,My 此處y後面有一個空格 61 62 //輸出全小寫 63 System.out.println(content.toLowerCase()); 64 //輸出全大寫 65 System.out.println(content.toUpperCase()); 66 } 67 } View Code
面向對象的優點
①便於程序模擬現實世界中的實體:用“類”封裝建模實體對象的狀態和行為;
②隱藏細節:對象的行為和狀態被封裝在類中,外界通過公開的接口----調用類的方法開獲得狀態信息,不需關注內部細節如何實現;
③可重用:可以通過類模板,創建多個對象實例,重用類的定義代碼;
Java對象的內存管理機制
① 使用new 創建對象,在堆內存分配對象空間、初始化;
② 在方法棧中定義局部變量,持有對堆內存中對象的引用;
③ 方法執行完返回,棧內存自動釋放,局部變量銷毀;
④ 如果堆內存中對象沒有變量引用它,成為垃圾,由垃圾回收器回收,釋放所占堆內存;
Java垃圾回收器
① Java運行時系統有一個垃圾回收線程負責清除不再使用的對象,俗稱垃圾回收器;
② 垃圾回收器定期掃描內存,對於被使用的對象加上標記,按可能的路徑掃描結束後清除未加標記的對象
③ 被回收的對象:1、不再被任何變量引用的對象;2、引用變量自動放棄;3、人為將引用變量置為null;