1. 程式人生 > >刷幾道Java面試題

刷幾道Java面試題

1.super與this的區別?

this當前類的物件,super父類物件。
在子類訪問父類的成員和行為,必須受類繼承規則的約束。
而this代表當前物件,所有資源的可以訪問。
在建構函式中,如果第一行沒有寫super(),編譯器會自動插入,但是如果父類沒有不帶引數的建構函式,或者這個引數被私有化了(用private修飾),此時你必須加入對父類的例項化構造。而this就沒有這個要求,因為它本身就進行例項化的構造。
而在方法中super和this使用的方法就差不多了,只不過super要考慮是否能訪問父類的資源。
這裡寫圖片描述
這裡寫圖片描述

2.作用域public, protected,private,以及不寫時的區別?

public:不同包,同一包,類內都可用
private:類內可用
protected:不同包的子類,同一包,類內都可用
不寫時:同一包,類內都可用

3.用程式碼輸出如下圖形

*****
****
***
**
*

解答如下,用C寫的

#include<stdio.h>
int main(){
        for(int i = 0; i < 5; i++){
                for(int j = 5; j > i ; j--){
                        printf("*");
                }
                printf
("\n"); } }

這裡寫圖片描述

4.Java的事件委託機制和垃圾回收機制

java事件委託機制:一個源產生一個事件並將它送到一個或多個監聽器那裡。在這種方案中,監聽器簡單的等待,直到它收到一個事件。一旦事件被接受,監聽器將處理這個事件,然後返回。
垃圾回收機制:垃圾收集是將分配給物件但不再使用的記憶體回收或釋放的過程。如果一個物件沒有指向它的引用或者其賦值為null,則此物件適合進行垃圾回收。

5.在java中,如何跳出當前的多重巢狀迴圈?

用break; return跳出

6.什麼是java序列化,如何實現java序列化?(寫一個例項)

序列化就是一種處理物件流的機制,所謂物件流也就是將物件的內容流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。

import java.io.*;
import java.util.Date;
public class SerializableTest{
        public static void main(String[] args) throws Exception{
                ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/Users/apple/Documents/JavaC/Demo.obj"));
                Demo demo = new Demo("序列化例子","2017年9月27日","wtz");
                out.writeObject(demo);
                out.close();
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("/Users/apple/Documents/JavaC/Demo.obj"));
                Demo inDemo = (Demo)in.readObject();
                System.out.println("demo = " + "(" + inDemo + ")");
                in.close();
        }
}
class Demo implements Serializable {
        private String name;
        private String time;
        private String author;
        public Demo(String name,String time,String author){
                this.name = name;
                this.time = time;
                this.author = author;
        }
        public String toString(){
                return "name=" + name + ",time=" + time + ",author=" + author;
        }
}

這裡寫圖片描述
這裡寫圖片描述

7.一個”.java”原始檔中是否可以包含多個類(不是內部類)?有什麼限制?

可以。如果這個類的修飾符是public,其類名與檔名必須相同。

8.Overload和Override的區別

Override(重寫,覆蓋)
1.方法名,引數,返回值相同
2.子類方法不能縮小父類方法的訪問許可權
3.子類方法不能丟擲比父類方法更多的異常(但子類方法可以不丟擲異常)
4.存在於父類和子類之間
5.方法被定義為final不能被重寫

Overload(過載,過載)
1.引數型別,個數,順序至少有一個不相同
2.不能過載只有返回值不同的方法名,如圖
這裡寫圖片描述
這裡寫圖片描述
3.存在於父類和子類,同類中

方法的重寫(Overriding)和過載(Overloading)是java多型性的不同表現。

重寫(Overriding)是父類與子類之間多型性的一種表現,而過載(Overriding)是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫(Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被“遮蔽”了。

如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別或有不同的引數次序,則稱為方法的過載(Overloading)。不能通過訪問許可權,返回型別,丟擲的異常進行過載。

1.Override的特點
1.覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果
2.覆蓋的方法返回值必須和被覆蓋的方法的返回值一致
3.覆蓋的方法所丟擲的異常必須和被覆蓋的方法所丟擲的異常一致,或者是其子類
4.被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋

2.Overload的特定
1.在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,統一方法內的及格引數型別必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int))
2.不能通過訪問許可權,返回型別,丟擲的異常進行過載
3.方法的異常型別和數目不會對過載造成影響
4.對於繼承來說,如果某一方法在父類中是訪問許可權是private,那麼就不能在子類中對其進行過載,如果定義的話,也只是定義了一個新方法,而不會達到過載的效果

過載可以改變返回值型別,但是如果只是返回值型別不一樣是算不上過載的。過載的判斷條件還是根據引數來,只不過是說過載的函式可以返回值不一樣,就是說過載可以決定返回值型別,但是返回值型別不能決定過載。