java從入門到入土---基礎篇02--面向對象oop

面向對象

面向對象的概念

  所謂的面向對象是一種編程思想,經過這種思想能夠把生活中的復瑣事情變得簡單化,從原來的執行者變成了指揮者,面向對象是基於面向過程而言的java

 

面向對象的三大特徵

封裝

  概念:封裝是指隱藏對象的屬性和實現細節,僅僅對外提供公共的訪問方式編程

  優勢:一、提升安全性;二、提升重用性安全

  private關鍵字:是一個權限修飾符,用於修飾成員變量和成員函數,被私有化的成員只能在本類中訪問。想要修改只能,對外提供公共的,get和set方法。ide

 

繼承

  初衷:提升代碼的重用性函數

  好處:假設沒有繼承結構,每種小動物都須要提供吃的功能,可能得寫100萬次,這個業務相同代碼量很是大下降了開發效率.產生繼承後,只須要把共性的吃的功能在父類裏寫一次便可,哪一個小動物須要提供吃,就來繼承父類.this

  特色:1.使用extends關鍵字線程

     2.至關於子類把父類的功能複製了一份設計

     3.Java只支持單繼承對象

     4.繼承能夠傳遞繼承

     5.不能繼承父類的私有成員

     6.繼承多用於功能的修改,子類能夠擁有父類的功能的同時,進行功能拓展

     7.像是is a 的關係

  super關鍵字

    表明的是父類對象的一個引用

    用來在子類中使用父類的功能

    若是用在構造方法中,super必須是第一條語句

  方法重寫Override

    發生在父類與子類間的現象,子類繼承父類後,就可使用父類的全部功能.當子類想要修改父類原有的功能時,就會發生方法的重寫/複寫/覆蓋

    重寫的要求 : 繼承關係 + 在子類中方法的聲明/簽名 必須和 父類如出一轍(方法的聲明/簽名 包括: 方法返回值 方法名(參數列表))

 

多態

  概念

    多態是指同一個對象有多種形態;多態是爲了統一調用標準---父類就是標準,一切向父類看齊;好處是:不關心具體的類型,屏蔽了子類之間的不一樣,把子類都會當作父類來看,作出統一的編程,寫出通用的代碼

  特色

    前提: 發生繼承關係 + 發生方法重寫

    口訣: 父類引用指向子類對象 + 編譯看左邊運行看右邊

  多態的好處

    提升了程序的靈活性和擴展性;多態中,根本不關心具體的子類的類型,能夠屏蔽子類間的不一樣,把子類都當作父類對待;代碼更加通用,作出統一的編程

  多態的使用

    多態對象使用的成員變量 --- 使用父類的

    多態對象使用的成員方法 --- 使用了父類的方法聲明,使用了子類的方法體

    靜態方法能夠重寫嗎 --- 不能夠!!靜態資源,誰調用就執行誰的功能,根本沒有重寫的說法!!

 

類和對象

  Java語言最基本單位就是類,相似於類型。

  類是一類事物的抽象

  能夠理解爲模板或者設計圖紙

  經過class關鍵字建立

對象

  類是一類事物的抽象,對象是具體的實現

  對象的狀態用來描述對象的基本特徵

  對象的行爲用來描述對象的功能

  對象的標識是指對象在內存中都有一個惟一的地址用來和其餘對象區分開來

  經過new關鍵字建立

建立對象的流程

  Person p = new Person();

  把Person.class文件加載進內存;在棧內存中,開闢空間,存放變量p;在堆內存中,開闢空間,存放Person對象;對成員變量進行默認的初始化;對成員變量進行顯示初始化;執行構造方法(若是有構造代碼塊,就先執行構造代碼塊再執行構造方法);堆內存完成;把堆內存的地址值賦值給變量p ,p就是一個引用變量,引用了Person對象的地址值。 

 

訪問控制符

public
訪問範圍:類、包、子類、任意
protected
訪問範圍:類、包、子類
default
訪問範圍:類、包
private
訪問範圍:類

構造方法

構造方法的語法: 修飾符 類名(參數列表){}

構造方法的觸發時間節點: 建立對象/new/實例化

  構造方法能夠重載,目的是爲了,方便外界比較靈活的建立對象

