1. 程式人生 > >6 面向對象之類和對象

6 面向對象之類和對象

語法 justify util pro tro 類變量 .sql test 創建時間

1 面向對象和面向過程的區別

  兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。

區別:

  1)編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要首先抽象出類、屬性及其方法,然後通過實例化類、執行方法來完成功能。

  2)封裝性:都具有封裝性,但是面向過程是封裝的是功能,而面向對象封裝的是數據和功能。

  3)面向對象具有繼承性和多態性,而面向過程沒有繼承性和多態性,所以面向對象優勢是明顯。

2 類和對象

  對象:客觀存在的實體(一個具體的事物)。

  類:具有相同特征和共同行為對象的集合。是人類腦海中一個抽象的概念,代表的是一種"共性".

  類中的成員:1.成員屬性(描述外部特征) 2.成員方法(描述功能行為)

3 定義和訪問類

  1)定義一個類:

   [修飾符] class 類名{

   //1.屬性的定義:與定義變量類似

   [修飾符] 數據類型 屬性名;

   //2.方法的定義

   [修飾符] 返回值類型 方法名(形參列表){

   //方法體;

   }

   }

2)訪問類中成員

  a.訪問屬性:

   創建對象(創建實例):類名 對象名 = new 類名();

     賦值: 對象名.屬性=值;

    屬性

(成員變量):作用域範圍是在整個類體.

  b.調用方法

   靜態方法(使用static修飾的方法):類名.方法名()

   普通方法(非static修飾的方法):對象名.方法名();

4 變量的作用域

  變量聲明的位置不同會導致其作用域不同。

  局部變量:在方法內部聲明的變量,其作用域僅限於當前方法使用。

  成員變量:在類中聲明的屬性,其作用域可以在當前類中使用。

區別:

  1.作用域不同:成員變量的作用域是在整個類體,局部變量的作用域在當前方法

  2.是否有默認初始值:成員變量是有默認的初始值,局部變量沒有默認初始值。

     eg:int類型默認初始值為0 double類型默認初始值為0.0 boolean類型默認為false String默認為null

   3.是否能使用修飾符(public/private/protected/默認):成員變量:可以添加public等修飾符,局部變量不能。

  4.在內存中保存的位置不同:成員變量保存到堆中,局部變量保存到棧。

5構造方法

  構造方法(構造器):是一種特殊的方法,主要用於為成員變量初始化(為成員變量賦初始值)。

特征:

  1.方法名必須與類名相同。

  2.沒有返回值類型。void也是一種返回值類型。

  構造的作用:為成員變量賦初始化值。

  語法: [修飾符] 類名([形參列表]){

   }

  構造方法使用new關鍵字進行調用。

  如果沒有顯式定義構造方法,虛擬機會自動添加無參構造,但是一旦顯式定義了構造方法,虛擬機在編譯時將不同添加無參構造(默認無參構造失效),如果需要調用無參構造就必須自己定義。

  構造方法是可以重載(方法名相同,參數列表不同)。

6 this關鍵字

  this關鍵字:代表當前對象本身

   1)用於區分成員變量和局部變量。

   2)可以使用this訪問當前對象的成員變量和成員方法(可以使用this調用屬性和方法) this.方法名()或this.屬性

   3)可以使用this調用構造方法,必須作為構造方法的第一行語句。

  public Dog(String name,String bland,int age){

    this.name=name;

    this.bland=bland;

    this.age=age;

  }

  public void test(){

  }

  this.name ;訪問屬性

  this.test(); 調用方法

7 值傳遞和引用傳遞

  數據類型可以分為基本數據類型和引用數據類型

  如果將基本類型作為方法參數屬於值傳遞:方法執行結束後不會保留執行結果。

  如果將引用數據類型作為方法參數,屬於引用傳遞,方法執行結束後會保留執行結果。

8 內存結構

  1)

   在方法中聲明的局部變量保存在棧中,方法執行結束後棧中數據會被回收

  2)堆

   堆中保存的是對象的信息,使用new關鍵字創建的對象信息。堆中信息會被java的垃圾回收器回收。

  3)方法區

   保存的是類的信息(代碼)、靜態(static)變量、字符串常量等。

