一、面向對象概述 面向對象是相對面向過程而言,面向對象和面向過程都是一種思想。面向對象是基于面向過程。
|--面向過程:強調的是功能行為。如,打開門。
|--面向對象:強調的是功能對象。如,門.打開,先有門才有打開動作
|--面向對象的特點:
是一種符合人們思考習慣的思想。可以将複雜的事情簡單化。将程式員從執行者轉換成了指揮者完成需求時,這樣簡化開發并提高複用:
a)先要去找具有所需的功能的對象來用。
b) 如果該對象不存在,那麼建立一個具有所需功能的對象。
|--面向對象開發、設計、特征
|--開發:其實就是不斷的建立對象,使用對象,指揮對象來做事。
|--設計:其實是管理和維護對象之間的關系。我們一定是寫類,因為對象太多,無法寫,隻能寫一個類來代表所有對象
|--特性 :封閉、繼承、多态
二、類和對象 |--類 :對現實生活中事物的描述。類中包含屬性和行為。
|--屬性:一個對象它具有什麼特征,我們稱它具有什麼屬性
|--行為:一個對象它有自己的行為,它具有什麼行為,我們稱它具有什麼方法
|--對象:就是這類事物,實實在在存在的個體。可以根據類具有的屬性和方法,賦予類不同的數值,來建立不同的對象執行個體。
三、類 類是Java的核心。在Java中,完成對功能操作封裝的機關稱為類。類是有共同特性(屬性)和操作(行為)定義的實體,類是用于組合各個對象所共有操作和屬性的一種機制。
|--建立類的一般格式:
[修飾符] class 類名 [extends父類名] [implements接口名清單]
{
成員變量聲明
成員方法聲明
}
其中:class、extends和implements都是Java的關鍵字(保留字)。
類的修飾符主要有public、abstract 、final及預設通路修飾符等四種。
注意:一個類可以同時有多個修飾符,但是不能有相同的修飾符。當一個類有多個修飾符時,這些修飾符無先後順序,可任意排列。
|--成員變量/局部變量
|--成員變量:
a)成員變量定義在類中,在整個類中都可以被通路。
b) 成員變量随着對象的建立而建立,存在于對象所在的堆記憶體中。
c) 成員變量有預設初始化值。
|--局部變量:
a) 局部變量隻定義在局部範圍内,如:函數内,語句内等。
b) 局部變量存在于棧記憶體中。
c) 作用的範圍結束,變量空間會自動釋放。
d) 局部變量沒有預設初始化值。
|--成員方法
定義在類内,格式如下:
修飾符 傳回值類型 函數名(參數類型 型參1,…………)
{
執行語句;
return 傳回值; //如果傳回值類型是void,return語句可以不寫
}
|--構造方法
構造方法用來執行個體化對象,具有和類名相同的名稱。而且不傳回任何資料類型,在構造方法的實作中,也可以進行方法重寫。
|--聲明格式
修飾符 類名(參數)
{
執行代碼
}
|--關注細節:
(1)當一個類中沒有定義構造函數時,那麼系統就會預設給該類加入一個空參數的構造函數。
(2)當在類中自定義了構造函數後,預設的構造函數就沒有了。
(3)這個預設的構造函數的權限和所屬類一緻。如果類被public修飾,那麼預設的構造函數也帶public修飾符。如果類沒有被public修飾,那麼預設的構造函數,也沒有public修飾。
(4)當修飾符為private 時,隻能本類内建立對象,其它類不可建立此對象。
|--權限修飾符
權限修飾符有public protected default private ,其中修飾後的通路權限如下所示:
java基礎—4.面向對象一、面向對象概述二、類和對象三、類四、this關鍵字五、super關鍵字六、對象的建立七、封裝性八、繼承性九、多态性十、Object類(上帝類)十一、static類及static方法十二、内部類十三、接口十四、final關鍵字十五、abstract類
四、this關鍵字 this代表它所在函數所屬對象的引用。
|--this的應用:
1.當定義類中功能時,該函數内部要用到調用該函數的對象時,這時用this來表示這個對象。
2.但凡本類功能内部使用到了本類對象,都用this表示。
|--this用于構造函數:
1.用于構造函數之間進行互相調用。如:this(age);
2.this語句隻能定義在構造函數的第一行。因為初始化先執行。
|--this的兩種用法:
1、用于區分同名變量的情況,說的成員和局部同名的時候;
2、用于構造函數間調用。
注:
一般函數不能直接調用構造函數,因為this語句不能用在一般函數中,隻能用在構造函數間。
五、super關鍵字 super關鍵字用于子類建立對象的初始化過程中。在建立派生類的對象時,使用派生類的構造方法對其初始化,不但要對自身的成員變量賦初始值,還要對父類的成員變量賦初始值。
Java語言中,子類調用父類構造方法的原則:
1.在子類的構造方法中,系統會自動添加一條語句:super();它将調用父類的無參構造方法;若父類中沒有無參構造方法時,會出錯。
2.如父類是有參數的構造方法,子類可以通過在自己的構造方法中使用super(參數);來調用它,且該語句必須是子類構造方法的第一個可執行語句。
六、對象的建立
|--對象的初始化過程
1,把類名.class檔案加載到記憶體中。
2,執行該類中的static代碼塊,如果有得話,給該類進行初始化。
3,在堆記憶體中開辟空間,配置設定記憶體位址。給對象
4,在堆記憶體中建立對象的特有屬性。并進行預設初始化。
5,對屬性進行顯示初始化。
6,對對象進行構造代碼塊初始化。
7,對對象進行對應構造函數初始化。
8,将記憶體位址賦給棧記憶體中的對象名變量。
|--單例設計模式(餓漢式、懶漢式)
設計模式是解決某一類問題最行之有效的方法。java有23種設計模式。單例設計模式是解決一個類在記憶體隻存在一個對象的情況。想要保證對象唯一,思考如下:
1.為也避免其它程式過多建立該對象,先禁止其它程式建立該類對象;
2.還為了讓其它程式可以通路到該類對象,隻好在本類中,自定義一個對象;
3.為了友善其它程式對自定義對象的通路,可以對外提供一些通路方式。
單例設計模式有兩個方式:餓漢式、懶漢式
|--餓漢式 特點是 總是先建立對象,類一進入記憶體就已經建立好了對象
class Single {
private static Single s = new Single();
private Single(){ }
public static Single getInstance(){
return s;
}
}
|--懶漢式 特點是方法被調用時,才初始化,也叫做對象的延時加載。即Single類進記憶體,對象還沒有存在,方法調用時才存在
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null)
{
synchronized(Single.class)
{
if(s= null )
s = new Single();
return s;
}
}
}
}
七、封裝性 封裝,是指隐藏對象的屬性和實作細節,僅對外提供公共通路方式,封裝的好處是
|--好處
1.将變化隔離
2.便于使用
3.提高重用性
4.提高安全性
|--封裝的原則
1.将不需要對外提供的内容都隐藏起來;
2.把屬性都隐藏,提供公共方法對其通路;
|--封裝的方法
private關鍵字:權限修飾符;用于修飾類中的成員(成員變量,成員函數);私有隻在本類中有效。
常用之一:
将成員變量私有化,對外提供對應的set,get方法對其進行通路。提高對資料通路的安全性。私有是封裝的表現形式之一。
八、繼承性 當多個類中存在相同屬性和行為時,将這些内容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,隻要繼那個類即可。繼承是讓類與類之間産生關系,有了這個關系,才有了多态的特性。繼承提高了代碼的利用性。
|--8.1 繼承的使用規則:
1.Java語言中,隻支援單繼承,不支援多繼承
2.必須是類與類之間有所屬關系才可以繼承。這種所屬關系的表示為is a
3.類可以多重繼承
|--8.2 繼承的使用——使用一個繼承體系中的功能
想要使用體系,先查體系中父類的描述,因為父類中定義的是該體系中的共性功能。通過了解共性功能,就可以知道該體系的基本功能。這樣這個體系就可以基本使用了。在具體調用時,要建立最子類的對象。原因:
1.因為有可能父類不能建立對象。
2.建立子類對象可以使用更多的功能,包括基本的也包括特有的。
簡單一句就是:查閱父類功能,建立子類對象使用功能
|--8.3 子父類中,成員的特點
|--(1)變量
如果子類中出現非私有的同名成員變量時,子類要通路本類中的變量,用this。子類要通路父類中的同名變量,用super。
super的使用和this的使用幾乎一緻,且兩者都存在于方法區中。
|--this表示本類對象的引用。
|--super表示父類對象的引用。
|--(2)函數
當子類出現和父類一模一樣的函數時,當子類對象調用該函數,會運作子類函數的内容。如同父類的函數被覆寫一樣。這種情況是函數的另一個特性:重寫(覆寫)。
當子類繼承父類,沿襲了父類的功能,到子類中。但是子類雖具備該功能,但是功能的内容卻和父類不一緻,這時,沒有必要定義新功能,而是使用覆寫特性,保留父類的功能定義,并重寫功能内容。子類同時具有父類方法中的内容時,可以用super.方法();
|--重寫的規則
(1)子類覆寫父類,必須保證子類權限大于等于父類權限,才可以覆寫,否則編譯失敗。
(2)靜态隻能覆寫靜态。
(3)父類中的私有方法不能被重寫。
|--重載與重寫
重載:隻看同名函數的參數清單。
重寫:子父類方法要一模一樣。
|--(3)構造函數
在對子類對象進行初始化時,父類的構造函數也會運作。那是因為子類的每一個構造函數預設第一行有一條隐式的語句super()。super()會通路父類中空參數的構造函數。而且子類中所有的構造函數預設第一行都是super(),也隻能在第一行。
子類一定要通路父類中的構造函數的原因是父類中的資料子類可以直接擷取,是以子類對象在建立時,需要先檢視父類是如何對這些資料進行初始化的。是以子類在對象初始化時,要先通路一下父類中的構造函數。
如果要通路父類中指定的構造函數,可以通過手動定義super語句的方式來指定。
子類的所有構造函數,預設都會通路父類中空參數的構造函數。因為子類每一個構造函數内的第一行都有一句隐式super();當父類中沒有空參數的構造函數時,子類必須手動通過supe語句或者this語句形式來指定要通路的構造函數。當然子類的構造函數第一行也可以手動指定this語句來通路本類中的構造函數。子類中至少會有一個構造函數會通路父類中的構造函數。
小知識點:
為什麼this()和super()不能在同一個構造函數中?
因為它兩不能在同一行。
為什麼不能再同一行?
因為初始化動作要先做。在子類構造函數中必有一個this語句或者super語句。
九、多态性 多态主要表現在:向上轉型、向下轉型
多态可以了解為事物存在的多種展現形态。
|--多态的展現
1.父類的引用指向了自己子類的對象。
2.父類的引用也可以接收自己的子類對象。
|--多态的前提
1.類與類之間必須有關系,要麼繼承,要麼實作。
2.存在覆寫。父類中有方法被子類重寫。
|--多态的利與弊
利:提高了程式的可擴充性和後期可以維護性。
弊:隻能使用父類中的引用通路父類中的成員。也就是說使用了多态,父類型的引用在使用功能時,不能直接調用子類中的特有方法。
|--多态中的成員特點
|--函數
編譯看左邊,運作看右邊……
Father fu = new Sun();
注意:如果是靜态函數的話,無論編譯和運作都是看左邊,因為靜态的方法不屬于對象,隻屬于類。static方法先加載……
|--變量
無論編譯和運作,都看左邊
|--多态的應用
1.定義好工具類,即将共同行為封裝在一個類中。
2.對類型進行抽取,---->多态的産生。
3.操作同一父類型,對其中的子類型均可操作
十、Object類(上帝類) Object:是所有對象的直接後者間接父類,傳說中的上帝類,該類中定義的肯定是所有對象都具備的功能。
如果自定義類中有與父類相同的功能,沒有必要專門定義另一個名稱的函數,可以沿習父類的名稱,即重寫函數,實作功能。
Object類最最重要的功能是展現在多态性上,父類的引用指向子類對象。這樣可以簡化代碼的書寫。增加功能的擴充性。
|--equals(Object obj )
|--toString()
十一、static類及static方法 static是一個修飾符,用于修飾成員變量和成員函數。當成員被靜态修飾後,就多了一個調用方式,除了可以被對象調用外,還可以直接被類名調用。格式:類名.靜态成員。
|--靜态利弊:
|--利處:對對象共享資料進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。可以直接被類名調用。
|--弊端:生命周期過長。通路出現局限性。(靜态雖好,隻能通路靜态)。
|--static特點:
(1)随着類的加載而加載。即:靜态會随着類的消失而消失,說明它的生命周期最長。
(2)優先于對象存在。靜态是先存在。對象是後存在。
(3)被所有對象所共享。
(4)可以直接被類名所調用。由于靜态成員可以直接被類名調用,是以靜态成員變量又稱為類變量。而非靜态成員變量又被稱 為執行個體變量。
|--執行個體變量和類變量的差別:
(1)存放位置。
類變量随着類的加載而存在于方法區中。
執行個體變量随着對象的建立而存在于堆記憶體中。
(2)生命周期。
類變量生命周期最長,随着類的消失而消失。
執行個體變量生命周期随着對象的消失而消失。
|--靜态的分類
|--靜态函數
當功能内部沒有通路到非靜态資料(對象的特有資料),那麼該功能可以定義成靜态的。
|--靜态變量
1.當對象中出現共享資料時,該資料被靜态所修飾。
2.對象中的特有資料要定義成非靜态存在于堆記憶體中。
|--靜态代碼塊
随着類的加載而執行,執行一次。并優先于主函數。用于給類進行初始化。
格式:
static
{
靜态代碼塊中的語句。
}
十二、内部類 分析事物時,發現該事物描述中還有事物,而且這個事物還在通路被描述事物的内容。這時就用到内部類來描述。
|--12.1 内部類的通路規則
|--内部類通路外部類
可以直接通路外部類中的成員,包括私有;
|--外部類要通路内部類
必須建立内部類對象;
|--非靜态情況:new Outer().new Inner().function()
|--通路static内部類的非靜态成員:new Outer.Inner().function()
|--通路static内部類的static方法 Outer.Inner.function();
注意:
(1)當外部類中的靜态方法 通路内部類時,内部類也必須是static 的。
(2)當内部煩躁定義了靜态成員,該内部類必須是static的
public class FunTest {
public static void main(String[] args) {
// 非靜态外部類,非靜态内部類的通路成員方式
new Outer().new Inner().function();
// 非靜态外部類,靜态内部類,非靜态方法的通路方式
new Outer.StaticInner().function();
// 非靜态外部類,靜态内部類,靜态方法 的通路方式
Outer.StaticInner.staticFunction();
}
}
class Outer {
int x = 0;
// 靜态内部類
static class StaticInner {
// 靜态方法
public static void staticFunction() {
System.out.println("這個是靜态内部類的靜态成員");
}
// 非靜态方法
public void function() {
System.out.println("這個是靜态内部類的非靜态成員");
}
}
// 非靜态方法
class Inner {
// 這裡面隻能定義非靜态的方法
public void function() {
System.out.println("這個是非靜态内部類的非靜态成員");
}
}
}
|--12.2 内部類分類
|--(1)成員内部類
定義在一般成員位置上的内部類,叫成員内部類,下面内部類的修飾符為public時,在其它類建立對象方法: 外部類名.内部類名 變量名 = new 外部類().new 内部類(),即:Outer.Inner in = new Outer().new Inner()
<span style="font-size:14px;">public class Outer{
private int x;
public class Inner{
private int x ;
public void doit(int x ){
x++;
this.x++;
Outer.this.x++;
}
}
}</span>
|--(2)局部内部類
在局部位置定義的類,如在類的方法或任意的作用域中均可以定義内部類
publci OuterClass{
public void doit(){
System.out.print("test");
clas InnerClass(){
private int x;
InnerClass(int x){
this.x = x;
}
}
}
}
|--(3)匿名内部類
匿名内部類其實就是一個子類對象。前提是:存在一個類或者接口,這裡的類可以是具體類也可以是抽象類。
使用的格式如下:
new 類名或接口( ){重寫的方法}
如:
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("haha");
}
});
|--(4)靜态内部類
在内部類前添加修飾符static ,這個内部類就變為靜态内部類。有以下2點規則:
1.靜态内部類可以聲明靜态變量,但非靜态不可以;
2.靜态内部類不可以使用外部類的非靜态成員
public class Outer{
int x =0;
static class Inner{
//x=1; 這句是錯的,不可以引用外部的非靜态成員
void doit(){
System.out.pritln("靜态内部類測試");
}
}
}
|--(5)内部類的繼承 與普通類一樣,也可以被繼承,格式如下:
public class ClassA{
class ClassB{
}
}
pulbic TestClass extends ClassA.ClassB{
TestClass(ClassA a){
a.super();
}
}
十三、接口 接口,可以被認為是一個特殊的抽象類。當抽象類中的方法都是抽象的,那麼該類可以通過接口的形式來表示。接口使用interface來表示,子類中用implements實作。
|--13.1 定義格式及使用格式:
|--(1)定義格式
interface 接口名
{
void function();
}
|--(2)使用格式
子類名 implements 接口名1,接口2…………
{
void function()
{實作方法}
}
|--(3)格式要求
(a)接口中常見定義:常量,抽象方法。
(b)接口中的成員都有固定修飾符,編碼時可不寫,編譯器會自動加上。
常量:public static final
方法:public abstract
(c)接口中的成員都是public的。
|--13.2 接口的特點
(1)接口是對外暴露的規則。
(2)接口是程式的功能擴充。
(3)接口的出現降低耦合性。
(4)接口可以用來多實作。這也是對多繼承不支援的轉換形式。java支援多實作。
(5)類與接口之間是實作關系,而且類可以繼承一個類的同時實作多個接口。
(6)接口與接口之間可以有繼承關系。而且可以多繼承。
注:
1,接口不可以建立對象的,因為有抽象方法。需要被子類實作(implements),子類對接口中的抽象方法全都覆寫後,子類才可以執行個體化。否則子類是一個抽象類。
2,實作多個接口時,接口中不可以有傳回不同類型的同名抽象函數。這樣子類實作時将不能複寫。
|--13.3 抽象類與接口對比
|--共性:都是不斷向上抽取出來的抽象的概念。
|--差別:
(1)抽象類展現繼承關系,一個類隻能單繼承。
接口展現實作關系,一個類可以多實作。同時接口與接口之間有繼承關系。
(2)抽象類是繼承,是 "is a "關系。
接口是實作,是 "like a"關系。
(3)抽象類中可以定義非抽象方法,供子類直接使用。
接口的方法都是抽象,接口中的成員都有固定修飾符。
(4)抽象類中可以私有變量或方法。
接口中的常量和方法都是public修飾的權限。
十四、final關鍵字 作為修飾符,可以修飾類、函數、變量:
1.被修飾的變量,是常量隻能指派一次
2.被修飾的函數不能重寫
3.被修飾的類不能被繼承
十五、abstract類 在Java中抽象類的
|--文法格式為:
abstract 抽象類 Demo
{
abstract void method1();
abstract void method2();
…
}
|--規則及用法
1.抽象方法必須定義在抽象類中;
2.必須用abstract關鍵字辨別;
3.抽象類不可建立對象
4.抽象類中的方法要被使用,必須由子類複寫所有的抽象方法,再建立子類對象調用
5.如果子類隻覆寫了部分抽象的方法,那麼該子類還是一個抽象類
|--特殊
抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象;