基礎(chǔ)1 switch支持的類型:byte, short, int, char, enum,注意:不支持long,double,JDK7之后,開(kāi)始支持String。 簡(jiǎn)單示例 public c
1 switch支持的類型:byte, short, int, char, enum,
注意:不支持long,double,JDK7之后,開(kāi)始支持String。
//簡(jiǎn)單示例
public class MyDemo {
public static void main(String... args) {
Demo demo = Demo.A;
switch (demo) {
case A:
break;
case B:
break;
}
}
enum Demo {
A,
B,
C
}
}
餓漢式
2 if和switch的區(qū)別:
if :1.對(duì)具體的值進(jìn)行判斷 2.對(duì)區(qū)間判斷 3.對(duì)運(yùn)算結(jié)果是boolean類型的表達(dá)式進(jìn)行判斷
switch :1.對(duì)具體的值進(jìn)行判斷;2.值的個(gè)數(shù)通常是固定的。
對(duì)于幾個(gè)固定值的判斷,建議使用switch語(yǔ)句,因?yàn)閟witch語(yǔ)句會(huì)將具體的答案加載進(jìn)內(nèi)存,相對(duì)高效一點(diǎn)。
重載和重寫(xiě)的區(qū)別
重載:允許存在一個(gè)以上的同名函數(shù),只要它們的參數(shù)類型不同即可。
重寫(xiě):當(dāng)子類繼承父類,沿襲了父類的功能到子類中,子類雖具備該功能,但功能內(nèi)容不一致,這是使用覆蓋特性,保留父類的功能定義,并重寫(xiě)功能內(nèi)容。
單例模式
private static Single s = new Single ( ) ;
private Single ( ) { }
public static Single getInstance ()
{
return s ;
}
懶漢式
class Single {
public static Single getInstance (){
if ( s== null ){
synchronized (Single.class){//鎖不讀可以提高效率
if ( s== null ){
s = new Single () ;
}
}
return s ;
}
}
特殊關(guān)鍵字:final
1. 可以修飾類、函數(shù)、變量;
2. 被final修飾的類不可以被繼承。為了避免被繼承,被子類復(fù)寫(xiě)。final class Demo { }
3. 被final修飾的方法不可以被復(fù)寫(xiě)。final void show () { }
4. 被final 修飾的變量是一個(gè)常量,只能賦值一次。
5. 內(nèi)部類定義在類中的局部位置上時(shí),只能訪問(wèn)該局部被final修飾的局部變量。
異常:(關(guān)于問(wèn)題1,謝謝ylt提醒)
try{}catch(){}finally{}
1.在catch中return(),finally{}會(huì)不會(huì)執(zhí)行?
答:會(huì),會(huì)在return之后執(zhí)行。
2.finally()在什么情況下不會(huì)執(zhí)行
答:只有一種情況不會(huì)執(zhí)行,當(dāng)執(zhí)行到System.exit(0)時(shí),finally不會(huì)執(zhí)行。
public class Test { public static void main(String[] args) {
System.out.println("haha:" + haha(true));
}
private static boolean haha(boolean isTrue) {
try {
int i = 1 / 0;
return isTrue ? System.out.printf("return try !null ", "test") != null : System.out.printf("return try null ", "test") == null;
} catch (Exception e) {
System.out.println("catch");
return isTrue ? System.out.printf("return catch !null ", "test") != null : System.out.printf("return catch null ", "test") == null;
} finally {
System.out.println("");
System.out.println("finally");
}
}
}
//打印結(jié)果:
catch
return catch !null
finally
haha:true
先看下面一段代碼,運(yùn)行Test,會(huì)打印什么?
package test;
public class Test {
public static void main(String... args) {
TestA a;
a = new TestA();
a = new TestA();
TestA aa = new TestA();
}
}
class TestA {
{
System.out.println("TestA code create");
}
private TestB b = new TestB();
private static TestC c = new TestC();
public TestA() {
System.out.println("TestA create");
}
static {
System.out.println("TestA static create");
}
}
class TestB {
public TestB() {
System.out.println("TestB create");
}
}
class TestC {
public TestC() {
System.out.println("TestC create");
}
}
打印結(jié)果:
TestC create
TestA static create
TestA code create
TestB create
TestA create
TestA code create
TestB create
TestA create
TestA code create
TestB create
TestA create
static特點(diǎn):
1. 隨著類的加載而加載(隨著類的消失而消失,生命周期最長(zhǎng))
2. 優(yōu)先于對(duì)象存在
3. 被所有對(duì)象所共享
4. 可以直接被類所調(diào)用
5. static是一個(gè)修飾符,用于修飾成員
構(gòu)造代碼塊
作用:給對(duì)象進(jìn)行初始化,對(duì)象一建立就運(yùn)行,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行。
和構(gòu)造函數(shù)的區(qū)別:
構(gòu)造代碼塊是給所有對(duì)象進(jìn)行統(tǒng)一初始化;而構(gòu)造函數(shù)是給對(duì)應(yīng)的對(duì)象初始化
構(gòu)造代碼塊中定義的是不同對(duì)象共性的初始化內(nèi)容
靜態(tài)代碼塊
static
{
靜態(tài)代碼塊中的執(zhí)行語(yǔ)句;
}
特點(diǎn):隨著類的加載而執(zhí)行,只執(zhí)行一次(再new一個(gè)對(duì)象也不會(huì)執(zhí)行,類只加載一次),
如果定義在有主函數(shù)的類中,則優(yōu)先于主函數(shù)執(zhí)行。用于給類進(jìn)行初始化。
有些類不用創(chuàng)建對(duì)象,無(wú)法用構(gòu)造函數(shù)初始化,就通過(guò)靜態(tài)代碼塊初始化。
執(zhí)行順序:靜態(tài)代碼塊先執(zhí)行,如果有對(duì)象,構(gòu)造代碼塊先執(zhí)行,然后是構(gòu)造函數(shù)。
如果沒(méi)有對(duì)象,則構(gòu)造代碼塊和構(gòu)造函數(shù)都不會(huì)執(zhí)行。
抽象類的特點(diǎn):
1.
抽象方法一定在抽象類中。 2. 抽象方法和抽象類都必須被abstract關(guān)鍵字修飾。 3. 抽象類不可以用new創(chuàng)建對(duì)象,因?yàn)檎{(diào)用抽象方法沒(méi)有意義。 4. 抽象類中的抽象方法要被使用,必須由子類復(fù)寫(xiě)所有的抽象方法后,建立子類對(duì)象調(diào)用。如果子類只覆蓋了部分抽象方法,那么該子類還是一個(gè)抽象類。強(qiáng)迫子類復(fù)寫(xiě),強(qiáng)迫子類做一些事。 5. 抽象類中可以不定義抽象方法,如果不定義抽象方法,那么抽象類的功能就是為了不讓該類建立對(duì)象。
抽象關(guān)鍵字不可以和哪些關(guān)鍵字共存?
答(1)private不能:抽象方法就是給子類覆蓋的,私有了就不能覆蓋了。
(2)static不能:static可以直接用類名調(diào)用,而調(diào)用抽象方法沒(méi)有意義。
(3)final 不能:final修飾的方法不可以被復(fù)寫(xiě),修飾的類不可以被繼承。與abstract沖突。
接口的特點(diǎn)
接口是對(duì)外暴露的規(guī)則。
● 接口是程序的功能擴(kuò)展。
● 接口可以多實(shí)現(xiàn)。
● 類與接口直接是實(shí)現(xiàn)關(guān)系,而且類可以繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口。
● 接口與接口之間可以有繼承關(guān)系,可以多繼承。
因?yàn)榻涌跊](méi)有方法體,不會(huì)存在兩個(gè)父類出現(xiàn)同一個(gè)方法但是方法體不同的情況,
不會(huì)引起沖突,如下:
public class Test implements d{
public static void main(String... args) {
}
@Override
public void as() {
}
}
interface d extends e,f {
}
interface f{
void as();
}
interface e{
void as();
}
接口和抽象類的異同點(diǎn):
相同點(diǎn):都是不斷向上抽取而來(lái)的。不可以被實(shí)例化
不同點(diǎn):1. 抽象類需要被繼承,而且只能單繼承;接口需要被實(shí)現(xiàn),而且可以多實(shí)現(xiàn)
2. 抽象類中可以定義抽象方法和非抽象方法,子類繼承后,可以直接使用非抽象方法;
接口只能定義抽象方法,必須有子類實(shí)現(xiàn)。
3. 抽象類的繼承,是is a關(guān)系,在定義該體系的基本共性內(nèi)容;
接口的實(shí)現(xiàn)是like a 關(guān)系,在定義體系額外功能。
繼承
子類的實(shí)例化過(guò)程:
結(jié)論:子類的所有的構(gòu)造函數(shù),默認(rèn)都會(huì)訪問(wèn)父類中空參數(shù)構(gòu)造函數(shù),因?yàn)樽宇愔忻恳粋€(gè)構(gòu)造函數(shù)內(nèi)的第一行都有一句隱式的super() ;
當(dāng)父類中沒(méi)有空參數(shù)的構(gòu)造函數(shù)時(shí),子類必須手動(dòng)通過(guò)super或者this語(yǔ)句形式來(lái)指定要訪問(wèn)的構(gòu)造函數(shù)。
當(dāng)然:子類的構(gòu)造函數(shù)第一行也可以手動(dòng)指定this語(yǔ)句來(lái)訪問(wèn)本類中的構(gòu)造函數(shù),
子類中至少會(huì)有一個(gè)構(gòu)造函數(shù)會(huì)訪問(wèn)到父類中的構(gòu)造函數(shù)。
對(duì)象的初始化過(guò)程,見(jiàn)下圖:
打印結(jié)果
Python交流群
635448130點(diǎn)擊加入群聊UI設(shè)計(jì)交流群
579150876點(diǎn)擊加入群聊Unity交流群
495609038點(diǎn)擊加入群聊HTML5交流群
645591648點(diǎn)擊加入群聊