05.Java面向對象
一.面向對象基本概念
面向對象的特徵
-
封裝
封裝是指利用抽象數據類型將數據(屬性)和對數據的操作(方法)包裝起來,把對象的屬性和動作結合成一個獨立的單位,並儘可能隱蔽對象的內部處理細節。
-
繼承
一個類擁有另一個類的所有屬性和行為時,就稱為繼承。被繼承類為父類,繼承類為子類。
-
多態
通過子類對父類方法的重寫實現多態
同一類中同名方法實現多態(重載方法需定義不同參數列表)
二.類的定義
Java類邏輯結構
在Java語言中,有一個頂層的類Object,它是Java中所有類的父類,在Java中稱為基類
訪問修飾控制符
類型 | private | 無或者(friendly) | protected | public |
---|---|---|---|---|
同一類 | 是 | 是 | 是 | 是 |
同一包中子類 | 否 | 是 | 是 | 是 |
同一包中非子類 | 否 | 是 | 是 | 是 |
不同包中子類 | 否 | 否 | 是 | 是 |
不同包中非子類 | 否 | 否 | 否 | 是 |
每個源文件只能有一個public類,且類名也是源文件名。
一個源文件可以不含有公有類,此時文件名可以任取。
類的定義
[public][abstract | final] class Name[extends SuperName][implements InterfaceNameList]{
//成員變數的聲明
//成員方法的定義
}
abstract//抽象類說明符。抽象類不能直接生成對象
final//終級類說明符。終級類不能被繼承
成員變數
[public | private | protected][static][final][transient][volatile] DataType variableName[ = initializationValue]
final//聲明一個終極變數(即常量)
static//聲明一個靜態變數(類變數)
transient//聲明一個暫時性變數,提示Java虛擬機忽略保存
volatile//非同步保護,維護變數在並發進程的前後一致性
三.方法
方法的定義
[public | private | protected][abstract]|[final][static][native][synchronized] returnDataType | void methodName(parametersList) throws exceptionList{
//方法內變數
//方法內主體程式碼
}
native//本地化
synchronized//同步
throws exceptionList//定義方法拋出的異常對象的列表
四.對象
對象的定義
className ObjectName = new className(parameter);
匿名對象
new className(parameter)
對象的引用
引用是一個地址,指明了對象的的變數和方法的儲存位置。當把一個對象賦值給一個對象變數或者作為方法的參數時,使用的並不是對象本身,也不是它的拷貝,而是它的地址。
Student stu1 = new Student();
Student stu2 = stu1;
//stu2和stu1引用同樣的對象,stu2不是stu1的拷貝,stu2並沒有分配記憶體空間
五.實例成員和類成員
實例成員
實例成員是指在訪問成員變數和成員方法時,需要通過new創建一個實例對象,然後通過” . “操作符去引用類的成員
實例成員不用static修飾
類成員
-
類變數
用static修飾的變數
-
類方法
我們知道,不管是類方法與實例方法,都是以程式碼塊的方式存在,當類的位元組碼文件載入到記憶體時,它們在記憶體中均只有一個備份。但類方法與實例方法不相同的是:
(1)對類的實例方法, 當類載入到記憶體時,不分配人口地址。當該類創建對象後,類中的實例方法才會被分配人口地址,從而實例方法可以被類創建的任何對象調用執行,這個人口地址也是被所有對象共享的。
(2)對類的類方法,在該類被載入到記憶體時,就分配了相應的人口地址,當然這個地址在整個類中也是共享的,從而類方法不僅可以被類創建的任何對象調用執行,也可以直接通過類名調用。
那麼Java應用程式類中的main( )方法為什麼必須聲明為static呢?這是因為只有類方法,當類載入到記憶體後就可以獲得該方法的人口地址,從而可以由Java虛擬機調用執行,成為整個應用程式的執行人口。如果把main( )方法聲明為實例方法,這個main( )方法就無法在類載入到記憶體時被Java虛擬機直接調用。
初始化器
初始化器是一段不在方法之內的程式程式碼,這段程式碼用{ }包圍起來。
實例初始化器:無修飾符static,在對象生成時初始化變數(一般不會使用,沒有實際意義)
靜態初始化器:有修飾符static,在被類載入入記憶體時只執行一次.
public class Demo {
// constructor 構造函數
public Demo() {
System.out.println("constructor");
}
// static initializer 靜態初始化器
static {
System.out.println("static");
}
public static void main(String[] args) {
new Demo();
}
}
//輸出
static
constructor
實例程式碼的初始化在構造方法中完成,類變數的初始化應在靜態初始化器中完成,使程式碼更容易維護和閱讀。
六.命令行參數
命令行參數使用格式
//格式一
Java className parameter1 parameter2 parameter3
//格式二(當參數中包含空格時)
Java className "parameter1" "parameter2" "parameter3"
//混合使用(包含空格參數用雙引號括起來,沒空格不必括起來)
Java className "this is" "a command" "line parameter"
命令行參數的接收
public static void main(String [] args)