1. 程式人生 > 其它 >自用java面試寶典(無水題)-歡迎指導糾錯-day02

自用java面試寶典(無水題)-歡迎指導糾錯-day02

技術標籤:java面試寶典(無水題)歡迎批評指正java

5.抽象類和介面的區別

相同點:
① 抽象類和介面都包含抽象方法,以供其他類繼承或實現
② 他們兩者本身均不可例項化,如果不繼承或實現的話,只能使用匿名類的方式重寫內部所有的靜態方法,才能使用
③ 介面或抽象類往往位於繼承樹的頂端。

不同點:
① 抽象類中可以存在普通的成員變數,而介面中的變數必須是static final修飾的(可以不寫,預設新增),而且必須被初始化,相當於常量,也可以說介面中沒有變數。
② 抽象類中可以有抽象方法,也可以有非抽象方法,二者可以共存。介面在jdk1.8之前是不能有非抽象方法的,只能有抽象方法,jdk1.8之後可以定義預設方法(使用default關鍵字修飾)和靜態方法;

注意:介面中的抽象方法可以省略public abstract,抽象方法不能
③ 抽象類有構造方法,介面中沒有構造方法。
④ 抽象類和普通類一樣,是單繼承的,而介面可以同時實現多個父介面,同樣的,一個類可以實現多個介面,但不能同時繼承多個抽象類;
追問:兩者應該如何選擇?分別在什麼情況下使用?

根據二者的不同之處,僅需要定義抽象方法而不需要其他額外的具體方法或變數時,使用介面,介面只負責定義“做什麼”,而不管具體怎麼做。反之如果需要複用程式碼或使用屬性,使用抽象類。

注意:當一個類實現帶有預設方法的介面時,可以直接繼承到該介面中的預設方法,如果實現的多個介面中有同名的預設方法,則需要重寫該預設方法或在實現類中手動指定需要哪個介面中的預設方法。(interface.super.defaultMethod())

6.java中的元資料和元註解的理解,說說有幾種元註解?

元資料:對現有資料修飾的資料。如:String name = “java”;
其中最重要的資料肯定是“java”,它是真實的資料,而“String name”可以看作是對真實資料的修飾,分別代表真實資料的“型別”和“名稱”,它們就是元資料。

元註解:對現有註解進行修飾的註解。
使用註解可以代替繁雜的配置檔案,簡化開發。java中提供了4中元註解,分別是:@Retention @Documented @Inherited

① 元註解 @Retention
該註解用於指定所修飾註解的生命週期,也叫保留策略,即定義了該註解被保留的時間長短。原始碼如下:

1.public @interface Retention {  
2.    RetentionPolicy value1();  
3.}  
4.public enum RetentionPolicy {  
5.    SOURCE,  
6.    CLASS,  
7.    RUNTIME  
8.} 

其中,SOURCE表示在原始檔中有效(即原始檔保留);CLASS表示在class檔案中有效(即class保留,無指定時預設為CLASS);RUNTIME表示在執行時有效(即執行時保留)。例如某註解被@Retention(RetentionPolicy.RUNTIME)標註表示該註解在執行時有效。

② 元註解 @Target
該註解用於指定所修飾註解的物件範圍,即該被修飾註解能用於修飾哪些程式元素(包,類,方法等)。原始碼如下:

1.public @interface Target {  
2.    ElementType[] value();  
3.}  
4.
5.public enum ElementType {  
6.    TYPE,  
7.    FIELD,  
8.    METHOD,  
9.    PARAMETER,  
10.   CONSTRUCTOR,  
11.   LOCAL_VARIABLE,  
12.   ANNOTATION_TYPE,  
13.   PACKAGE,  
14.   TYPE_PARAMETER,  
15.   TYPE_USE  
16.}  

列舉類中的元素分別指定了所屬範圍:
在這裡插入圖片描述
③ 元註解 @Documented
該註解表示所修飾的註解在被javadoc解析時,保留下來。如@Deprecated.
Documented是一個標記註解,沒有成員。原始碼如下:

1.public @interface Documented {}  

④ 元註解 @Inherited
該註解也是一個標記註解,它闡述了某個被標記的型別是被繼承的。如果一個使用了該註解修飾的註解型別被用於一個class,則這個註解將用於該class的子類,原始碼如下:

1.public @interface Inherited {}  

7.java中如何自定義註解?
可以參照@suppressWarings來定義註解:
① 自定義註解自動繼承了java.lang.annotation.Annotation介面
② 註解宣告只能為:@interface 不能是class, enum 等。但是它和interface並沒有關係。 如:

1.public @interface MyAnn {} 

③ 內部定義成員,通常使用value來表示,型別可以是八種基本資料型別(String,Class,enum,Annotation)注意它不是方法,使用改註解時必須給成員變數賦值,除非有預設值(如value1)。如果沒有成員變數,這樣的註解成為“標記”,如@Override註解

1.public @interface MyAnn {  
2.    String value();  
3.    int value1() default 10;  
4.}  
5.//使用自定義註解  
6.@MyAnn(value=”hello”)  
7.Public class MyClass {  
8.}  

說明:自定義註解的時候,value就是屬性,只是看著是一個方法,但我們稱它為屬性。當為註解指定屬性後,那麼在使用註解時就必須要給屬性賦值了。
④ 自動註解必須配上註解的資訊處理流程才有意義,多存在於框架需要結合反射一起使用。

8.&和&&的區別和聯絡,|和||的區別和聯絡
他們的區別和聯絡類似,這裡僅以&和&&舉例。

相同點:當操作符左右兩邊的運算元或表示式結果為布林型別時,&和&&都是邏輯與運算子。

不同點:
①都作邏輯與運算子時,&沒有短路,兩邊都會計算,&&有短路,當左邊為False時,右邊不計算
②當操作符兩邊不是布林型別時,&可以做位運算,&&不可以。

參考:
http://www.bjsxt.com/javamianshiti.html
https://blog.csdn.net/a1436445152/article/details/94010198
https://www.nowcoder.com/