抽象類:
宣告乙個抽象類,就是在類的宣告開頭、在class關鍵字的前面使用關鍵字abstract
下面定義乙個抽象類,**如下:
abstract分析抽象類的**,得出抽象類的一些特性:classa}
class b extendsa}
class
abstractdemo
}
1、 定義乙個抽象類,必須使用關鍵字abstract;
2、 抽象類不存在物件,也就是說,不能使用new運算子直接例項化抽象類;
3、 抽象類不能宣告抽象的構造方法,也不能宣告抽象的靜態(static)方法;
4、 抽象類的所有子類,要麼實現父類中的所有抽象方法,要麼自己也宣告為抽象類;
5、 抽象類中的方法,可以定義為抽象方法(用abstract關鍵字),也可以為普通方法;[注意以上第3點中的區別];
6、 抽象類只能繼承(extends)使用,也就是說父類為抽象類時,它的直接子類只有乙個,這也是繼承的特性;
介面:宣告乙個介面,使用inte***ce關鍵字,可以指定類必須執行哪些工作,但是只定義工作的模版(方法),不具體實現工作的內容。
下面定義乙個介面,**如下:
inte***ce分析介面的**,得出介面的一些特性:callback
class inte***cedemo implements
callback
public
static
void
main(string args)
}
1、 定義乙個介面,必須使用關鍵字inte***ce;
2、 介面不能直接例項化,並且它裡面的方法是沒有方法體的;[注意:實際上,它們是抽象方法,在介面中指定的所有方法都可以沒有預設實現]
3、 實現介面的每個類,都必須實現介面中定義的所有方法;
4、 一旦定義了介面,任意數量的類都可以實現(implements)該介面,此外,乙個類也可以實現任意數量的介面,使用逗號隔開;[注意:如果在類實現的兩個介面中都宣告了同乙個方法,那麼這兩個方法的客戶都將可以使用該方法]
5、 介面可以宣告變數,它們被隱式地標識為final和static,這意味著實現介面的類不能修改它們,同時在介面必須初始化它們;
6、 在介面的實現類中,實現介面方法時,必須將方法宣告為public;
7、 雖然介面不能直接例項化,但可以將變數宣告為使用介面而不是類的物件引用;[**如下:]
callback c = new8、 如果乙個類實現了乙個介面,但沒有實現該介面定義的全部方法,那麼必須將該類宣告為抽象類(abstrace);inte***cedemo();
c.callback(「me」);
//注意:變數c被宣告為介面型別callback,此時,可以使用c訪問callback()方法,但是c不能訪問inte***cedemo類中的其他任何成員,介面的引用變數只知道由介面宣告的方法。
9、 在宣告巢狀介面的類或介面之外,巢狀介面的名稱必須是完全限定的;[**如下:]
classa}10、 介面可以通過關鍵字extends繼承另乙個介面,語法和繼承類相同;class b implements
a.nestedif
}class
nestedifdemo
if(nif.isnotnegative(-10))
}}//
注意:類a定義了成員介面nestedif,並且宣告為public,b類通過指定介面名稱完全限定來實現巢狀介面:implements a.nestedif
java 深入淺出HashCode
首先hashcode,大家都知道是雜湊碼。但是大部分描述都太抽象了,所以我把自己的理解寫在下面。主要是讓大家形象的理解什麼叫物件相等hashcode一定相等,hashcode相等物件不一定相等 前提是要在沒有重寫equals方法 hashcode是通過位址值啊之類的通過某種演算法算出來的,假設 ha...
深入淺出Google ProtoBuf中的編碼規則
在開始本部分的內容之前,首先有必要介紹兩個基本概念,乙個是序列化,乙個是反序列化。這兩個概念的定義在網上搜一下都很多的,但大多都講得比較晦澀,不太好理解,在這裡我會用比較通俗的文本來解釋,盡可能讓讀都朋友們一讀就明白是怎麼回事 序列化 是指將結構化的資料按一定的編碼規範轉成指定格式的過程 反序列化 ...
深入淺出Google ProtoBuf中的編碼規則
在開始本部分的內容之前,首先有必要介紹兩個基本概念,乙個是序列化,乙個是反序列化。這兩個概念的定義在網上搜一下都很多的,但大多都講得比較晦澀,不太好理解,在這裡我會用比較通俗的文本來解釋,盡可能讓讀都朋友們一讀就明白是怎麼回事 序列化 是指將結構化的資料按一定的編碼規範轉成指定格式的過程 反序列化 ...