程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java學習 (九)、面向對象編程,java面向對象編程

Java學習 (九)、面向對象編程,java面向對象編程

編輯:JAVA綜合教程

Java學習 (九)、面向對象編程,java面向對象編程


一、理解面向對象

結構化程序設計

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved