java4_Java 4
1、繼承的問(wèn)題
子類是父類的一個(gè)擴(kuò)展,子類可以利用父類的屬性與行為,這種情況子類會(huì)破壞父類的封裝
為了保持父類良好的封裝性,設(shè)計(jì)父類有以下規(guī)則:
如果要把某類設(shè)計(jì)為最終類則需要添加final修飾符,或?qū)⒋祟惖臉?gòu)造器聲明為private
2、利用組合實(shí)現(xiàn)復(fù)用
組合就是把舊類的對(duì)象當(dāng)做新類的屬性嵌入,并用private修飾
public class Animals
{
public Animals()
{
System.out.println("Animals");
}
public void breathe()
{
System.out.println("ha-hu");
}
}
public class Wolf
{
private Animals a;
public Wolf(Animals a)
{
this.a=a;
}
public void run()
{
System.out.println("run");
}
public static void main(String[]args)
{
Animals b=new Animals();
Wolf a=new Wolf(b);
a.run();
}
}
3、初始化塊
前面定義的初始化塊先執(zhí)行,后面的后執(zhí)行
syntax:
[修飾符]{
//...
}
只能使用sattic修飾,稱作靜態(tài)初始化塊
當(dāng)創(chuàng)建一個(gè)對(duì)象是先調(diào)用初始化塊
靜態(tài)初始化塊對(duì)整個(gè)類進(jìn)行初始化
系統(tǒng)會(huì)首先執(zhí)行靜態(tài)初始化塊,并會(huì)一直回溯到基類再一步一步執(zhí)行靜態(tài)初始化,再執(zhí)行其他
4、基本數(shù)據(jù)類型的包裝類
為什么要用包裝類?
解決8個(gè)基本類型變量不能變成Object類型變量的問(wèn)題,為8個(gè)基本類型變量定義了應(yīng)用類型的包裝類。
JDK1.5后提供了自動(dòng)裝箱與自動(dòng)拆箱,就可以直接來(lái)了,不用這么復(fù)雜了
基本類型變量與字符串之間的轉(zhuǎn)換關(guān)系
5、toString
toString 是Object 類定義的一個(gè)方法,用以描述對(duì)象的狀態(tài)信息
返回值:對(duì)象類的實(shí)現(xiàn)類名+@+hashCode
可以依據(jù)實(shí)際情況重寫(xiě)toString
6、==與equals
==比較是一種基本類型的比較符,當(dāng)要對(duì)引用類型進(jìn)行比較時(shí),比較的是是否指向同一個(gè)對(duì)象,不是值相等
要實(shí)現(xiàn)值相等的比較,就要重寫(xiě)equals
Object提供的equals與==是一樣的,沒(méi)有用的,一定要重寫(xiě)
重寫(xiě)后有規(guī)定:
1)自反性;
2)傳遞性;
3)對(duì)稱性;
4)一致性。
Example:
public boolean equals(Object obj)
{
if(this==obj)
return true;
if(obj!=null&&obj.getClass()==SomeClass.class)
{
SomeClass sc=(SomeClass)obj;
if(compare)
return true;
}
return false;
}
7、類成員
類中只能包含屬性、方法、構(gòu)造器、初始化塊、內(nèi)部類、枚舉類
static不修飾構(gòu)造器
類成員不能訪問(wèn)實(shí)例成員
8、單例類Singleton
一個(gè)類只能創(chuàng)建一個(gè)實(shí)例
把構(gòu)造器用private修飾
需要一個(gè)public方法作為這個(gè)類的訪問(wèn)點(diǎn),同時(shí)要將其定義為static
該類還需緩存已創(chuàng)建的對(duì)象
class Singleton
{
//使用一個(gè)變量來(lái)緩存曾經(jīng)創(chuàng)建的實(shí)例
private static Singleton instance;
//隱藏構(gòu)造器
private Singleton(){}
//提供一個(gè)靜態(tài)方法,用于返回Singleton實(shí)例
//可加入自定義的控制,保證只產(chǎn)生一個(gè)Singleton
public static Singleton getInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
9、final
final修飾的變量賦值后不可改變
final修飾的成員變量必須在類中賦初值
類屬性:在靜態(tài)初始化塊中、在聲明該屬性時(shí)指定初始值
實(shí)例屬性:在非靜態(tài)初始化塊、聲明屬性、構(gòu)造器中指定初始值
系統(tǒng)不會(huì)對(duì)final修飾成員進(jìn)行隱式初始化
final修飾的引用變量只是保證它所指向的地址不改變,而該引用的內(nèi)容是可以改變的
final修飾的方法不可被重寫(xiě),但可以重載
final修飾的類不可繼承
10、不可變類
創(chuàng)建該類的實(shí)例后,實(shí)例的屬性不可改變
8個(gè)包裝類、java.lang.String都是不可變類
hashcode返回的是對(duì)象地址
final修飾的引用類型變量不符合不可變,那么我們?cè)谠O(shè)計(jì)類的時(shí)候必須將此變量保護(hù)起來(lái)。
11、緩存實(shí)例的不可變類
如果程序需要經(jīng)常使用某些實(shí)例,則應(yīng)把其緩存
Example:
利用數(shù)組作為緩存池
public class CacheImmutale
{
private final String name;
private static CacheImmutale[]a=new CacheImmutale[10];
private static int pos=0;
public CacheImmutale(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
//利用valueOf創(chuàng)建對(duì)象,而不用構(gòu)造器
public static CacheImmutale valueOf(String name)
{
for(int i=0;i<10;i++)
{
if(a[i]!=null&&a[i].getName().equals(name))
return a[i];
}
if(pos==10)
{
a[0]=new CacheImmutale(name);
pos=1;
return a[0];
}
else
{
a[pos++]=new CacheImmutale(name);
return a[pos-1];
}
}
//重寫(xiě)equals
public boolean equals(Object obj)
{
if(obj instanceof CacheImmutale)
{
CacheImmutale aa=(CacheImmutale)obj;
if(name.equals(aa.getName()))
{
return true;
}
return false;
}
}
//重寫(xiě)hashCode
public int hashCode()
{
return name.hashCode();
}
}
12、抽象類
抽象方法與抽象類的規(guī)則:
利用抽象類就是利用一種模板模式
抽象父類中提供多個(gè)子類的通用方法,子類再進(jìn)行具體的實(shí)現(xiàn)補(bǔ)充。
13、接口
接口中所有的方法都是抽象方法
接口規(guī)定類中應(yīng)具體提供的方法,但不管具體實(shí)現(xiàn)
syntax:
[修飾符] interface Name extends 父接口1, 父接口2...
{
}
接口中可以包含屬性(只能是常量),方法(只能是抽象實(shí)例),內(nèi)部類(包括內(nèi)部接口)和枚舉類的定義
只能是public 、static、final(系統(tǒng)默認(rèn))
方法、內(nèi)部類、枚舉類 自動(dòng)用public static 修飾
使用接口:
類必須實(shí)現(xiàn)接口內(nèi)的所有方法,只能用public
模擬多繼承
interface and abstract class
總結(jié)
以上是生活随笔為你收集整理的java4_Java 4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java getselectedrow_
- 下一篇: mysql share 字体 中文_My