j2se学习中的一些零碎知识点2之基础知识
1、static修飾的變量叫做“靜態(tài)變量”(靜態(tài)變量,被存儲在方法區(qū)中,所有的java對象共享靜態(tài)變量,所有靜態(tài)變量是類級別的,使用“類名.”的方式訪問。),static修飾的方法叫做“靜態(tài)方法”(靜態(tài)方法中不能夠直直接訪問非靜態(tài)數(shù)據(jù)。工具類中的方法大部分都是靜態(tài)方法。 ),static還可以定義靜態(tài)語句塊。(靜態(tài)語句塊的語法為:static{java語句},靜態(tài)語句塊在類中可以有一個(gè),也可以有多個(gè)。靜態(tài)語句塊在類加載的階段執(zhí)行,并且執(zhí)行一次。并且(如果有多個(gè)靜態(tài)語句塊)是自上而下依次執(zhí)行。)
- 實(shí)例語句塊在每次調(diào)用構(gòu)造方法之前執(zhí)行,且(如果有多個(gè)實(shí)例語句塊)是自上而下依次執(zhí)行。語法:{java語句}。
- 靜態(tài)的方法按照正規(guī)的方式“類名.”訪問,靜態(tài)的方法也能夠使用“引用.”訪問。(編譯階段會(huì)檢查出引用的類型,編譯通過,運(yùn)行的時(shí)候,仍然使用“類名.”的方式去訪問,靜態(tài)方法執(zhí)行不需要對象。)
- 成員變量在創(chuàng)建對象的時(shí)候初始化,靜態(tài)變量在類加載階段賦值,并且只賦值一次。
- 什么是設(shè)計(jì)模式:設(shè)計(jì)模式是可以重復(fù)利用的解決方案,從結(jié)構(gòu)上可以分為三類:創(chuàng)建型、結(jié)構(gòu)型和行為型。最簡單的設(shè)計(jì)模式是單例設(shè)計(jì)模式:為了保證JVM中某一個(gè)類型的java對象永遠(yuǎn)只有一個(gè),節(jié)省內(nèi)存的開銷。實(shí)現(xiàn)懶漢式單例設(shè)計(jì)模式的簡單方式:將構(gòu)造方法私有化,并對外提供一個(gè)公開獲取這個(gè)類的對象的方法(該方法為靜態(tài)方法,采用(類名.)的方式調(diào)用。),以及在類中提供一個(gè)這個(gè)類類型的靜態(tài)變量。(懶漢式用到對象的時(shí)候才會(huì)創(chuàng)建。)(==兩邊如果是基本數(shù)據(jù)類型,可以比較這兩個(gè)基本數(shù)據(jù)類型是否相等,==兩邊如果是引用數(shù)據(jù)類型,則比較的是內(nèi)存地址。)
- 餓漢式單例設(shè)計(jì)模式:在類加載時(shí)已經(jīng)創(chuàng)建單例對象。 package com.geeklicreed.j2se; /* 餓漢式單例模式 */ public class Customer { // 類加載時(shí)只執(zhí)行一次 private static Customer c = new Customer(); // 構(gòu)造方法私有化 private Customer() { } // 對外提供一個(gè)公開獲取這個(gè)類的對象的方法 public static Customer getInstance() {return c; } }
2、引用類繼承最基本的作用是代碼重用。語法:[修飾符] class 子類名 extends 父類名。
- java語言中,類和類之間只支持單繼承。一個(gè)類如果沒有顯示的繼承其他類,則該類默認(rèn)繼承Object。Object是SUN提供的java中的根類。(繼承是面向?qū)ο蟮闹匾拍?#xff0c;軟件中的繼承和現(xiàn)實(shí)中的繼承概念是一樣的)
- java語言中子類繼承父類,會(huì)將父類中所有數(shù)據(jù)全部繼承(構(gòu)造方法無法被子類繼承),包括私有的也能夠繼承過來,但是在子類中無法直接訪問父類中的私有的數(shù)據(jù),但是可以間接訪問。(通過setter和getter方法訪問和修改私有數(shù)據(jù))
- 方法的覆蓋或者說是方法的重寫:(override或者overwrite)如果父類中的方法無法滿足當(dāng)前子類中的業(yè)務(wù)需求,需要將父類中的方法進(jìn)行重新寫一遍。(如果子類重寫父類中的方法之后,子類對象一定調(diào)用的是子類重寫的方法)。
- 發(fā)生方法覆蓋的條件:a、發(fā)生在具有繼承關(guān)系的兩個(gè)類之間;b、具有相同的方法名、相同的返回值類型、相同的參數(shù)列表;c、重寫的方法不能比被重寫的方法擁有更低的訪問權(quán)限;d、重寫的方法不能比被重寫的方法拋出更寬泛的異常;e、私有的方法不能被覆蓋;f、構(gòu)造方法無法被覆蓋,因?yàn)闃?gòu)造方法無法被繼承;g、靜態(tài)的方法不存在覆蓋;h、覆蓋指的是成員方法,和成員變量無關(guān)。(繼承最基本的作用是代碼重用,最重要的作用是方法可以重寫。)
3、java語言中向上轉(zhuǎn)型(upcasting,子類轉(zhuǎn)父類)和向下轉(zhuǎn)型(downcasting,父類轉(zhuǎn)子類),無論是向上轉(zhuǎn)型還是向下轉(zhuǎn)型,兩個(gè)類之間必須要有繼承關(guān)系。
- 向上轉(zhuǎn)型又稱為自動(dòng)類型轉(zhuǎn)換,父類型的引用指向子類型的對象(如Animal a = new Cat();),程序分為編譯階段和運(yùn)行階段兩個(gè)階段,編譯階段只知道a是一個(gè)Animal類型,而程序在運(yùn)行的時(shí)候堆中實(shí)際對象是Cat類型。(a.eat();代碼)表示程序在編譯階段a變量被編譯器看作是Animal類型,所以程序在編譯階段a.eat()綁定的是Animal類中的eat方法(靜態(tài)綁定);而程序在運(yùn)行的時(shí)候堆中的實(shí)際對象是Cat類型,而Cat已經(jīng)重寫了eat方法,所以程序在運(yùn)行階段對象綁定的方法是Cat中的eat()方法。(動(dòng)態(tài)綁定)
- 向下轉(zhuǎn)型又稱之為強(qiáng)制類型轉(zhuǎn)換。(需要注意,Animal a = new Dog();Cat c = (Cat)a;編譯階段能夠通過,但是程序在運(yùn)行期可能會(huì)出錯(cuò),會(huì)報(bào)java.lang.ClassCastException異常,所以在做強(qiáng)制類型轉(zhuǎn)換的時(shí)候是存在風(fēng)險(xiǎn)的。)
- 為了避免ClassCastException的發(fā)生,java引入了instanceof。用法:instanceof運(yùn)算符結(jié)果是boolean類型。(Cat a = new Cat();if(a instanceof Cat){Cat c = (Cat)a};如果結(jié)果是true,a引用指向堆中的java對象是Cat類型。)
- 多態(tài)的作用:項(xiàng)目的耦合度降低,項(xiàng)目的擴(kuò)展能力增強(qiáng)。(盡量不要面向具體編程,面向父類型進(jìn)行編程,面向抽象編程)
4、super不是引用類型,super中存儲的不是內(nèi)存地址,super指向的不是父類對象,而是代表當(dāng)前子類對象中的父類型特征。
- 什么時(shí)候使用super?父類和子類中都有某個(gè)數(shù)據(jù)或者相同的方法,如果要在子類中訪問父類中的屬性或者方法,需要使用(super.)的方式。
- super可以使用在什么地方?super可以在成員方法中;(super和this相同,都不能直接用在靜態(tài)上下文中)
- super關(guān)鍵字用在構(gòu)造方法中,語法為:super(實(shí)參);,通過子類的構(gòu)造方法去調(diào)用父類的構(gòu)造方法,作用是給當(dāng)前子類對象中的父類型特征賦值。(如果一個(gè)構(gòu)造方法第一行如果沒有this(...);也沒有顯式地調(diào)用super(...);系統(tǒng)會(huì)默認(rèn)調(diào)用super();)。super(...);的調(diào)用只能夠放在構(gòu)造方法的第一行中,和this(...);一樣,所以this(...);和super(...);不能共存。
- 需要注意的是,super(...)調(diào)用了父類的構(gòu)造方法,但是并不會(huì)創(chuàng)建父類對象。(構(gòu)造方法執(zhí)行不一定創(chuàng)建對象)
- 在java語言中,只要是創(chuàng)建了java對象,那么Object中的無參數(shù)構(gòu)造方法一定會(huì)執(zhí)行。
- 父類的構(gòu)造方法并不會(huì)被子類繼承,但是可以被子類調(diào)用。(單例模式的類型無法被繼承,即單例模式的類型沒有子類。原因是單例模式構(gòu)造方法私有化,子類的構(gòu)造方法無法使用super();調(diào)用父類的私有構(gòu)造方法。)
5、final修飾的類無法被繼承,final修飾的方法無法被覆蓋,final修飾的局部變量一旦賦值,不可再改變,final修飾的成員變量必須“顯式的”初始化。class A{final int i;}編譯無法通過。(要么final修飾的成員變量手動(dòng)初始化,要么在構(gòu)造方法調(diào)用結(jié)束之前賦值也行。如class A{final int i = 1200}或者class A{final int = k; A(){k = 1200;}} )(一般情況下,final修飾的成員變量一般和static連用,稱之為常量。)
- 常量為值不可改變的變量,要求所有的常量大寫。
6、如何定義抽象類:class關(guān)鍵字前加上abstract。(抽象類無法被實(shí)例化,即抽象類無法創(chuàng)建對象。)
- 雖然抽象類沒有辦法實(shí)例化,但是抽象類也有構(gòu)造方法,該構(gòu)造方法是給子類創(chuàng)建對象使用的。
- 抽象類中可以定義抽象方法,抽象方法的語法為:在方法的修飾符列表中添加abstract關(guān)鍵字,并且抽象方法應(yīng)該以“;”結(jié)束,不帶“{}”。(例如:public abstract void m();)
- 抽象類中不一定有抽象方法,但是抽象方法必須出現(xiàn)在抽象類中。
- 一個(gè)非抽象類繼承一個(gè)抽象類,必須將抽象類中的抽象方法覆蓋。
- 抽象類不能被final修飾;抽象方法不能被final修飾。(顯示為非法的修飾符組合)
- final修飾的引用類型,該引用不可再重新指向其他的java對象,但是final修飾的引用,該引用指向
的對象的屬性是可以修改的。
7、接口也是一種引用類型,可以等同看作類。
- 如何定義接口,語法為:[修飾符] interface 接口名{}(需要注意的是,接口中只能夠出現(xiàn)常量和抽象方法)
- 接口其實(shí)是一種特殊的抽象類,特殊在于接口是完全抽象的。
- 接口中也沒有構(gòu)造方法,是無法被實(shí)例化的。
- 接口和接口之間可以進(jìn)行多繼承。
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。(一個(gè)類實(shí)現(xiàn)一個(gè)接口,需要使用implements關(guān)鍵字,implements和extends意義相同,這里的實(shí)現(xiàn)可以等同看作繼承。),一個(gè)非抽象的類實(shí)現(xiàn)接口,需要將接口中的所有的方法“實(shí)現(xiàn)”。(或者說是重寫)
- 在接口中常量用public static final修飾,public static final可以省略。接口中所有的抽象方法都是public abstract,public abstract可以省略。
- 接口的作用:a、可以使項(xiàng)目分層,所有層都面向接口開發(fā),開發(fā)效率提高;b、接口使代碼和代碼之間的耦合度降低,就像內(nèi)存條和主板的關(guān)系,變得“可插拔”,可以隨意地切換。
- 接口和抽象類都能完成某個(gè)功能,優(yōu)先選擇接口。(因?yàn)榻涌诳梢远鄬?shí)現(xiàn),多繼承,并且一個(gè)類除了實(shí)現(xiàn)接口之外,還可以去繼承其他類,保留了類的繼承。)
轉(zhuǎn)載于:https://blog.51cto.com/12402717/2045891
總結(jié)
以上是生活随笔為你收集整理的j2se学习中的一些零碎知识点2之基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【js基础】理清Object、Objec
- 下一篇: 第100天:CSS3中animation