概念:

  構造方法是一種特殊的方法,它是一個與類同名且返回值類型爲同名類類型的方法。對象的建立就是經過構造方法來完成,其功能主要是完成對象的建立或者對象的初始化。當類實例化一個對象時會自動調用構造方法。構造方法和其餘方法同樣也能夠重載。

 

抽象類

概念
  Java中能夠定義沒有方法體的方法,該方法由其子類來具體的實現。該沒有方法體的方法咱們稱之爲抽象方法,含有抽象方法的類咱們稱之爲抽象類。
抽象類能夠理解爲是一個只有方法聲明沒有方法體的特殊類。
特色
  經過java關鍵字abstract實現
  能夠修飾方法或者類
  抽象類中能夠沒有抽象方法(由子類去實現)
  若是類中有抽象方法,那該類必須定義爲一個抽象類
  子類繼承了抽象類之後,要麼仍是一個抽象類,要麼就把全部抽象方法都重寫
  多用於多態中
  抽象類不能夠被實例化
用法
  構造函數
    抽象類也有構造方法,可是不能自己實例化。
    那抽象類的構造函數有啥用?通常用於給子類實例化
  成員變量
    既能夠有變量,也能夠有常量
  成員方法
    抽象類裏,既能夠有普通方法,有能夠有抽象方法

 

接口

概念

  接口來的目的就是爲了突破java單繼承的侷限性
  接口的好處:靈活,能夠同時使用多個接口的功能
  接口主要體現的是 一套開發規範
特色
  接口中都是抽象方法
  經過interface關鍵字建立接口
  經過implements讓子類來實現
  能夠理解成,接口是一個特殊的抽象類
  接口突破了java的單繼承的侷限性
  接口和類之間能夠多實現,接口和接口之間能夠多繼承
  接口是對外暴露的規則,是一套開發規範
  接口提升了程序的功能擴展,下降了耦合性
總結
  接口裏沒有構造方法,沒有變量,都是常量
  接口裏都是抽象方法(jdk1.8可有特殊的普通方法)
  接口裏的常量能夠簡寫,會自動拼接public static final
  接口裏的方法能夠簡寫,會自動拼接public abstract

 

代碼塊

概念:
  代碼塊就是一段代碼被一對花括號包起來的現象.如: {........}
  代碼塊隨着位置的不一樣,做用和意義都不一樣.

靜態代碼塊

一般用於完成項目的初始化
靜態資源會隨着類的加載而加載,第一時間加載進內存,並一直貯存在內存中,直到類消失靜態資源才消失
靜態資源只會被加載一次
靜態代碼塊,存在的位置是成員位置.如:static{....}

構造代碼塊
在類的內部,方法外部,的代碼塊
一般用於抽取構造方法中的共性代碼
每次調用構造方法前都會調用構造代碼塊
優先於構造方法加載

局部代碼塊
在方法裏面的代碼塊
一般用於控制變量的做用範圍,出了括號就失效
變量的範圍越小越好,成員變量會有線程安全問題
構造代碼塊是最優先的,局部代碼塊順序執行

執行順序
靜態代碼塊 > 構造代碼塊 > 局部代碼塊

 

異常

概述

  用來封裝錯誤信息的對象
  組成結構:類型,提示,行號
結構

  Throwable - 頂級父類

    -- Error:系統錯誤,沒法修復

    -- Exception:可修復的錯誤

    --RunTimeException

    --ClassCastException

    --ClassNotFoundException
異常處理
  捕獲方式
    try{

    須要捕獲的代碼

    }catch(異常類型 異常名){

    處理方案

    }
  拋出方式
    在方法聲明上添加throws 異常類型1,異常類型2
    public static void main(String[] args) throws Exception{ }

 

this關鍵字

  當成員變量 和 局部變量 同名時,經過this關鍵字調用成員變量!

  能夠在構造方法間 實現互相調用,this關鍵字在構造方法中必須是第一條語句

static關鍵字

