Java面試寶典 1.13~1.31【2020.5 Beta版】
<a name="14cb060b"></a>
1.Java基礎(chǔ)
<a name="22b8b366"></a>
1.13 靜態(tài)變量與實(shí)例變量的區(qū)別甚亭?
靜態(tài)變量 | 實(shí)例變量 | |
---|---|---|
定義 | 使用static關(guān)鍵字聲明的 | 實(shí)例變量在類中聲明膊夹,但是在方法层释,構(gòu)造函數(shù)或其他塊之外 |
初始化 | 屬于類截驮,只要加載了類的字節(jié)碼笑陈,就會被分配空間 | 必須創(chuàng)建實(shí)例對象,才會被分配空間 |
加載次數(shù) | 初始化加載一次 | 每創(chuàng)建一次對象加載一次 |
<a name="3360eeec"></a>
1.14 是否可以從一個(gè)static方法內(nèi)部發(fā)出對非static方法的調(diào)用?
<br />不可以葵袭,static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對象涵妥,非static方法的調(diào)用需要?jiǎng)?chuàng)建實(shí)例,那在這個(gè)時(shí)刻坡锡,就像是你想找對象秀恩愛蓬网,你對象還沒出生,這不扯呢<br />
<a name="6c5ca606"></a>
1.15 Math.round(1.5)等于多少鹉勒?Math.round(-1.5)又等于多少帆锋?
// Math.round 返回一個(gè)四舍五入的值
Math.round(1.5) = 2
Math.round(-1.5) = -1
//
Math.ceil() 向上取整
Math.floor() 向下取整
<a name="74f218ae"></a>
1.16 下面的代碼有什么不妥之處?
// 1
if(str.equals("test")){}
// 2
System.out.println(0.1+0.2);
<br />第一個(gè) str 為 null的話會拋出空指針異常禽额,所以改為 "test".equals(str)<br />第二個(gè)會輸出0.30000000000000004锯厢,改成<br />
System.out.println(new BigDecimal(String.valueOf(0.1)).add(new BigDecimal(String.valueOf(0.2))));
<a name="76fb7dfa"></a>
1.17 java中作用域 public,protected,private和默認(rèn)不寫時(shí)的區(qū)別
作用域 | 說明 |
---|---|
public | 可以被任何類訪問 |
protected | 可以被同一包中的所有類訪問,被所有子類訪問绵疲,子類沒有在同一包中也可以訪問 |
private | 只能夠被當(dāng)前類的方法訪問 |
缺省 | 無訪問修飾符哲鸳,可以被同一包中的所有類訪問臣疑,如果子類沒有在同一個(gè)包中盔憨,也不能訪問 |
<a name="2553c675"></a>
1.18 重載與重寫的區(qū)別
<br />很多,面試的時(shí)候就撿簡要的說<br />
- 重載在一個(gè)類中讯沈,重寫發(fā)生在父子類
- 重載是可以在一個(gè)類中有多個(gè)重名但參數(shù)列表不同郁岩,參數(shù)列表要個(gè)數(shù)或數(shù)據(jù)類型不同婿奔,重寫則返回值和形參都不能改變
- 重寫的方法只能比父類拋出更少的異常,并且訪問限制符也只能比父類大<br />
ps: 參數(shù)相同问慎,但返回值相同萍摊,那不叫重載,錯(cuò)誤寫法
<br />基本上回答這些就OK<br />擴(kuò)展:方法的重載與重寫都是實(shí)現(xiàn)多態(tài)的方式如叼,區(qū)別是前者是編譯時(shí)的多態(tài)性冰木,后者是運(yùn)行時(shí)的多態(tài)性,重寫遵循里氏代換原則笼恰,就是子類可以擴(kuò)展父類的功能踊沸,但不能改變父類原有的功能<br />
<a name="badee970"></a>
1.19 Integer與int的區(qū)別
- Integer是int的包裝類,可以為 null 值
- int是8種原始數(shù)據(jù)類型之一<br />
8種原始數(shù)據(jù)類型與其包裝類型
原始 | 包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
boolean | Boolean |
char | Character |
float | Float |
double | Double |
1.20 構(gòu)造器Constructor是否可被override?
<br />構(gòu)造器Constructor不能被繼承社证,因此不能重寫Override逼龟,但可以被重載Overload<br />
<a name="bdd0c610"></a>
1.21 java的接口可以繼承接口嗎?接口中可以定義靜態(tài)或者默認(rèn)方法嗎追葡?
<br />java的接口可以繼承接口腺律,第二個(gè)在jdk8之后也支持了,可以寫靜態(tài)方法體宜肉,但是默認(rèn)方法要用default修飾符<br />
public interface TestInterface implements A,B,C{
static void staticMethod() {
System.out.println("static method");
}
default void defaultMethod() {
System.out.println("default method");
}
}
<a name="dcf93c57"></a>
1.22 抽象類可以實(shí)現(xiàn)接口嗎匀钧?抽象類是否可以繼承具體類?抽象類中是否可以有靜態(tài)main方法谬返?
- 抽象類可以實(shí)現(xiàn)接口
- 抽象類可以繼承具體類
- 抽象類中可以有靜態(tài)main方法
<br />抽象類可以實(shí)現(xiàn)接口榴捡,可以不必須實(shí)現(xiàn)接口中的所有方法<br />
<br />抽象類與普通類的區(qū)別<br />
- 前者不能實(shí)例化
- 前者允許存在抽象方法
- 后者實(shí)現(xiàn)接口必須要實(shí)現(xiàn)接口中所有方法
<a name="09764d9b"></a>
1.23 clone()有什么作用?
<br />super.clone()<br />拷貝使用<br />
package erdan.demo;
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
Demo demo = new Demo();
demo.a = 1;
demo.b = 2;
Demo demo2 = (Demo) demo.clone();
demo2.a = 100;
System.out.println(demo.a + " " + demo.b);
System.out.println(demo2.a + " " + demo2.b);
}
static class Demo implements Cloneable {
int a;
int b;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
}
<a name="4e1b36ed"></a>
1.24 面向?qū)ο蟮奶卣?/h3>
特征 | 總結(jié) |
---|---|
封裝 | 隱藏對象的屬性與實(shí)現(xiàn)細(xì)節(jié)朱浴,對外提供公開的訪問接口 |
抽象 | 將一類對象共同特征總結(jié)出來構(gòu)造類的過程 |
繼承 | 從已有類得到繼承信息創(chuàng)建新類的過程 |
多態(tài) | 指允許不同子類型的對象對同一消息作出的不同響應(yīng) |
<a name="03cf2641"></a>
1.25 Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么吊圾?
<br />答:父類中有方法 fun(),子類B與C分別繼承與重寫了fun()方法,當(dāng)創(chuàng)建一個(gè) A a = new B()時(shí)翰蠢,a.fun()調(diào)用的是B中的fun(),假若是new C(),那么調(diào)用的就是C中的fun()方法项乒,怎么判斷使用的是哪個(gè)類的fun(),就是動(dòng)態(tài)綁定,這個(gè)現(xiàn)象梁沧,就是多態(tài)<br />
1.26 abstract class 與 interface 有什么區(qū)別檀何?
- abstract class可以有構(gòu)造方法,而interface不行
- 單繼承(抽象類)廷支,多實(shí)現(xiàn)(接口)
- 方法類型:接口只能有抽象方法频鉴。抽象類可以具有抽象和非抽象方法稿茉。從Java 8開始恨豁,接口還可以具有默認(rèn)方法和靜態(tài)方法。
- 最終變量:在Java接口中聲明的變量默認(rèn)為final命爬,抽象類可能包含非 final 變量施敢。
- 變量類型:抽象類可以具有 final周荐,非 final狭莱,static和非 static 變量。接口只有 static 變量和 final 變量概作。
- 實(shí)現(xiàn):抽象類可以提供接口的實(shí)現(xiàn)腋妙。接口無法提供抽象類的實(shí)現(xiàn)。
- 繼承與抽象:可以使用關(guān)鍵字“ implements”來實(shí)現(xiàn)Java接口讯榕,而可以使用關(guān)鍵字“ extends”來擴(kuò)展抽象類骤素。
- 數(shù)據(jù)成員的可訪問性:默認(rèn)情況下,Java接口的成員是公共的愚屁。Java抽象類可以具有private谆甜,protected修飾的類成員
- 接口是用來約束類的,抽象類基本是用來代碼復(fù)用的
1.30 抽象的方法可以是靜態(tài)的嗎?abstract與synchronized可以一起使用嗎集绰?
<br />用static聲明方法表明這個(gè)方法在不生成類的實(shí)例時(shí)可直接被類調(diào)用规辱,而abstract方法不能被調(diào)用,所以不能為靜態(tài)的栽燕。<br />synchronized作用在具體的方法上才有意義罕袋,所以不行<br />
1.31 什么是內(nèi)部類?Static Nested Class 與 inner class 不同點(diǎn)碍岔?
<br />內(nèi)部類顧名思義就是在類內(nèi)部的一個(gè)類浴讯,內(nèi)部類中不能定義靜態(tài)成員<br />Static Nested Class 靜態(tài)內(nèi)部類,不依賴于外部實(shí)例被實(shí)例化蔼啦,通常的內(nèi)部類需要在外部實(shí)例化后才能實(shí)例化榆纽。