對象在創建的時候會初始化,初始化時Java會調用構造器,若沒有自定義構造器則會調用默認的構造器,若沒有數據成員賦予初始值(顯示初始化),則根據其類型采用默認初始值。 一般來說,我們會使用構造器來初始化對象。初始化方法的優先級:構建方法 > 顯式初始值 > 默認初始值
-
構造器基本特征:
- 構造器的名字和類的名字相同
- 構造器沒有返回值
Java會同時根據方法名和參數列表來決定所要調用的方法,這叫做方法重載,構建方法可以重載,普通方法也可以重載
封裝:保留有限的外部接口,隱藏具體實施細節,用戶處在封裝的外部,只能通過接口,進行所需的操作,封裝提高了產品的易用性,安全性
-
Java通過三個關鍵字來控制對象的成員的外部可見性
- public
- private
- protected
在Java的通常規范中,表達狀態的數據成員要設置成private,對數據成員的修改要通過接口提供的方法進行。用戶不能直接修改數據,必須通過相應的方法才能讀取和寫入數據。
-
interface
- 不需要定義方法的主體
- 不需要說明方法的可見性
- interface中的方法默認為public
- 一個類的public方法構成了接口,所有出現在interface中的方法都默認為public
我們可以在一個類的定義中實施接口(implements),一旦類中實施了某個interface,必須在該類中定義interface的所有方法,類中的方法需要與interface中的方法原型相符
在一個新類的定義中使用其他對象,這就是組合,增加代碼的復用性
基本類型(int,float……)一旦聲明就會被分配內存空間,而普通類型需要使用new關鍵字來分配內存空間。
Java為每個基本類型提供了相應的普通類型,如int基本類型對應Integer類型,如果將基本類型的對象轉成相應的普通類型變量,所謂的基本類型也就成為了一般意義上的類型(不再有內存管理上的不同)
package
例:
package com.defineof.society
- 表示該程序在com.vamei.society包中,com.defineof表示包作者的域名。Jaav要求包要有域名前綴,以便區分不同的作者,society為進一步的本地路徑名
- Java程序提供了一個命名空間,一個Java類的完整路徑由它的包和類名共同構成
例:
com.defineof.society.Human
一個Java文件中只能有一個public的類,該類要與.java文件同名。一個類可以沒有public關鍵字,實際上也表示一種權限:該類在它所在的包可見,包中的其他Java程序可以訪問該類,這是Java中的默認訪問權限。
import用于識別路徑,利用import語句,我們可以引入相應路徑下的類
如果包沒有在當前工作路徑下,我們在使用包時,需要通知Java
$javac -classpath /home/defineof/javapackage:Test.java
$java -classpath /home/defineof/javapackage:Test
- 另外,可以設置系統的CLASSPATH環境變量,將上述路徑加入到該變量中,而不用每次都鍵入-classpass選項
- 包管理的是.class文件,Java號稱“一次編譯,處處運行”。.class文件可以在任意裝有Java虛擬機(JVM)的平臺上運行,實現了良好的可移植性
-繼承是除組合之外,提高代碼重復可用性的另一種重要方式
組合:重復調用對象的功能接口
繼承:重復利用已有的類的定義
使用extends關鍵字表示繼承
class Woman extends Human {……}
通過繼承,創建了一個新類,叫做衍生類,被繼承的類成為基類,衍生類以基類作為自己定義的基礎,并補充基類中沒有定義的方法
-
通過繼承,創建了Woman類,整個過程可以分為三個層次
- 基類定義
- 衍生類定義
- 外部使用
在衍生類中,不能訪問基類的private成員
用關鍵字來指代基類對象,使用super.member的方式來表示基層的(public)成員
標為protected的成員在該類及其衍生類中可見,基類的protected成員可以被衍生層訪問,但不能被外部訪問
當基類和衍生類中的方法名和參數列表都相同時,在外部使用時,Java會曾賢衍生層的方法,而不是基類方法,這種機制叫做方法覆蓋,通常用于修改基類成員的方法
-
衍生類的構造方法
- 要在衍生類的定義中定義與類同名的構造方法,在該構造方法中
- 由于在創建衍生對象的時候,基類對象先被創建和初始化,所以,基類的構造方法應該先被調用,使用super(argument list)的語句,來調用基類的構造方法。
- 基類對象創建之后,開始構建衍生層(初始化衍生層對象),與一般的構建方法相同
- 要在衍生類的定義中定義與類同名的構造方法,在該構造方法中
類數據
class Human(){
……
private static int population;
}
- 類成員
class Human(){
……
public static int getPopulation()
{……}
}
調用該方法時,可以通過class.method()方式調用,也可以通過object.method()方式調用
對象方法可以訪問修改數據
-
final關鍵字用來表示這個數據/方法/類不能被改變了
- final基本類型的數據:定值,只能賦值一次,不能再被修改,適合存儲一些常量
- final方法:該方法不能被覆蓋,private的方法默認為final的方法
- final類:該類不能被繼承
- final普通類型的對象,表示對象引用只能指向一個對象,但對象的內容可以改變
接口繼承與類繼承很類似,以繼承的interface為基礎,增添新的接口方法原型
在Java類的繼承中,一個衍生類只能有一個基類,一個類不能同時繼承多余一個的類
在Java中,interface可以同時繼承多余一個interface,這叫做多重繼承
抽象類
abstract class Food {
public abstract void eat();
public void happyFood(){
……
}
}
- 類中的方法可以聲明為abstract,不需要具體定義該方法的原型(與接口類似),當有衍生類繼承該類,需要提供該抽象方法的的具體定義
- 當一個類中出現abstract方法時,這個類的聲明必須加上abstract關鍵字
- 一個abstract類不能用于創建對象
抽象類的繼承:可以像繼承類那樣繼承一個抽象類,但必須用完整的方法定義,來覆蓋抽象類中的抽象方法,否則,衍生類依舊是一個抽象類
抽象類的定義中可以有數據成員,數據成員的繼承和正常類的繼承相同
- 從一個高精度類型轉換到低精度類型,有可能會損失信息,這種轉換叫做收縮變換(narrowing conversion)
- 從一個低精度類型轉換成高精度類型,則不存在信息損失,這種轉換叫做寬松變換(widening conversion)
- 將一個衍生類引用轉換成其基類引用,叫做向上轉換(upcast)
public class Test
{
public static void main(String[] args){
Cup aCup;
BrokenCup aBrokenCup = new BrokenCup();
aCup = aBrokenCup;
}
}
class Cup{
……
}
class BrokenCup extends Cup{
……
}
- 將一個基類引用轉換成為衍生類的引用,叫做向下轉換(downcast)
public class Test
{
public static void main(String[] args){
BrokenCup aBrokenCup = new Cup();
}
}
class Cup{
……
}
class BrokenCup extends Cup{
……
}
- Java可以根據當前狀況,識別對象的真實類型,叫做多態