javaOOP面試題
1滔驶、什么是B/S架構(gòu)春哨?什么是C/S架構(gòu)
B/S(Browser/Server)嗤形,瀏覽器/服務(wù)器程序
C/S(Client/Server)屋吨,客戶端/服務(wù)端桑逝,桌面應(yīng)用程序
2棘劣、Java都有那些開發(fā)平臺(tái)?
- JAVA SE:主要用在客戶端開發(fā)
- JAVA EE:主要用在web應(yīng)用程序開發(fā)
- JAVA ME:主要用在嵌入式應(yīng)用程序開發(fā)
3楞遏、什么是JDK茬暇?什么是JRE?
- JDK:java development kit:java開發(fā)工具包,是開發(fā)人員所需要安裝的環(huán)境
- JRE:java runtime environment:java運(yùn)行環(huán)境寡喝,java程序運(yùn)行所需要安裝的環(huán)境
4糙俗、Java語言有哪些特點(diǎn)
- 簡(jiǎn)單易學(xué)、有豐富的類庫
- 面向?qū)ο螅↗ava最重要的特性预鬓,讓程序耦合度更低臼节,內(nèi)聚性更高)
- 與平臺(tái)無關(guān)性(JVM是Java跨平臺(tái)使用的根本)
- 可靠安全
- 支持多線程
5、面向?qū)ο蠛兔嫦蜻^程的區(qū)別
- 面向過程: 一種較早的編程思想珊皿,顧名思義就是該思想是站著過程的角度思考問題网缝,強(qiáng)調(diào)的就是功能行為,功能的執(zhí)行過程蟋定,即先后順序粉臊,而每 一個(gè)功能我們都使用函數(shù)(類似于方法)把這些步驟一步一步實(shí)現(xiàn)。使用的時(shí)候依次調(diào)用函數(shù)就可以了驶兜。
- 面向?qū)ο螅?一種基于面向過程的新編程思想扼仲,顧名思義就是該思想是站在對(duì)象的角度思考問題远寸,我們把多個(gè)功能合理放到不同對(duì)象里,強(qiáng)調(diào)的是 具備某些功能的對(duì)象屠凶。 具備某種功能的實(shí)體驰后,稱為對(duì)象。面向?qū)ο笞钚〉某绦騿卧牵侯惔@ⅰC嫦驅(qū)ο蟾臃铣R?guī)的思維方式灶芝,穩(wěn)定性好,可重用性強(qiáng)唉韭,易 于開發(fā)大型軟件產(chǎn)品夜涕,有良好的可維護(hù)性。 在軟件工程上属愤,面向?qū)ο罂梢允构こ谈幽K化女器,實(shí)現(xiàn)更低的耦合和更高的內(nèi)聚。
6住诸、什么是數(shù)據(jù)結(jié)構(gòu)驾胆?
計(jì)算機(jī)保存,組織數(shù)據(jù)的方式
7贱呐、Java的數(shù)據(jù)結(jié)構(gòu)有那些丧诺?
- 線性表(ArrayList)
- 鏈表(LinkedList)
- 棧(Stack)
- 隊(duì)列(Queue)
- 圖(Map)
- 樹(Tree)
8、什么是OOP?
面向?qū)ο缶幊?/p>
9吼句、類與對(duì)象的關(guān)系?
類是對(duì)象的抽象,對(duì)象是類的具體事格,類是對(duì)象的模板惕艳,對(duì)象是類的實(shí)例
10、Java中有幾種數(shù)據(jù)類型
整形:byte,short,int,long
浮點(diǎn)型:float double
字符型:char
布爾型:boolean
11驹愚、標(biāo)識(shí)符的命名規(guī)則远搪。
- 標(biāo)識(shí)符的含義: 是指在程序中,我們自己定義的內(nèi)容逢捺,譬如谁鳍,類的名字,方法名稱以及變量名稱等等劫瞳,都是標(biāo)識(shí)符倘潜。
- 命名規(guī)則:(硬性要求) 標(biāo)識(shí)符可以包含英文字母,0-9的數(shù)字志于,$以及_ 標(biāo)識(shí)符不能以數(shù)字開頭 標(biāo)識(shí)符不是關(guān)鍵字
- 命名規(guī)范:(非硬性要求) 類名規(guī)范:首字符大寫涮因,后面每個(gè)單詞首字母大寫(大駝峰式)。 變量名規(guī)范:首字母小寫伺绽,后面每個(gè)單詞首字母大寫(小駝峰式)养泡。 方法名規(guī)范:同變量名嗜湃。
12、instanceof關(guān)鍵字的作用
instanceof 嚴(yán)格來說是Java中的一個(gè)雙目運(yùn)算符澜掩,用來測(cè)試一個(gè)對(duì)象是否為一個(gè)類的實(shí)例购披,用法為:
boolean result = obj instanceof Class
其中 obj 為一個(gè)對(duì)象,Class 表示一個(gè)類或者一個(gè)接口肩榕,當(dāng) obj 為 Class 的對(duì)象刚陡,或者是其直接或 間接子類,或者是其接口的實(shí)現(xiàn)類点把,結(jié)果result 都返回 true橘荠,否則返回false。 注意:編譯器會(huì)檢查 obj 是否能轉(zhuǎn)換成右邊的class類型郎逃,如果不能轉(zhuǎn)換則直接報(bào)錯(cuò)哥童,如果不能確定 類型,則通過編譯褒翰,具體看運(yùn)行時(shí)定贮懈。
inti=0;
System.out.println(i instanceof Integer);//編譯不通過i必須是引用類型,不能是基本類型
System.out.println(i instanceof Object);//編譯不通過
Integer integer=newInteger(1);
System.out.println(integer instanceof Integer);//true
//false,在JavaSE規(guī)范中對(duì)instanceof運(yùn)算符的規(guī)定就是:如果obj為null优训,那么將返回false朵你。
System.out.println(nullinstanceofObject);
13、什么是隱式轉(zhuǎn)換揣非,什么是顯式轉(zhuǎn)換
顯示轉(zhuǎn)換就是類型強(qiáng)轉(zhuǎn)抡医,把一個(gè)大類型的數(shù)據(jù)強(qiáng)制賦值給小類型的數(shù)據(jù);隱式轉(zhuǎn)換就是大范圍的變量能夠接受小范圍的數(shù)據(jù)早敬;隱式轉(zhuǎn)換和顯 式轉(zhuǎn)換其實(shí)就是自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換忌傻。
14、Char類型能不能轉(zhuǎn)成int類型搞监?能不能轉(zhuǎn)化成string類型水孩,能不能轉(zhuǎn)成double類型
Char在java
中也是比較特殊的類型,它的int值從1開始琐驴,一共有2的16次方個(gè)數(shù)據(jù)俘种;Char<int<float<double
;Char類型可以隱式轉(zhuǎn)成int,double類型绝淡,但是不能隱式轉(zhuǎn)換成string宙刘;如果char類 型轉(zhuǎn)成byte,short類型的時(shí)候牢酵,需要強(qiáng)轉(zhuǎn)荐类。
15、什么是拆裝箱茁帽?
- 裝箱就是自動(dòng)將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型(int-->Integer)玉罐;調(diào)用方法:Integer的 valueOf(int) 方法 拆箱就是自動(dòng)將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型(Integer-->int)屈嗤。調(diào)用方法:Integer的intValue方 法 在Java SE5之前,如果要生成一個(gè)數(shù)值為10的Integer對(duì)象吊输,必須這樣進(jìn)行:
Integer i = new Integer(10);
而在從Java SE5開始就提供了自動(dòng)裝箱的特性饶号,如果要生成一個(gè)數(shù)值為10的Integer對(duì)象,只需要這 樣就可以了:
Integer i = 10;
面試題1:以下代碼會(huì)輸出什么季蚂?
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
結(jié)果:
true
false
16茫船、Java中的包裝類都是那些?
byte:Byte扭屁,short:Short算谈,int:Integer,long:Long料滥,float:Float然眼,double:Double,char:Character 葵腹,boolean:Boolean
17高每、一個(gè)java類中包含那些內(nèi)容?
屬性践宴、方法鲸匿、內(nèi)部類、構(gòu)造方法阻肩、代碼塊带欢。
18、那針對(duì)浮點(diǎn)型數(shù)據(jù)運(yùn)算出現(xiàn)的誤差的問題烤惊,你怎么解決乔煞?
使用Bigdecimal類進(jìn)行浮點(diǎn)型數(shù)據(jù)的運(yùn)算
19、面向?qū)ο蟮奶卣饔心男┓矫?/h5>
抽象:
抽象是將一類對(duì)象的共同特征總結(jié)出來構(gòu)造類的過程, 包括數(shù)據(jù)抽象和行為抽象兩方面撕氧。抽象只關(guān)注對(duì)象有哪些屬 性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么瘤缩。
繼承:
繼承是從已有類得到繼承信息創(chuàng)建新類的過程.提供繼承信息的類被稱為父類(超類喇完、基類) ;得到繼承信息的類被稱 為子類(派生類)伦泥。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性 ,同時(shí)繼承也是封裝程序中可變因素的重要手段(如果不能理解請(qǐng)閱讀閻宏博土的《Java 與模式》或《設(shè)計(jì)模式精解》中.關(guān)于橋梁模式的部分)。
封裝:
通常認(rèn)為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來锦溪,對(duì)數(shù)據(jù)的訪問 只能通過已定義的接口不脯。面向?qū)ο蟮谋举|(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自 治、封閉的對(duì)象刻诊。我們?cè)陬愔芯帉懙姆椒ň褪菍?duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝防楷;我們編寫 一個(gè)類就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝≡蜓模可以說复局,封裝就是隱藏一切可隱藏的東西冲簿, 只向外界提供最簡(jiǎn)單的編程接口(可以想想普通洗衣機(jī)和全自動(dòng)洗衣機(jī)的差別, 明顯全自動(dòng)洗衣機(jī)封裝更好因此操作起來更簡(jiǎn)單亿昏;我們現(xiàn)在使用的智能手機(jī)也是 封裝得足夠好的峦剔,因?yàn)閹讉€(gè)按鍵就搞定了所有的事情)。
多態(tài)性:
多態(tài)性是指允許不同子類型的對(duì)象對(duì)同一消息作出不同的響應(yīng)角钩。 簡(jiǎn)單的說就是用同樣的對(duì)象引用調(diào)用同樣的方法但是做了不同的事情吝沫。多態(tài)性分 為編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。如果將對(duì)象的方法視為對(duì)象向外界提供的 服務(wù)递礼,那么運(yùn)行時(shí)的多態(tài)性可以解釋為:當(dāng) A 系統(tǒng)訪問 B 系統(tǒng)提供的服務(wù)時(shí)惨险,B 系統(tǒng)有多種提供服務(wù)的方式,但一切對(duì) A 系統(tǒng)來說都是透明的(就像電動(dòng)剃須 刀是 A 系統(tǒng)脊髓,它的供電系統(tǒng)是 B 系統(tǒng)辫愉,B 系統(tǒng)可以使用電池供電或者用交流電, 甚至還有可能是太陽能供炼,A 系統(tǒng)只會(huì)通過 B 類對(duì)象調(diào)用供電的方法一屋,但并不知道 供電系統(tǒng)的底層實(shí)現(xiàn)是什么,究竟通過何種方式獲得了動(dòng)力)袋哼。方法重載 (overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定)冀墨,而方法重寫(override) 實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)。運(yùn)行時(shí)的多態(tài)是面向?qū)ο笞罹璧?東西涛贯,要實(shí)現(xiàn)多態(tài)需要做兩件事:1). 方法重寫(子類繼承父類并重寫父類中已 有的或抽象的方法)诽嘉;2). 對(duì)象造型(用父類型引用引用子類型對(duì)象,這樣同樣 的引用調(diào)用同樣的方法就會(huì)根據(jù)子類對(duì)象的不同而表現(xiàn)出不同的行為)弟翘。
20虫腋、訪問修飾符 public,private,protected,以及不寫(默認(rèn)) 時(shí)的區(qū)別?
修飾符 | 當(dāng)前類 | 同包 | 子類 | 其他包 |
---|---|---|---|---|
public | 能 | 能 | 能 | 能 |
protected | 能 | 能 | 能 | 不能 |
default | 能 | 能 | 不能 | 不能 |
private | 能 | 不能 | 不能 | 不能 |
類的成員不寫訪問修飾時(shí)默認(rèn)為 default稀余。默認(rèn)對(duì)于同一個(gè)包中的其他類相當(dāng)于公 開(public)悦冀,對(duì)于不是同一個(gè)包中的其他類相當(dāng)于私有 (private)。受保護(hù) (protected)對(duì)子類相當(dāng)于公開睛琳,對(duì)不是同一包中的沒有父子關(guān)系的類相當(dāng)于私 有盒蟆。Java 中,外部類的修飾符只能 是 public 或默認(rèn)师骗,類的成員(包括內(nèi)部類)的 修飾符可以是以上四種历等。
21、String 是最基本的數(shù)據(jù)類型嗎辟癌?
不是寒屯。Java 中的基本數(shù)據(jù)類型只有 8 個(gè):byte、short黍少、int寡夹、long处面、float、double菩掏、 char鸳君、boolean;除了基本類型(primitive type)患蹂, 剩下的都是引用類型(reference type)或颊,Java 5 以后引入的枚舉類型也算是一種比較特殊的引用類型。
22传于、float f=3.4;是否正確囱挑?
答:不正確。3.4 是雙精度數(shù)沼溜,將雙精度型(double)賦值給浮點(diǎn)型(float)屬于 下轉(zhuǎn)型(down-casting平挑,也稱為窄化)會(huì)造成精度損失, 因此需要強(qiáng)制類型轉(zhuǎn)換 float f =(float)3.4; 或者寫成 float f =3.4F;系草。
23通熄、short s1 = 1; s1 = s1 + 1;有錯(cuò)嗎?short s1 = 1; s1 += 1; 有錯(cuò)嗎?
對(duì)于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 類型找都,因此 s1+1 運(yùn)算結(jié)果也是 int 型唇辨,需要強(qiáng)制轉(zhuǎn)換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;可以正確 編譯能耻,因?yàn)?s1+= 1;相當(dāng)于 s1 = (short)(s1 + 1);其中有隱含的強(qiáng)制類型轉(zhuǎn)換赏枚。
24、重載和重寫的區(qū)別
重寫(Override)
從字面上看晓猛,重寫就是 重新寫一遍的意思饿幅。其實(shí)就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類 原有的方法戒职,但有時(shí)子類并不想原封不動(dòng)的繼承父類中的某個(gè)方法栗恩,所以在方法名,參數(shù)列表洪燥,返回類型(除過子類中方法的返回值是父類中方法返回值的子類時(shí))都相同的情況下磕秤, 對(duì)方法體進(jìn)行修改或重寫,這就是重寫蚓曼。但要 注意子類函數(shù)的訪問修飾權(quán)限不能少于父類的亲澡。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
原因:在某個(gè)范圍內(nèi)的整型數(shù)值的個(gè)數(shù)是有限的钦扭,而浮點(diǎn)數(shù)卻不是纫版。
重寫 總結(jié):
- 發(fā)生在父類與子類之間
- 方法名,參數(shù)列表客情,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同
- 訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)
- 重寫方法一定不能拋出新的檢查異称浔祝或者比被重寫方法申明更加寬泛的檢查型異常
重載(Overload)
在一個(gè)類中癞己,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個(gè)數(shù)不同甚至是參數(shù)順序不同) 則視為重載梭伐。同時(shí)痹雅,重載對(duì)返回類型沒有要求,可以相同也可以不同糊识,但不能通過返回類型是否相同來 判斷重載绩社。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
重載總結(jié):
- 重載Overload是一個(gè)類中多態(tài)性的一種表現(xiàn)
- 重載要求同名方法的參數(shù)列表不同(參數(shù)類型,參數(shù)個(gè)數(shù)甚至是參數(shù)順序)
- 重載的時(shí)候赂苗,返回值類型可以相同也可以不相同愉耙。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)
25、equals與==的區(qū)別
==:
== 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址拌滋,用來判斷兩個(gè)對(duì)象的地址是否相同朴沿,即是否是 指相同一個(gè)對(duì)象。比較的是真正意義上的指針操作败砂。
- 比較的是操作符兩端的操作數(shù)是否是同一個(gè)對(duì)象赌渣。
- 兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過。
- 比較的是地址昌犹,如果是具體的阿拉伯?dāng)?shù)字的比較坚芜,值相等則為true,如: int a=10 與 long b=10L 與 double c=10.0都是相同的(為true)斜姥,因?yàn)樗麄兌贾赶虻刂窞?0的堆货岭。
equals:
equals用來比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.Object類的疾渴,所以 適用于所有對(duì)象千贯,如果沒有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類中的方法搞坝,而Object中的 equals方法返回的卻是==的判斷搔谴。
總結(jié):
所有比較是否相等時(shí),都是用equals 并且在對(duì)常量相比較時(shí)桩撮,把常量寫在前面敦第,因?yàn)槭褂胦bject的 equals object可能為null 則空指針 在阿里的代碼規(guī)范中只使用equals ,阿里插件默認(rèn)會(huì)識(shí)別店量,并可以快速修改芜果,推薦安裝阿里插件來排 查老代碼使用“==”,替換成equals
36融师、++i與i++的區(qū)別
i++:先賦值右钾,后計(jì)算
++i:先計(jì)算,后賦值
27、程序的結(jié)構(gòu)有那些舀射?
順序結(jié)構(gòu)
選擇結(jié)構(gòu)
循環(huán)結(jié)構(gòu)
28窘茁、數(shù)組實(shí)例化有幾種方式?
靜態(tài)實(shí)例化:創(chuàng)建數(shù)組的時(shí)候已經(jīng)指定數(shù)組中的元素,
int [] a= new int[]{ 1 , 3 , 3}
動(dòng)態(tài)實(shí)例化:實(shí)例化數(shù)組的時(shí)候脆烟,只指定了數(shù)組程度山林,數(shù)組中所有元素都是數(shù)組類型的默認(rèn)值
29、Java中各種數(shù)據(jù)默認(rèn)值
Byte,short,int,long默認(rèn)是都是0
Boolean默認(rèn)值是false
Char類型的默認(rèn)值是’’
Float與double類型的默認(rèn)是0.0
對(duì)象類型的默認(rèn)值是null
30邢羔、Java常用包有那些驼抹?
Java.lang
Java.io
Java.sql
Java.util
Java.awt
Java.net
Java.math
31、Object類常用方法有那些拜鹤?
Equals
Hashcode
toString
wait
notify
clone
getClass
32砂蔽、java中有沒有指針?
有指針署惯,但是隱藏了左驾,開發(fā)人員無法直接操作指針,由jvm來操作指針
33极谊、java中是值傳遞引用傳遞诡右?
理論上說,java都是引用傳遞轻猖,對(duì)于基本數(shù)據(jù)類型帆吻,傳遞是值的副本,而不是值本身咙边。對(duì)于對(duì)象類型猜煮,傳遞是對(duì)象的引用,當(dāng)在一個(gè)方法操 作操作參數(shù)的時(shí)候败许,其實(shí)操作的是引用所指向的對(duì)象王带。
34、實(shí)例化數(shù)組后市殷,能不能改變數(shù)組長(zhǎng)度呢愕撰?
不能,數(shù)組一旦實(shí)例化醋寝,它的長(zhǎng)度就是固定的
35搞挣、假設(shè)數(shù)組內(nèi)有5個(gè)元素,如果對(duì)數(shù)組進(jìn)行反序音羞,該如何做囱桨?
創(chuàng)建一個(gè)新數(shù)組,從后到前循環(huán)遍歷每個(gè)元素嗅绰,將取出的元素依次順序放入新數(shù)組中
36舍肠、形參與實(shí)參區(qū)別
實(shí)參(argument):
全稱為"實(shí)際參數(shù)"是在調(diào)用時(shí)傳遞給函數(shù)的參數(shù). 實(shí)參可以是常量搀继、變量、表達(dá)式貌夕、函數(shù)等, 無論實(shí)參是何種類型的量民镜,在進(jìn)行函數(shù)調(diào)用 時(shí)啡专,它們都必須具有確定的值, 以便把這些值傳送給形參制圈。 因此應(yīng)預(yù)先用賦值们童,輸入等辦法使實(shí)參獲得確定值
形參(parameter):
全稱為"形式參數(shù)" 由于它不是實(shí)際存在變量,所以又稱虛擬變量鲸鹦。是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來接收調(diào)用該函數(shù) 時(shí)傳入的參數(shù).在調(diào)用函數(shù)時(shí)慧库,實(shí)參將賦值給形參。因而馋嗜,必須注意實(shí)參的個(gè)數(shù)齐板,類型應(yīng)與形參一一對(duì)應(yīng),并且實(shí)參必須要有確定的值
形參出現(xiàn)在函數(shù)定義中葛菇,在整個(gè)函數(shù)體內(nèi)都可以使用甘磨,離開該函數(shù)則不能使用。
實(shí)參出現(xiàn)在主調(diào)函數(shù)中眯停,進(jìn)入被調(diào)函數(shù)后济舆,實(shí)參變量也不能使用。
形參和實(shí)參的功能是作數(shù)據(jù)傳送莺债。發(fā)生函數(shù)調(diào)用時(shí)滋觉, 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳 送。
- 形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元齐邦,在調(diào)用結(jié)束時(shí)椎侠, 即刻釋放所分配的內(nèi)存單元。因此措拇,形參只有在函數(shù)內(nèi)部有效肺蔚。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
- 實(shí)參可以是常量儡羔、變量宣羊、表達(dá)式、函數(shù)等汰蜘, 無論實(shí)參是何種類型的量仇冯,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值族操, 以便把這些值傳 送給形 參苛坚。 因此應(yīng)預(yù)先用賦值比被,輸入等辦法使實(shí)參獲得確定值。
- 實(shí)參和形參在數(shù)量上泼舱,類型上等缀,順序上應(yīng)嚴(yán)格一致, 否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤娇昙。
- 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的尺迂。 即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參冒掌。 因此在函數(shù)調(diào)用過程中噪裕, 形參的值 發(fā)生改變,而實(shí)參中的值不會(huì)變化股毫。
- 當(dāng)形參和實(shí)參不是指針類型時(shí)膳音,在該函數(shù)運(yùn)行時(shí),形參和實(shí)參是不同的變量铃诬,他們?cè)趦?nèi)存中位于不同的位置祭陷,形參將實(shí)參的內(nèi)容復(fù)制一 份,在該 函數(shù)運(yùn)行結(jié)束的時(shí)候形參被釋放趣席,而實(shí)參內(nèi)容不會(huì)改變颗胡。而如果函數(shù)的參數(shù)是指針類型變量,在調(diào)用該函數(shù)的過程中,傳給函數(shù)的是實(shí)參的地址吩坝,在函數(shù)體內(nèi)部使用的也是實(shí)參的地址毒姨,即使用的就 是實(shí)參 本身。所以在函數(shù)體內(nèi)部可以改變實(shí)參的值钉寝。
37弧呐、構(gòu)造方法能不能顯式調(diào)用?
不能嵌纲,構(gòu)造方法當(dāng)成普通方法調(diào)用俘枫,只有在創(chuàng)建對(duì)象的時(shí)候它才會(huì)被系統(tǒng)調(diào)用
38、什么是方法重載逮走?
方法的重載就是在同一個(gè)類中允許同時(shí)存在一個(gè)以上的同名方法鸠蚪,只要它們的參數(shù)個(gè)數(shù)或者類型不同即可。在這種情況下师溅,該方法就叫被重 載了茅信,這個(gè)過程稱為方法的重載(override)
39、構(gòu)造方法能不能重寫墓臭?能不能重載递瑰?
可以重載艾岂,但不能重寫磁携。
40、內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別膝舅?
靜態(tài)內(nèi)部類相對(duì)與外部類是獨(dú)立存在的,在靜態(tài)內(nèi)部類中無法直接訪問外部類中變量窑多、方法仍稀。如果要訪問的話,必須要new一個(gè)外部類的對(duì) 象埂息,使用new出來的對(duì)象來訪問技潘。但是可以直接訪問靜態(tài)的變量、調(diào)用靜態(tài)的方法耿芹;
普通內(nèi)部類作為外部類一個(gè)成員而存在崭篡,在普通內(nèi)部類中可以直接訪問外部類屬性挪哄,調(diào)用外部類的方法吧秕。
如果外部類要訪問內(nèi)部類的屬性或者調(diào)用內(nèi)部類的方法,必須要?jiǎng)?chuàng)建一個(gè)內(nèi)部類的對(duì)象迹炼,使用該對(duì)象訪問屬性或者調(diào)用方法砸彬。
如果其他的類要訪問普通內(nèi)部類的屬性或者調(diào)用普通內(nèi)部類的方法,必須要在外部類中創(chuàng)建一個(gè)普通內(nèi)部類的對(duì)象作為一個(gè)屬性斯入,外同類可以通過該屬性調(diào)用普通內(nèi)部類的方法或者訪問普通內(nèi)部類的屬性
如果其他的類要訪問靜態(tài)內(nèi)部類的屬性或者調(diào)用靜態(tài)內(nèi)部類的方法砂碉,直接創(chuàng)建一個(gè)靜態(tài)內(nèi)部類對(duì)象即可。
41刻两、Static關(guān)鍵字有什么作用增蹭?
Static可以修飾內(nèi)部類、方法磅摹、變量滋迈、代碼塊
Static修飾的類是靜態(tài)內(nèi)部類
Static修飾的方法是靜態(tài)方法,表示該方法屬于當(dāng)前類的户誓,而不屬于某個(gè)對(duì)象的饼灿,靜態(tài)方法也不能被重寫,可以直接使用類名來調(diào)用帝美。在 static方法中不能使用this或者super關(guān)鍵字碍彭。
Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實(shí)例所共享悼潭,不會(huì)依賴于對(duì)象庇忌。靜態(tài)變量在內(nèi)存中只有一份拷貝,在JVM加載類 的時(shí)候舰褪,只為靜態(tài)分配一次內(nèi)存漆枚。
Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來做程序優(yōu)化的抵知。靜態(tài)代碼塊中的代碼在整個(gè)類加載的時(shí)候只會(huì)執(zhí)行一次墙基。靜態(tài)代碼塊可以有多 個(gè)软族,如果有多個(gè),按照先后順序依次執(zhí)行残制。
42立砸、final在java中的作用,有哪些用法
final也是很多面試喜歡問的地方,但我覺得這個(gè)問題很無聊,通常能回答下以下5點(diǎn)就不錯(cuò)了:
- 被fifinal修飾的類不可以被繼承
- 被fifinal修飾的方法不可以被重寫
- 被fifinal修飾的變量不可以被改變.如果修飾引用,那么表示引用不可變,引用指向的內(nèi)容可變.
- 被fifinal修飾的方法,JVM會(huì)嘗試將其內(nèi)聯(lián),以提高運(yùn)行效率
- 被fifinal修飾的常量,在編譯階段會(huì)存入常量池中. 除此之外,編譯器對(duì)fifinal域要遵守的兩個(gè)重排序規(guī)則更好: 在構(gòu)造函數(shù)內(nèi)對(duì)一個(gè)fifinal域的寫入,與隨后把這個(gè)被構(gòu)造對(duì)象的引用賦值給一個(gè)引用變量,這兩個(gè)操作之間不能重排序 初次讀一個(gè)包含fifinal域的對(duì)象的引用,與隨后初次讀這個(gè)fifinal域,這兩個(gè)操作之間不能重排序
43初茶、StringString StringBuffffer 和 StringBuilder 的區(qū)別是什么颗祝?
String是只讀字符串,它并不是基本數(shù)據(jù)類型恼布,而是一個(gè)對(duì)象螺戳。從底層源碼來看是一個(gè)fifinal類型的字符 數(shù)組,所引用的字符串不能被改變折汞,一經(jīng)定義倔幼,無法再增刪改。每次對(duì)String的操作都會(huì)生成新的 String對(duì)象
private final char value[];
每次+操作 : 隱式在堆上new了一個(gè)跟原字符串相同的StringBuilder對(duì)象爽待,再調(diào)用append方法 拼接 +后面的字符损同。
StringBuffer與StringBuilder都繼承了AbstractStringBulder類,而AbtractStringBuilder又實(shí)現(xiàn)了CharSequence接口鸟款,兩個(gè)類都是用來進(jìn) 行字符串操作的膏燃。
在做字符串拼接修改刪除替換時(shí),效率比string更高何什。
StringBuffer是線程安全的组哩,Stringbuilder是非線程安全的。所以Stringbuilder比stringbuffer效率更高处渣,StringBuffer的方法大多都加了 synchronized關(guān)鍵字
44伶贰、String str=”aaa”,與String str=new String(“aaa”)一樣嗎?
一共有兩個(gè)引用霍比,三個(gè)對(duì)象幕袱。因?yàn)椤盿a”與”bb”都是常量,常量的值不能改變悠瞬,當(dāng)執(zhí)行字符串拼接時(shí)候们豌,會(huì)創(chuàng)建一個(gè)新的常量是” aabbb”,有將 其存到常量池中。
45浅妆、講下java中的math類有那些常用方法望迎?
Pow():冪運(yùn)算
Sqrt():平方根
Round():四舍五入
Abs():求絕對(duì)值
Random():生成一個(gè)0-1的隨機(jī)數(shù),包括0不包括1
46凌外、String類的常用方法有那些辩尊?
charAt:返回指定索引處的字符
indexOf():返回指定字符的索引
replace():字符串替換
trim():去除字符串兩端空白
split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組
getBytes():返回字符串的byte類型數(shù)組
length():返回字符串長(zhǎng)度
toLowerCase():將字符串轉(zhuǎn)成小寫字母
toUpperCase():將字符串轉(zhuǎn)成大寫字符
substring():截取字符串
format():格式化字符串
equals():字符串比較
47康辑、Java中的繼承是單繼承還是多繼承
Java中既有單繼承摄欲,又有多繼承轿亮。對(duì)于java類來說只能有一個(gè)父類,對(duì)于接口來說可以同時(shí)繼承多個(gè)接口
48胸墙、Super與this表示什么我注?
Super表示當(dāng)前類的父類對(duì)象
This表示當(dāng)前類的對(duì)象
49、普通類與抽象類有什么區(qū)別迟隅?
普通類不能包含抽象方法但骨,抽象類可以包含抽象方法
抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化
50智袭、什么是接口奔缠?為什么需要接口?
接口就是某個(gè)事物對(duì)外提供的一些功能的聲明吼野,是一種特殊的java類校哎,接口彌補(bǔ)了java單繼承的缺點(diǎn)
51、接口有什么特點(diǎn)箫锤?
接口中聲明全是public static final修飾的常量
接口中所有方法都是抽象方法
接口是沒有構(gòu)造方法的
接口也不能直接實(shí)例化
接口可以多繼承
52贬蛙、抽象類和接口的區(qū)別
抽象類:
- 抽象方法雨女,只有行為的概念谚攒,沒有具體的行為實(shí)現(xiàn)。使用abstract關(guān)鍵字修飾氛堕,沒有方法體馏臭。子類必須重寫這些抽象方法。
- 包含抽象方法的類讼稚,一定是抽象類括儒。
- 抽象類只能被繼承,一個(gè)類只能繼承一個(gè)抽象類锐想。
接口:
- 全部的方法都是抽象方法帮寻,屬性都是常量
- 不能實(shí)例化,可以定義變量赠摇。
- 接口變量可以引用具體實(shí)現(xiàn)類的實(shí)例
- 接口只能被實(shí)現(xiàn)固逗,一個(gè)具體類實(shí)現(xiàn)接口,必須實(shí)現(xiàn)全部的抽象方法
- 接口之間可以多實(shí)現(xiàn)
- 一個(gè)具體類可以實(shí)現(xiàn)多個(gè)接口藕帜,實(shí)現(xiàn)多繼承現(xiàn)象
53烫罩、Hashcode的作用
java的集合有兩類,一類是List洽故,還有一類是Set贝攒。前者有序可重復(fù),后者無序不重復(fù)时甚。當(dāng)我們?cè)趕et中插入的時(shí)候怎么判斷是否已經(jīng)存在該 元素呢隘弊,可以通過equals方法哈踱。但是如果元素太多,用這樣的方法就會(huì)比較滿梨熙。
于是有人發(fā)明了哈希算法來提高集合中查找元素的效率嚣鄙。 這種方式將集合分成若干個(gè)存儲(chǔ)區(qū)域,每個(gè)對(duì)象可以計(jì)算出一個(gè)哈希碼串结,可以將 哈希碼分組哑子,每組分別對(duì)應(yīng)某個(gè)存儲(chǔ)區(qū)域,根據(jù)一個(gè)對(duì)象的哈希碼就可以確定該對(duì)象應(yīng)該存儲(chǔ)的那個(gè)區(qū)域肌割。
hashCode方法可以這樣理解:它返回的就是根據(jù)對(duì)象的內(nèi)存地址換算出的一個(gè)值卧蜓。這樣一來,當(dāng)集合要添加新的元素時(shí)把敞,先調(diào)用這個(gè)元素 的hashCode方法弥奸,就一下子能定位到它應(yīng)該放置的物理位置上。如果這個(gè)位置上沒有元素奋早,它就可以直接存儲(chǔ)在這個(gè)位置上盛霎,不用再進(jìn)行 任何比較了;如果這個(gè)位置上已經(jīng)有元素了耽装,就調(diào)用它的equals方法與新元素進(jìn)行比較愤炸,相同的話就不存了,不相同就散列其它的地址掉奄。這 樣一來實(shí)際調(diào)用equals方法的次數(shù)就大大降低了规个,幾乎只需要一兩次。
54姓建、 Java的四種引用诞仓,強(qiáng)弱軟虛
強(qiáng)引用
強(qiáng)引用是平常中使用最多的引用,強(qiáng)引用在程序內(nèi)存不足(OOM)的時(shí)候也不會(huì)被回收速兔,使用方式:
String str = new String("str");
軟引用
軟引用在程序內(nèi)存不足時(shí)墅拭,會(huì)被回收,使用方式
// 注意:wrf這個(gè)引用也是強(qiáng)引用涣狗,它是指向SoftReference這個(gè)對(duì)象的谍婉,
// 這里的軟引用指的是指向new String("str")的引用,也就是SoftReference類中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));
可用場(chǎng)景:創(chuàng)建緩存的時(shí)候屑柔,創(chuàng)建的對(duì)象放進(jìn)緩存中屡萤,當(dāng)內(nèi)存不足時(shí),JVM就會(huì)回收早先創(chuàng)建的對(duì)象掸宛。
弱引用
弱引用就是只要JVM垃圾回收器發(fā)現(xiàn)了它死陆,就會(huì)將之回收,使用方式:
WeakReference<String>wrf=newWeakReference<String>(str);
可用場(chǎng)景:Java源碼中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是措译, 一旦我不需要某個(gè)引用别凤,JVM會(huì)自動(dòng)幫我處理它,這樣我就不需要做其它操作领虹。
虛引用
虛引用的回收機(jī)制跟弱引用差不多规哪,但是它被回收之前,會(huì)被放入ReferenceQueue中塌衰。注意哦诉稍,其它引用是被JVM回收后才被傳入 ReferenceQueue中的。由于這個(gè)機(jī)制最疆,所以虛引用大多被用于引用銷毀前的處理工作杯巨。還有就是,虛引用創(chuàng)建的時(shí)候努酸,必須帶有 ReferenceQueue服爷,使用
例子:
PhantomReference<String>prf=newPhantomReference<String>(new
String("str"),newReferenceQueue<>());
可用場(chǎng)景: 對(duì)象銷毀前的一些操作,比如說資源釋放等获诈。 Object.finalize() 雖然也可以做這類動(dòng)作仍源,但是這個(gè)方式即不安全又低效
上訴所說的幾類引用,都是指對(duì)象本身的引用舔涎,而不是指 Reference 的四個(gè)子類的引用 ( SoftReference 等)笼踩。
55、Java創(chuàng)建對(duì)象有幾種方式终抽?
java中提供了以下四種創(chuàng)建對(duì)象的方式:
- new創(chuàng)建新對(duì)象
- 通過反射機(jī)制
- 采用clone機(jī)制
- 通過序列化機(jī)制
56戳表、有沒有可能兩個(gè)不相等的對(duì)象有相同的hashcode
有可能.在產(chǎn)生hash沖突時(shí),兩個(gè)不相等的對(duì)象就會(huì)有相同的 hashcode 值.當(dāng)hash沖突產(chǎn)生時(shí),一般有以 下幾種方式來處理:
- 拉鏈法:每個(gè)哈希表節(jié)點(diǎn)都有一個(gè)next指針,多個(gè)哈希表節(jié)點(diǎn)可以用next指針構(gòu)成一個(gè)單向鏈表桶至,被分配到同一個(gè)索引上的多個(gè)節(jié)點(diǎn)可以 用這個(gè)單向鏈表進(jìn)行存儲(chǔ).
- 開放定址法:一旦發(fā)生了沖突,就去尋找下一個(gè)空的散列地址,只要散列表足夠大,空的散列地址總能找到,并將記錄存入
- 再哈希:又叫雙哈希法,有多個(gè)不同的Hash函數(shù).當(dāng)發(fā)生沖突時(shí),使用第二個(gè),第三個(gè)….等哈希函數(shù)計(jì)算地址,直到無沖突.
57昼伴、拷貝和淺拷貝的區(qū)別是什么
淺拷貝:
被復(fù)制對(duì)象的所有變量都含有與原來的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來的對(duì)象.換言之,淺拷貝僅僅復(fù)制所考慮的對(duì)象, 而不復(fù)制它所引用的對(duì)象.
深拷貝
被復(fù)制對(duì)象的所有變量都含有與原來的對(duì)象相同的值.而那些引用其他對(duì)象的變量將指向被復(fù)制過的新對(duì)象.而不再是原有的那些被引用的對(duì) 象.換言之.深拷貝把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍.
58、static都有哪些用法
所有的人都知道static關(guān)鍵字這兩個(gè)基本的用法:靜態(tài)變量和靜態(tài)方法.也就是被static所修飾的變量/方法都屬于類的靜態(tài)資源,類實(shí)例所共享. 除了靜態(tài)變量和靜態(tài)方法之外,static也用于靜態(tài)塊,多用于初始化操作:
public calss PreCache{
static{
//執(zhí)行相關(guān)操作
}
}
此外static也多用于修飾內(nèi)部類,此時(shí)稱之為靜態(tài)內(nèi)部類.
最后一種用法就是靜態(tài)導(dǎo)包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用來指定導(dǎo)入某個(gè)類中的靜態(tài)資源,并且不需 要使用類名,可以直接使用資源名,比如:
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));傳統(tǒng)做法
System.out.println(sin(20));
}
}
59镣屹、a=a+b與a+=b有什么區(qū)別嗎?
+= 操作符會(huì)進(jìn)行隱式自動(dòng)類型轉(zhuǎn)換,此處a+=b隱式的將加操作的結(jié)果類型強(qiáng)制轉(zhuǎn)換為持有結(jié)果的類型, 而a=a+b則不會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換. 如:
byte a = 127;
byte b = 127;
b = a + b; // 報(bào)編譯錯(cuò)誤:cannot convert from int to byte
b += a;
以下代碼是否有錯(cuò),有的話怎么改圃郊?
short s1= 1;
s1 = s1 + 1;
有錯(cuò)誤.short類型在進(jìn)行運(yùn)算時(shí)會(huì)自動(dòng)提升為int類型,也就是說 s1+1 的運(yùn)算結(jié)果是int類型,而s1是short 類型,此時(shí)編譯器會(huì)報(bào)錯(cuò). 正確寫法:
short s1= 1;
s1 += 1;
+=操作符會(huì)對(duì)右邊的表達(dá)式結(jié)果強(qiáng)轉(zhuǎn)匹配左邊的數(shù)據(jù)類型,所以沒錯(cuò).
60、final女蜈、finalize()持舆、finally
性質(zhì)不同
- final為關(guān)鍵字;
- finalize()為方法伪窖;
- finally為區(qū)塊標(biāo)志逸寓,用于try語句中;
作用
- final為用于標(biāo)識(shí)常量的關(guān)鍵字覆山,final標(biāo)識(shí)的關(guān)鍵字存儲(chǔ)在常量池中(在這里final常量的具體用法將在下面進(jìn)行介紹)竹伸;
- finalize()方法在Object中進(jìn)行了定義,用于在對(duì)象“消失”時(shí),由JVM進(jìn)行調(diào)用用于對(duì)對(duì)象進(jìn)行垃圾回收勋篓,類似于C++中的析構(gòu)函數(shù)吧享;用 戶自定義時(shí),用于釋放對(duì)象占用的資源(比如進(jìn)行I/0操作)譬嚣;
- finally{}用于標(biāo)識(shí)代碼塊钢颂,與try{}進(jìn)行配合,不論try中的代碼執(zhí)行完或沒有執(zhí)行完(這里指有異常)拜银,該代碼塊之中的程序必定會(huì)進(jìn)行