歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中面向對象知識總結

Java中面向對象知識總結

日期:2017/3/1 9:12:47   编辑:Linux編程

Java中面向對象知識總結

一:基本概念

舉例:寫一個程序,實現如下功能:
一群寵物,寵物有各種類型,如貓、狗、企鵝等
讓這群寵物,按照各自的能力不同,進行各種比賽(如爬樹、游泳、跳水);擴展性需求: 游泳比賽游泳池的參數、飛盤的大小和重量等

1.首先從裡面抽象出名詞性的概念(需求分析,抽取概念模型)
寵物、貓、狗、企鵝、比賽、能力、寵物類型

  2. 把名詞抽象成相應的class,或class的屬性

   3.提取動詞 -------------------- 把這些動詞,抽象成對象的行為
  爬樹、游泳、跳水
類和對象的關系:
類是用於描述同一類的對象的一個抽象的概念,類中定義了這一類對象所具有的靜態屬性和動態屬性
類可以看成一類對象的模板,對象可以看成該類的一個具體實例。

下面看一段代碼

package com.chen.biz;
/**
* 構建了一個寵物類
*
* @author 陳家小哥
*
*/
public class Pet {
private String name; // 寵物的名字
private String sex; // 寵物的性別

//構造函數(空的)
public Pet() {
// TODO Auto-generated constructor stub
}
/**
* 方法
* 寵物都可以玩游戲
* @param pet
*/
public void playGame(Pet pet){
}
}


構造函數:
創建一個對象,必須調用它的構造函數。當一個類中沒有構造函數時,會自動生成一個空的構造函數。
構造函數的作用:給成員變量進行初始化。如果沒有給成員變量初始化,系統會分配默認值給這些成員變量。

二:常量和變量

--------------------------------------------------------------------------------

常量:永遠不會改變(static final)
編譯期常量(static final):在程序編譯的時候,所有調用常量的位置,都被常量代表的值所替換 , 最大的好處是節省內存
程序運行期常量(final):一次賦值之後,永遠不能改變
常量的命名一定要大寫 ,如名字較長,用下劃線進行間隔 SEX_MALE

變量
1.局部變量:通過參數傳入或者在方法中定義

public void Play(String name){
string age; //局部變量
System.out.print(name); //name也是局部變量
}


局部變量的作用域是該變量所在的{} 。
局部變量的生命期:
基本類型:超出局部變量定義的{},就會被標識為無效,等待GC來回收。
引用類型:超出局部變量定義的{},會引用計數-1,如果引用計數為0,就會被GC下次掃描時回收。
2.成員變量(對象變量)
成員變量是定義咋方法外的變量。

public class Pet {
private String name; // 寵物的名字 成員變量
private String sex; // 寵物的性別 成員變量
/**
* 方法
* 寵物都可以玩游戲
* @param pet
*/
public void playGame(String cc){
System.out.println(cc);
}
}

成員變量的作用域:就是所在class內的所有方法
成員變量的生命期:與它所在的對象的生命期一致

在沒有static靜態變量的情況下程序運行順序如下:
1.系統給屬性賦默認值
2.用戶在成員變量級直接賦默認值
3.在構造函數中對成員變量進行初始化。
static變量:
1.稱為類變量,它是所有對象共享的內存;
2.不需要類的實例,可以直接通過類的名字調用。
3.作用域類似於全局變量
4.在第一次調用這個變量時,分配內存。

下面是幾個小例子:

public class Test {
public static final double PAI = 3.1415926; //靜態常量
public final double PAI2 = 3.1415926;//常量
public static double PAI3 = 3.1415926;//靜態變量

public Test(){

}
}

public class Test {
public static final double PAI;
public final double PAI2;
public static double PAI3;

public Test(){
this.PAI = 3.1415926; //錯誤,必須在定義時就賦值
this.PAI2 = 3.1415926; //可以,初始化賦值。
this.PAI3 = 3.1415926;//不可以 不能再構造方法中給靜態變量賦值,因為靜態變量加載時可能這個類並沒有被加載。
}
}

public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;;
public static double PAI3 = 3.1415926;;
public double PAI4 = 3.1415926;

public static void test(){
this.PAI = 3.14;
this.PAI2 = 3.14;
this.PAI3 = 3.14;
this.PAI4 = 3.14; //均存在錯誤,因為靜態方法中不可以用this關鍵字
}
}

public class Test {
public static final double PAI;
public final double PAI2;
public static double PAI3 = 3.1415926;;

public static void test(){
PAI = 3.14; //編譯期常量不能在這賦值
PAI2 = 3.14; //靜態方法不能直接調用成員變量,原因是這個成員變量還沒有分配內存,需要通過對象調用
PAI3 = 3.14; //靜態方法調用靜態變量OK
}

package com.chen.test;
/**
* 說出輸出順序
* @author 陳家小哥
*
*/
public class Test extends A {
int num = 7777;
private static A mm = new A();
static {
System.out.println("1111");
}
{
System.out.println("2222");
}

public Test() {
System.out.println("3333");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.num);
}
}

class A {
int num = 5555;

public A() {
System.out.println(num);
}
}
輸出結果:
5555
1111
5555
2222
3333
7777

解釋:當類被加載時,先初始化靜態的變量,輸出5555和1111,然後調用父類的構造函數,輸出5555,然後輸出2222,最後調用子類的構造函數,輸出子類的成員變量。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-08/134438p2.htm

Copyright © Linux教程網 All Rights Reserved