9 static關鍵字

  1)static修飾的變量為靜態變量,類變量

    訪問方式:  類名.變量名(推薦)  對象名.變量名

   ①成員變量和全局變量的區別:

     a.在計算機內存中保存的位置不同:

     成員變量保存在堆中,全局變量保存在方法區

     b.保存的份數不同

     成員變量每new一次都開辟空間,保存多份。

     全局變量只有1份

     c.訪問方式不同

     成員變量: 對象名.屬性,可以使用this關鍵字。

     全局變量: 類名.屬性(推薦) 對象名.屬性

     d.創建時間不同:

     成員變量:只有使用new關鍵字創建對象時才會在堆中為其分配空間

     全局變量:在類加載時在方法區中分配空間。

  2)使用static關鍵字可以修飾方法:靜態方法或類方法

   特點:靜態方法中無法訪問非靜態的成員變量或方法;但非靜態的方法中是可以訪問靜態的成員

   訪問方式: 類名.方法名(推薦) 對象名.方法名

  3)使用static修飾代碼塊,靜態代碼塊

   語法:static{

     //代碼

     }

   執行過程:在類加載時執行靜態代碼塊。靜態代碼塊>普通代碼塊>構造方法。只會執行1次。

 代碼塊:使用花括號包含的代碼。使用比較少。不需要顯式調用。

 代碼塊的執行順序:在創建實例時執行。代碼塊在構造方法之前執行,並且按照順序執行,每創建一個對象就會執行1次。執行多次。

  類中代碼的執行順序: 靜態代碼塊>代碼塊>構造方法>靜態方法或實例方法。

  靜態的方法中只能訪問靜態變量, 非靜態的方法可以訪問靜態或非靜態的變量

10 package和import關鍵字

  1)package關鍵字主要用於聲明包。

   java中的包:類似文件夾

  作用:1.分門別類進行存放數據,方便分類和管理。2.避免命名沖突。

  包的命名規範:所有字母都是小寫,多級包名之間利用.進行分割

  java中常見的包: java.lang包之外的其他包下的類,使用時需要導包。

   * java.lang包:java核心類庫,String,System,Math... 該包下的類可以直接使用,無需導包。

   * java.util包:工具類。 Arrays,Scanner...

  * java.io包:i(input)/o(output)和java中流的輸入和輸出相關的類庫。

   * java.net包:網絡編程相關的類庫。

   * java.sql包:與數據庫操作相關的類庫。

   * java.text包:國際化或格式化輸出相關的類庫。

   * java.awt包/javax.swing包:圖形化界面相關的類庫

   * 聲明包:使用package關鍵字,必須放在該類的第一行。

  * 語法: package 包名; eg:cn.zzsxt.oop7;

  2)導入包: import關鍵字,在使用非當前包下的其他包下的類時需要導包

   方式一: import 包名.*;將整個包導入。 eg: import cn.zzsxt.oop6.*;

   方式二(推薦): import 包名.類名; eg:import cn.zzsxt.oop6.TestStatic;

  *直接使用全類名進行訪問: 包名.類名;

     cn.zzsxt.oop6.TestStatic testStatic = new cn.zzsxt.oop6.TestStatic();

  *特殊場景:不同的包下存在相同的類名。

     import java.util.*;

     import java.sql.*;

   java.util.Date date = new java.util.Date();

  3)靜態導入

    package cn.zzsxt.oop7;

    import static java.lang.Math.*;

    import static java.lang.Math.PI;

    import static java.lang.Math.random;

  靜態導入:JDK1.5之後的新增特性。

   語法: import static 包名.類名;

  作用:如果使用靜態導入某個類或類中屬性和方法,可以直接使用該類中的靜態屬性或靜態方法。

    System.out.println(Math.PI);

    double rand = Math.random();

    System.out.println(rand);

    System.out.println(PI);//使用java.lang.Math類中的靜態屬性

    System.out.println(random());//使用java.lang.Math中的靜態方法

}

6 面向對象之類和對象