不使用IDE怎么編譯和指定classpath
private default protected public
注意:java的訪問控制是停留在編譯層的矮燎,也就是它不會(huì)在.class文件中留下任何的痕跡浩销,只在編譯的時(shí)候進(jìn)行訪問控制的檢查。其實(shí),通過反射的手段,是可以訪問任何包下任何類中的成員,例如奋渔,訪問類的私有成員也是可能的。
Arrays.asList的用法
使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時(shí)壮啊,不能使用其修改集合相關(guān)的方法卒稳,它的add/remove/clear方法會(huì)拋出UnsupportOperationException異常
說明:asList的返回對象是一個(gè)Arrays內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法。Arrays.asList體現(xiàn)的是適配器模式他巨,只是轉(zhuǎn)換接口充坑,后臺的數(shù)據(jù)仍是數(shù)組。
String[] str = new String[]{"1","2"};
List list = Arrays.asList(str);
第一種情況:list.add("x");//運(yùn)行時(shí)異常
第二種情況:str[0] = "unv";//那么list.get(0)也隨著修改染突。
此類包含用來操作數(shù)組(比如排序和搜索)的各種方法捻爷。此類還包含一個(gè)允許將數(shù)組作為列表來查看的靜態(tài)工廠。 除非特別注明份企,否則如果指定數(shù)組引用為 null也榄,則此類中的方法都會(huì)拋出 NullPointerException。一段有意思的代碼如下:
Java代碼
public static void main(String[] args) {
int[] data = {1,2,3,4,5};
List list = Arrays.asList(data);
System.out.println("列表中的元素?cái)?shù)量是:" + list.size());
}
注意這里輸出的數(shù)量是1司志,原因是甜紫,在Arrays.asList中,該方法接受一個(gè)變長參數(shù)骂远,一般可看做數(shù)組參數(shù)囚霸,但是因?yàn)閕nt[] 本身就是一個(gè)類型,所以data變量作為參數(shù)傳遞時(shí)激才,編譯器認(rèn)為只傳了一個(gè)變量拓型,這個(gè)變量的類型是int數(shù)組,所以size為1瘸恼×哟欤基本類型是不能作為泛型的參數(shù),按道理應(yīng)該使用包裝類型东帅,但這里缺沒有報(bào)錯(cuò)压固,因?yàn)閿?shù)組是可以泛型化的,所以轉(zhuǎn)換后在list中就有一個(gè)類型為int的數(shù)組
public class ClearRepeatTest {
public static Integer[] clearRepeat(int [] array){
Set<Integer> set = new HashSet<>();
for(int i : array){
set.add(i);
}
Integer[] newArray = set.toArray(new Integer[set.size()]);
return newArray;
}
public static void main(String[] args) {
//創(chuàng)建一個(gè)數(shù)組靠闭,可以看出 2和4 是重復(fù)的
int [] array = {1,2,3,4,8,2,5,4};
Integer[] newArray = clearRepeat(array);
for(Integer i : newArray){
System.out.println(i);
}
//1 2 3 4 5 8
}
}
==和equals
==比較的是兩個(gè)操作數(shù)的值是否相等帐我,對于基本類型變量和引用類型變量都是比較變量的值是否相等刘莹。對于基本類型的變量好理解,對于引用類型的變量焚刚,其本身也是變量,有自己的內(nèi)存空間扇调,存的是其引用的對象的堆空間地址矿咕。equals比較的是對象的內(nèi)容是否一樣,并不一定是同一個(gè)對象內(nèi)容才相同狼钮,不同的對象內(nèi)容也可能相同碳柱。
&&和&的區(qū)別(||和|也一樣)
都可以是邏輯運(yùn)算操作符,此時(shí)&&具有短路功能熬芜;除此之外莲镣,當(dāng)操作數(shù)不是boolean值時(shí),&則表示按位與
數(shù)據(jù)庫表可以沒有主鍵嗎
可以
HashMap的四種遍歷
- ①獲取keyset和values
- ②先獲取keyset涎拉,然后通過get(key)獲取value
- ③獲取entryset瑞侮,然后for-in遍歷
- ④獲取entryset,然后通過迭代器Iterator遍歷
- ②的效率很低鼓拧,不建議使用半火。③的效率高。④的效率也不錯(cuò)季俩,可以在遍歷的時(shí)候刪除元素钮糖,①適合在單獨(dú)需要keyset或values的情況
transient
Java中transient關(guān)鍵字的作用,簡單地說酌住,就是讓某些被修飾的成員屬性變量不被序列化,這一看好像很好理解,就是不被序列化灾炭,那么什么情況下泊业,一個(gè)對象的某些字段不需要被序列化呢?如果有如下情況都哭,可以考慮使用關(guān)鍵字transient修飾:
1肄满、類中的字段值可以根據(jù)其它字段推導(dǎo)出來,如一個(gè)長方形類有三個(gè)屬性:長度质涛、寬度稠歉、面積(示例而已,一般不會(huì)這樣設(shè)計(jì))汇陆,那么在序列化的時(shí)候怒炸,面積這個(gè)屬性就沒必要被序列化了;
2毡代、其它阅羹,看具體業(yè)務(wù)需求吧勺疼,哪些字段不想被序列化;
PS捏鱼,記得之前看HashMap源碼的時(shí)候执庐,發(fā)現(xiàn)有個(gè)字段是用transient修飾的,我覺得還是有道理的导梆,確實(shí)沒必要對這個(gè)modCount字段進(jìn)行序列化轨淌,因?yàn)闆]有意義,modCount主要用于判斷HashMap是否被修改(像put看尼、remove操作的時(shí)候递鹉,modCount都會(huì)自增),對于這種變量藏斩,一開始可以為任何值躏结,0當(dāng)然也是可以(new出來、反序列化出來狰域、或者克隆clone出來的時(shí)候都是為0的)媳拴,沒必要持久化其值。
對象復(fù)制
淺復(fù)制:將一個(gè)對象復(fù)制后兆览,基本數(shù)據(jù)類型的變量都會(huì)重新創(chuàng)建禀挫,而引用類型,指向的還是原對象所指向的拓颓。
深復(fù)制:將一個(gè)對象復(fù)制后语婴,不論是基本數(shù)據(jù)類型還有引用類型,都是重新創(chuàng)建的驶睦。簡單來說砰左,就是深復(fù)制進(jìn)行了完全徹底的復(fù)制,而淺復(fù)制不徹底场航。
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* 淺復(fù)制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* 深復(fù)制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 寫入當(dāng)前對象的二進(jìn)制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 讀出二進(jìn)制流產(chǎn)生的新對象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public SerializableObject getObj() {
return obj;
}
public void setObj(SerializableObject obj) {
this.obj = obj;
}
}
class SerializableObject implements Serializable {
private static final long serialVersionUID = 1L;
}
一個(gè)類是否可以調(diào)用其他類的main
基本類型變量存在哪
基本數(shù)據(jù)類型存在于虛擬機(jī)棧區(qū)缠导,基本數(shù)據(jù)類型的存儲(chǔ)形式既不是對象引用,也不是地址溉痢,而是就是值本身僻造。
在虛擬機(jī)棧區(qū)中,除了基本數(shù)據(jù)類型以外孩饼,還存在著對象的引用髓削。這些引用就指向了堆區(qū)中的實(shí)際對象值。
類A有個(gè)字段是類B類型的镀娶,那么A類型的對象在堆空間地址范圍中包含一個(gè)B類型的對象還是對象引用
我覺得在為A的對象分配空間的時(shí)候立膛,計(jì)算需要申請多大的內(nèi)存,應(yīng)該算的是基本類型和String類型(因?yàn)镾tring是不可變類),引用類型的字段應(yīng)該用一種能夠表示內(nèi)存地址的類型(比如用一個(gè)int來表示一個(gè)地址)來表示宝泵,存放的值為B類型的對象在堆中的地址
如何計(jì)算對象的占用空間大小
通過java.lang.instrument.Instrumentation的getObjectSize(obj)直接獲取對象的大小
通過sun.misc.Unsafe對象的objectFieldOffset(field)等方法結(jié)合反射來計(jì)算對象的大小
main方法結(jié)束了好啰,程序就結(jié)束了嗎
不是的,main方法所在的線程是主線程儿奶,各個(gè)線程之間沒有關(guān)系框往,main方法結(jié)束了,其他線程完全可能還在運(yùn)行
接口繼承了Object嗎
沒有闯捎。下面這段話是Oracle官方描述
If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throwsclause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.
如果一個(gè)接口定義是最頂級的(沒有 super interfaces)椰弊,那么這個(gè)接口會(huì)自動(dòng)聲明一個(gè) abstract member method 結(jié)構(gòu)體來代表所有來自 Object 類(一切類的superclass)中的public方法(包括這些方法的簽名、返回類型以及拋出的異常)再換種說法——意思是接口隱含定義了一套與Object類中的方法簽名完全相同的方法隙券,所以,我們在程序中調(diào)用接口的那些與Object中具有相同簽名的方法時(shí)闹司,編譯器不會(huì)報(bào)錯(cuò)娱仔!好處是讓接口型的(interface Type)父類引用也可以擁有Object類的一般方法( toString()、equals() 等)
接口的默認(rèn)
接口中的成員變量默認(rèn)由 public static final 來修飾的游桩, 而接口中成員方法前使用 public abstract 來修飾牲迫。如何跳出當(dāng)前的多重嵌套循環(huán)
為循環(huán)打標(biāo)記,例如
outer:
for(int i = 0;i<10;i++) {
inner:
for(int j = 0;j<10;j++) {
if(j == 5)
break outer;
}
}
活用位運(yùn)算
恰當(dāng)?shù)臅r(shí)候使用位運(yùn)算來做乘法/除法借卧,能提高速度盹憎,因?yàn)镃PU直接支持位運(yùn)算。
亦或運(yùn)算
自己跟自己進(jìn)行亦或運(yùn)算結(jié)果為0铐刘。跟全1與運(yùn)算得到自己陪每,跟全0或運(yùn)算得到自己
溢出
進(jìn)行數(shù)值運(yùn)算時(shí)要考慮溢出的可能
使用final修飾的變量
final修飾的變量,變量本身的值不能變镰吵,但是引用的對象的內(nèi)容可以改變(不可變類除外)
ArrayList檩禾,Vector,LinkedList的存儲(chǔ)性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù)疤祭,此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素盼产,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作勺馆,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢戏售,Vector由于使用了synchronized方法(線程安全),通常性能上較 ArrayList差草穆,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)灌灾,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即 可悲柱,所以插入速度較快
final, finally, finalize的區(qū)別紧卒。
final 用于聲明屬性,方法和類诗祸,分別表示屬性不可變跑芳,方法不可覆蓋轴总,類不可繼承。finally是異常處理語句結(jié)構(gòu)的一部分博个,表示總是執(zhí)行怀樟。finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對象的此方法盆佣,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收往堡,例如關(guān)閉文件等。
Overload和Override的區(qū)別共耍。Overload的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)虑灰。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn), 重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)痹兜。如果在子類中定義某方法與其父類有相同的名稱和參數(shù)穆咐,我們說該方法被重寫 (Overriding)。子類的對象使用這個(gè)方法時(shí)字旭,將調(diào)用子類中的定義对湃,對它而言,父類中的定義如同被“屏蔽”了遗淳。如果在一個(gè)類中定義了多個(gè)同名的方 法拍柒,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)屈暗。Overloaded的方法是可以改變返回值的類型拆讯。
forward 和redirect的區(qū)別
- forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL养叛,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來往果,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的一铅,所以它的地址欄中還是原來的地址陕贮。
- redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請求那個(gè)地址潘飘,一般來說瀏覽器會(huì)用剛才請求的所有參數(shù)重新請求肮之,所以session,request參數(shù)都可以獲取。
接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承具體類(concrete class)?抽象類中是否可以有靜態(tài)的main方法?
接口可以繼承接口卜录。抽象類可以實(shí)現(xiàn)(implements)接口戈擒,抽象類可以繼承具體類。抽象類中可以有靜態(tài)的main方法艰毒。只要記住抽象類與普通類的唯一區(qū)別:就是不能創(chuàng)建實(shí)例對象和允許有abstract方法(也可以沒有)筐高。
native
native方法表示該方法要用另外一種依賴平臺的編程語言實(shí)現(xiàn)的,不存在著被子類實(shí)現(xiàn)的問題,所以柑土,它也不能是抽象的蜀肘,不能與abstract混用。例如稽屏,F(xiàn)ileOutputSteam類要硬件打交道扮宠,底層的實(shí)現(xiàn)用的是操作系統(tǒng)相關(guān)的api實(shí)現(xiàn),例如狐榔,在windows用c語言實(shí)現(xiàn)的坛增,所以,查看jdk的源代碼薄腻,可以發(fā)現(xiàn)FileOutputStream的open方法的定義如下:
private native void open(Stringname) throws FileNotFoundException;
如果我們要用java調(diào)用別人寫的c語言函數(shù)收捣,我們是無法直接調(diào)用的,我們需要按照java的要求寫一個(gè)c語言的函數(shù)庵楷,用我們的這個(gè)c語言函數(shù)去調(diào)用別人的c語言函數(shù)罢艾。由于我們的c語言函數(shù)是按java的要求來寫的,我們這個(gè)c語言函數(shù)就可以與java對接上嫁乘,java那邊的對接方式就是定義出與我們這個(gè)c函數(shù)相對應(yīng)的方法昆婿,java中對應(yīng)的方法不需要寫具體的代碼球碉,但需要在前面聲明native蜓斧。
try {}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行睁冬,什么時(shí)候被執(zhí)行挎春,在return前還是后
會(huì)執(zhí)行,在return前執(zhí)行
Iterator和ListIterator的區(qū)別是什么豆拨?
Iterator可用來遍歷Set和List集合直奋,但是ListIterator只能用來遍歷List。
Iterator對集合只能是前向遍歷施禾,ListIterator既可以前向也可以后向脚线。
ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能弥搞,比如:增加元素邮绿,替換元素,獲取前一個(gè)和后一個(gè)元素的索引攀例,等等船逮。
內(nèi)部類
內(nèi)部類可以訪問外部類的數(shù)據(jù)域,因?yàn)閮?nèi)部類包含了一個(gè)對外部類的引用“外部類.this”粤铭;外部類定義了一個(gè)內(nèi)部類挖胃,并不意味著每個(gè)外部類對象都有一個(gè)內(nèi)部類對象
根據(jù)位置不同分為下面幾種情況(內(nèi)部類包含了一個(gè)對外部類的引用“外部類.this”):
(普通)成員內(nèi)部類。類似于外部類的數(shù)據(jù)域/方法的位置,可以訪問外部類的所有數(shù)據(jù)域和方法酱鸭,可以用public吗垮,private修飾;如果是public修飾凛辣,在外面可以這樣使用公有內(nèi)部類抱既,假設(shè)A內(nèi)定義了一個(gè)B類,A a = new A(); A.B b = a.new B();
靜態(tài)(成員)內(nèi)部類扁誓。跟成員內(nèi)部類不同的是防泵,有static修飾符,只能訪問外部類的靜態(tài)數(shù)據(jù)域和靜態(tài)方法
局部內(nèi)部類蝗敢。定義在外部類的方法內(nèi)捷泞,不可以public,private修飾寿谴,而且只有在該方法內(nèi)可見锁右,對外部隱藏起來,就算是外部類的其他方法也不可見讶泰。局部內(nèi)部類可以訪問外部類的所有數(shù)據(jù)域和方法咏瑟,但是只能訪問所在方法中final修飾的局部變量,不能訪問所在方法中的非final局部變量
匿名內(nèi)部類痪署。其實(shí)是臨時(shí)類码泞,因?yàn)橹皇窃诖藭r(shí)需要一個(gè)特定對象而建的一個(gè)臨時(shí)類,用完即走狼犯,也就用這么一次余寥,所以沒必要單獨(dú)寫個(gè)類文件,而且實(shí)際上是創(chuàng)建了一個(gè)內(nèi)部類對象悯森,new SuperClass(parameters) {....}或者new Interface(){...}宋舷,接口的時(shí)候沒有參數(shù)
硬鏈接和軟鏈接
硬鏈接(Hard Link)指通過索引節(jié)點(diǎn)來進(jìn)行連接,在Linux為文件系統(tǒng)中瓢姻,保存在磁盤分區(qū)中的文件不管是什么類型都給它分配一個(gè)編號祝蝠,稱為索引節(jié)點(diǎn)號; 硬鏈接指的就是在Linux中幻碱,多個(gè)文件名指向同一索引節(jié)點(diǎn)绎狭; 常見用途:通過建立硬鏈接到重要文件,防止誤刪收班,刪除其實(shí)對應(yīng)的是刪除其中的一個(gè)硬鏈接坟岔,當(dāng)文件對應(yīng)的硬鏈接都被刪除了,該文件才真正被刪除摔桦; 硬鏈接是同一文件的不同訪問路徑社付,其對應(yīng)的索引節(jié)點(diǎn)號是一樣的承疲。
軟鏈接(Symbolic Link)也稱為符號鏈接,類似于Windows的快捷方式鸥咖,其中包含的是另一個(gè)文件的位置信息燕鸽,刪除符號鏈接不影響源文件,刪除源文件啼辣,則對應(yīng)的符號鏈接也沒有意義啊研;
只能在同種存儲(chǔ)媒體上的文件之間創(chuàng)建硬鏈接(Hard Link),不能在不同掛載點(diǎn)下的文件間創(chuàng)建硬鏈接鸥拧,對于后一種情況党远,可以使用軟鏈接(區(qū)分不同掛載點(diǎn)與同一掛載點(diǎn)不同目錄) ;
創(chuàng)建硬鏈接命令:
cp -l 1.txt 2.txt
等同于ln 1.txt 2.txt
為1.txt建立硬鏈接2.txt富弦;創(chuàng)建符號鏈接命令:cp -s 2.txt sLink
等同于ln –s 2.txt sLink
為2.txt文件建立符號鏈接sLinkswitch語句能否作用在byte上沟娱,能否作用在long上,能否作用在String上?
在switch(expr1)中腕柜,expr1只能是一個(gè)整數(shù)表達(dá)式或者枚舉常量济似,整數(shù)表達(dá)式可以是int基本類型或Integer包裝類型,由于盏缤,byte,short,char都可以隱含轉(zhuǎn)換為int砰蠢,所以,這些類型以及這些類型的包裝類型也是可以的唉铜。顯然台舱,long和String類型都不符合switch的語法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型打毛,所以柿赊,它們不能作用于swtich語句中俩功。short s1 = 1; s1 = s1 + 1;
有什么錯(cuò)?short s1 = 1; s1 += 1;
有什么錯(cuò)?
對于short s1 = 1; s1 = s1 + 1;
由于s1+1
運(yùn)算時(shí)會(huì)自動(dòng)提升表達(dá)式的類型幻枉,所以結(jié)果是int型,再賦值給short類型s1時(shí)诡蜓,編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類型的錯(cuò)誤熬甫。對于short s1 = 1; s1 += 1;
由于+=
是java語言規(guī)定的運(yùn)算符,java編譯器會(huì)對它進(jìn)行特殊處理蔓罚,因此可以正確編譯椿肩。char型變量中能不能存貯一個(gè)中文漢字?為什么?
char型變量是用來存儲(chǔ)Unicode編碼的字符的,unicode編碼字符集中包含了漢字豺谈,所以郑象,char型變量中當(dāng)然可以存儲(chǔ)漢字啦。不過茬末,如果某個(gè)特殊的漢字沒有被包含在unicode編碼字符集中厂榛,那么盖矫,這個(gè)char型變量中就不能存儲(chǔ)這個(gè)特殊漢字。補(bǔ)充說明:unicode編碼占用兩個(gè)字節(jié)击奶,所以辈双,char類型的變量也是占用兩個(gè)字節(jié)。靜態(tài)變量和實(shí)例變量的區(qū)別柜砾?
在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字湃望,而實(shí)例變量前則不加。在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對象的屬性痰驱,必須創(chuàng)建了實(shí)例對象证芭,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量担映。靜態(tài)變量不屬于某個(gè)實(shí)例對象檩帐,而是屬于類,所以也稱為類變量另萤,只要程序加載了類的字節(jié)碼湃密,不用創(chuàng)建任何實(shí)例對象,靜態(tài)變量就會(huì)被分配空間四敞,靜態(tài)變量就可以被使用了泛源。總之忿危,實(shí)例變量必須創(chuàng)建對象后才可以通過這個(gè)對象來使用达箍,靜態(tài)變量則可以直接使用類名來引用。-
請說出作用域public铺厨,private缎玫,protected,以及不寫時(shí)的區(qū)別
這四個(gè)作用域的可見范圍如下表所示解滓。
說明:如果在修飾的元素上面沒有寫任何訪問修飾符赃磨,則表示friendly。
ClassLoader如何加載class洼裤?
jvm里有多個(gè)類加載器邻辉,每個(gè)類加載器可以負(fù)責(zé)加載特定位置的類,例如腮鞍,bootstrap類加載負(fù)責(zé)加載jre/lib/rt.jar中的類值骇, 我們平時(shí)用的jdk中的類都位于rt.jar中。extclassloader負(fù)責(zé)加載jre/lib/ext/*.jar中的類移国,appclassloader負(fù)責(zé)classpath指定的目錄或jar中的類吱瘩。除了bootstrap之外(C語言實(shí)現(xiàn)),其他的類加載器本身也都是java類迹缀,它們的父類是URLClassLoader使碾。hashCode方法的作用皱卓?
hashcode這個(gè)方法是用來鑒定2個(gè)對象是否相等的。equals方法和hashCode方法這2個(gè)方法都是用來判斷2個(gè)對象是否相等的部逮,但是他們是有區(qū)別的娜汁。一般來講,equals這個(gè)方法是給用戶調(diào)用的兄朋,如果你想判斷2個(gè)對象是否相等掐禁,你可以重寫equals方法,然后在代碼中調(diào)用颅和,就可以判斷他們是否相等了傅事。簡單來講,equals方法主要是用來判斷從表面上看或者從內(nèi)容上看峡扩,2個(gè)對象是不是相等蹭越。舉個(gè)例子,有個(gè)學(xué)生類教届,屬性只有姓名和性別响鹃,那么我們可以認(rèn)為只要姓名和性別相等,那么就說這2個(gè)對象是相等的案训。hashcode方法一般用戶不會(huì)去調(diào)用买置,比如在hashmap中,由于key是不可以重復(fù)的强霎,他在判斷key是不是重復(fù)的時(shí)候就判斷了hashcode這個(gè)方法忿项,如果hashCode相等,再比較equals城舞,equals返回true則不存轩触,返回false則存。這里不可以重復(fù)是說equals和hashcode只要有一個(gè)不等就可以了家夺!所以簡單來講脱柱,hashcode相當(dāng)于是一個(gè)對象的編碼,就好像文件中的md5秦踪,他和equals不同就在于他返回的是int型的褐捻,比較起來不直觀掸茅。我們一般在覆蓋equals的同時(shí)也要覆蓋hashcode椅邓,讓他們的邏輯一致。舉個(gè)例子昧狮,還是剛剛的例子景馁,如果姓名和性別相等就算2個(gè)對象相等的話,那么hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值逗鸣,這樣從邏輯上合住,他們就一致了绰精。要從物理上判斷2個(gè)對象是否相等,用==就可以了透葛,如果兩個(gè)對象的物理(內(nèi)存)地址相等笨使,那么這兩個(gè)對象肯定就是同一個(gè)對象。什么是AOP僚害?
1.AOP概念介紹
所謂AOP硫椰,即Aspect orientied program,就是面向方面(切面)的編程,是對面向?qū)ο蟮乃季S方式的有力補(bǔ)充萨蚕。AOP的好處是可以動(dòng)態(tài)地添加和刪除在切面上的邏輯而不影響原來的執(zhí)行代碼
2.解釋什么是方面(切面)
所謂方面(切面)靶草,指的是貫穿到系統(tǒng)的各個(gè)模塊中的系統(tǒng)一個(gè)功能就是一個(gè)方面(切面),比如岳遥,記錄日志奕翔,統(tǒng)一異常處理,事務(wù)處理浩蓉,權(quán)限檢查派继,這些功能都是軟件系統(tǒng)的一個(gè)面,而不是一點(diǎn)捻艳,在各個(gè)模塊中都要出現(xiàn)互艾。
3.什么是面向方面編程
把系統(tǒng)的一個(gè)方面的功能封裝成對象的形式來處理就是面向方面(切面)編程
4.怎么進(jìn)行面向方面編程
把功能模塊對應(yīng)的對象作為切面嵌入到原來的各個(gè)系統(tǒng)模塊中,采用代理技術(shù)讯泣,代理會(huì)調(diào)用目標(biāo)纫普,同時(shí)把切面功能的代碼(對象)加入進(jìn)來。所以好渠,用spring配置代理對象時(shí)只要要配兩個(gè)屬性昨稼,分別表示目標(biāo)和切面對象(Advisor)。談?wù)勀銓vc的理解
MVC是Model—View—Controler的簡稱拳锚。即模型—視圖—控制器假栓。MVC是一種設(shè)計(jì)模式,它強(qiáng)制性的把應(yīng)用程序的輸入霍掺、處理和輸出分開匾荆。
MVC中的模型、視圖杆烁、控制器它們分別擔(dān)負(fù)著不同的任務(wù)牙丽。
視圖: 視圖是用戶看到并與之交互的界面。視圖向用戶顯示相關(guān)的數(shù)據(jù)兔魂,并接受用戶的輸入烤芦。視圖不進(jìn)行任何業(yè)務(wù)邏輯處理。
模型: 模型表示業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)處理析校。相當(dāng)于JavaBean构罗。一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)(比如個(gè)人主頁铜涉,自己模式和游客模式就是不同的視圖)。這提高了應(yīng)用程序的重用性
控制器: 當(dāng)用戶單擊Web頁面中的提交按鈕時(shí),控制器接受請求并調(diào)用相應(yīng)的模型去處理請求遂唧。然后根據(jù)處理的結(jié)果調(diào)用相應(yīng)的視圖來顯示處理的結(jié)果芙代。
MVC的處理過程:首先控制器接受用戶的請求,調(diào)用相應(yīng)的模型來進(jìn)行業(yè)務(wù)處理盖彭,并返回?cái)?shù)據(jù)給控制器链蕊。控制器調(diào)用相應(yīng)的視圖來顯示處理的結(jié)果谬泌。并通過視圖呈現(xiàn)給用戶滔韵。
- 實(shí)現(xiàn)一個(gè)接口需要實(shí)現(xiàn)接口的所有方法嗎
看實(shí)現(xiàn)類是否是抽象類;如果不是抽象類掌实,需要全部實(shí)現(xiàn)陪蜻;如果是抽象類,就沒有限制了(可以一個(gè)都不實(shí)現(xiàn)贱鼻,可以部分實(shí)現(xiàn)宴卖,可以全部實(shí)現(xiàn))