特色

  能夠修飾成員變量,成員方法
  隨着類的加載而加載,優先於對象加載
  只加載一次,就會一直存在,再也不開闢新空間
  全局惟一,全局共享
  能夠直接被類名調用
  靜態只能調用靜態,非靜態能夠隨意調用
  static不能和this或者super共用,由於有static時可能尚未對象

概念

  是java中的一個關鍵字,用於修飾成員(成員變量和成員方法)

 

final關鍵字

概念
  是java提供的一個關鍵字
  final是最終的意思
  final能夠修飾類,方法,成員變量
初衷
  java出現了繼承後,子類能夠更改父類的功能,當父類功能不準子類改變時能夠利用final關鍵字修飾父類。
特色
  final修飾類 不能被繼承
  final修飾方法 能夠被繼承,可是不能被重寫
  final修飾的是常量,值不能被修改
  常量的定義形式: final 數據類型 常量名 = 值

 

容易搞混的一些東西


類與類之間的關係

繼承關係
  java裏只支持單根繼承
  class A extends B
  其中A是子類,B是父類.子類可使用父類的全部功能
  方法的重寫override:若是想要修改父類的原有功能,能夠進行方法重寫

接口和接口間的關係

繼承關係
  接口的出現就是爲了突破java單繼承的侷限性
  接口間能夠多繼承
  interface A extends B , C
  其中A是子接口,B和C是父接口
  A就擁有了B和C的全部功能,A的功能是最全的
  class Impl implements A
  Impl實現類就須要同時重寫A B C 接口裏的全部抽象方法,不然就是一個抽象類

抽象類和接口的區別

相同點

  抽象類和接口都是抽象層,通常用來提取共性
  都不能被實例化
不一樣點
  構造方法:抽象類裏有,接口裏沒有!!
  成員變量:抽象類裏有,接口裏沒有,接口裏都是常量!!
  成員方法:抽象類類能夠有普通方法和抽象方法,可是接口裏都是抽象方法(1.8後能夠有)
  接口裏存在簡寫形式,抽象類裏沒有.
  接口裏的常量,int age = 10;會爲常量自動拼接public static final
  接口裏的方法,void save();會爲方法自動拼接public abstract
  怎麼去設計你的抽象層,究竟是體現爲一個抽象類呢仍是接口呢?
    --關鍵就看你需不須要提供方法體,若是類裏的方法都不須要提供方法體,能夠設計爲接口.若是類裏的方法須要提供方法,設計爲抽象類.
  抽象層到底設計成抽象類仍是接口,誰好呢?
    --若是實現類想要同時擁有多個功能,最好選擇接口,由於接口能夠多繼承多實現
    --若是就是設計爲抽象類,子類就只能繼承一個父類,只有這麼一次的繼承權

 

類和接口間的關係

實現關係
  實現類能夠實現接口,並且能夠多實現
  class A implements B,C
  A是實現類,B和C是接口
  A須要同時重寫B和C接口裏的全部抽象方法,不然就是一個抽象類
  類能夠在繼承的同時多實現
  class A extends B implements C , D
  A能夠叫子類,也能夠叫是實現類
  A同時擁有父類B的功能,也同時擁有接口C和D的功能
  A須要同時重寫C和D接口裏的全部抽象方法,不然就是一個抽象類
  對於父類B裏的方法嗎?看需求,B類是父類,裏面若是都是普通方法,只有須要修改纔會發生重寫


this和super的區別

this表明本類對象的引用,super表明父類對象的引用
this用於區分局部變量和成員變量
super用於區分本類變量和父類變量
this.成員變量 this.成員方法() this(【參數】)表明調用本類內容
super.成員變量 super.成員方法() super(【參數】),表明調用父類內容
this和super不能夠同時出如今同一個構造方法裏,他們兩個只要出現都得放在第一行,同時出現的話,到底第一行放誰呢。


重寫與重載的區別(Overload和Override的區別)

重載:是指同一個類中的多個方法具備相同的名字,但這些方法具備不一樣的參數列表,即參數的數量或參數類型不能徹底相同
重寫:是存在子父類之間的,子類定義的方法與父類中的方法具備相同的方法名字,相同的參數表和相同的返回類型 重寫是父類與子類之間多態性的一種表現 重載是一類中多態性的一種表現

相關文章
相關標籤/搜索