1. 程式人生 > >Java日常刷題第七天

Java日常刷題第七天

選擇題

1.在類Tester中定義方法如下,
public double max(int x, int y) { // 省略 }

則在該類中定義如下哪個方法頭是對上述方法的過載(Overload)?(B)

A.public int max(int a, int b) {}
B.public int max(double a, double b) {}
C.public double max(int x, int y) {}
D.private double max(int a, int b) {}
解析:過載:OverLoad
(1) 同一個類中,方法名相同,引數列表不同的2個或多個方法構成方法的過載

(2 ) 引數列表不同指引數的型別,引數的個數,引數的順序至少一項不同

(3 ) 方法的返回值型別,方法的修飾符可以不同。
2.應用程式的main方法中有以下語句,則輸出的結果(A )
String s1=new String( ” xyz ” );
String s2=new String( ” xyz ” );
Boolean b1=s1.equals(s2);
Boolean b2=(s1==s2);
System .out.print(b1+ ” ” +b2);
A.true false
B.false true
C.true true
D.false false
解析:equals比較的值,==比較的地址

詳細:
String s1=new String( ” xyz ” ); //建立了String型別的內容為xyz的s1物件
String s2=new String( ” xyz ” ); //建立了String型別的內容為xyz的s2物件
Boolean b1=s1.equals(s2); //比較s1物件和s2物件的內容相等,返回true。
Boolean b2=(s1==s2); //比較s1和s2兩個物件的儲存地址是否相等,明顯兩者分別儲存在不同的地址,所以返回:false。
故答案為:true false
3.執行以下程式後的輸出結果是(D)

public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer(“A”);
StringBuffer b = new StringBuffer(“B”);
operator(a, b);
System.out.println(a + “,” + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
A。A,A
B。A,B
C。B,B
D。AB,B
解析:
Java引數,不管是原始型別還是引用型別,傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。 如果引數型別是原始型別,那麼傳過來的就是這個引數的一個副本,也就是這個原始引數的值,這個跟之前所談的傳值是一樣的。如果在函式中改變了副本的 值不會改變原始的值. 如果引數型別是引用型別,那麼傳過來的就是這個引用引數的副本,這個副本存放的是引數的地址。如果在函式中沒有改變這個副本的地址,而是改變了地址中的 值,那麼在函式內的改變會影響到傳入的引數。如果在函式中改變了副本的地址,如new一個,那麼副本就指向了一個新的地址,此時傳入的引數還是指向原來的 地址,所以不會改變引數的值。
4.Given the following code:

public class Test {
    private static int j = 0;
    private static Boolean methodB(int k) {
        j += k;
        return true;
    }
 
    public static void methodA(int i) {
        boolean b;
        b = i < 10 | methodB(4);
        b = i < 10 || methodB(8);
 
    }
 
    public static void main(String args[]) {
        methodA(0);
        System.out.println(j);
    }}

What is the result?(B)
A.The program prints”0”
B.The program prints”4”
C.The program prints”8”
D.The program prints”12”
E.The code does not complete.
解析:這道題主要考的是"|“與”||"的區別
用法:condition 1 | condition 2、condition 1 || condition 2
"|"是按位或:先判斷條件1,不管條件1是否可以決定結果(這裡決定結果為true),都會執行條件2
"||"是邏輯或:先判斷條件1,如果條件1可以決定結果(這裡決定結果為true),那麼就不會執行條件2

//i=0, i<10為true,但是依然執行methodB(4),之後 j=4
 
b = i < 10| methodB(4);
 
//i=0, i<10位true,可以決定結果,所以不會執行methodB(8),j依然=4
 
b = i < 10|| methodB(8);

5.下面的程式段建立了BufferedReader類的物件in,以便讀取本機c盤my資料夾下的檔案1.txt。File建構函式中正確的路徑和檔名的表示是( C )。

File f = new File( 填程式碼處);
file =new FileReader(f);
in=new BufferedReader(file);

A。"./1.txt"
B。"…/my/1.txt"
C。“c:\my\1.txt”
D。“c:\ my\1.txt”
解析:./表示當前專案的路徑
…/表示當前目錄的父目錄路徑
碟符:\name\file 或者 碟符:/name/file
表示物理路徑
6.

public class Test
{
    public int x;
    public static void main(String []args)
    {
        System. out. println("Value is" + x);
    }
}

對於上面這段程式碼,以下說法正確的是:C
A。程式會打出 “Value is 0”
B。程式會丟擲 NullPointerException
C。非靜態變數不能夠被靜態方法引用
D。編譯器會丟擲 "possible reference before assignment"的錯誤
解析:非靜態變數只有例項化之後才能被靜態方法引用。
D中意思為可能丟擲未賦值前引用的錯誤。就算給x初始時有值,也沒法直接在靜態方法中直接呼叫非靜態變數。
7.執行以下程式,最終輸出可能是:(C)

在這裡插入圖片描述

“ * ” 代表空格

A。010 2123012 3434
B。01201 340124 2334
C。0012314 01223344**
D。12345 12345 12345
解析:
執行緒內順序執行,那麼如果出現空格,必定說明有一個執行緒完整執行了for迴圈。 我的解題思路稍微麻煩了,核心思想還是:執行緒內有序,執行緒間交叉。就是首先輕鬆排除d,將abc三個選項寫在紙上,開始找01234這種順序,如果能找出三條符合這個順序的即正確,通過驗算,前兩條中不能找出三條順序的01234,c可以。
8.下列哪個選項是Java偵錯程式?如果編譯器返回程式程式碼的錯誤,可以用它對程式進行除錯。(C)
A。java.exe
B。javadoc.exe
C。jdb.exe
D。javaprof.exe
解析:javac.exe是編譯.java檔案
java.exe是執行編譯好的.class檔案
javadoc.exe是生成Java說明文件
jdb.exe是Java偵錯程式
javaprof.exe是剖析工具
9.面向物件的三個基本元素是什麼?(ABD)
A。封裝
B。繼承
C。過載
D。多型
解析:三個基本元素:

  1. 封裝: 封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。
  2. 繼承: 繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
  3. 多型: 多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。

C++ 中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有“多種形態”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的程式碼來實現可變的演算法。比如:模板技術, RTTI 技術,虛擬函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。

五個基本原則:
單一職責原則(Single-Resposibility Principle):一個類,最好只做一件事,只有一個引起它的變化。單一職責原則可以看做是低耦合、高內聚在面向物件原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。
開放封閉原則(Open-Closed principle):軟體實體應該是可擴充套件的,而不可修改的。也就是,對擴充套件開放,對修改封閉的。
Liskov替換原則(Liskov-Substituion Principle):子類必須能夠替換其基類。這一思想體現為對繼承機制的約束規範,只有子類能夠替換基類時,才能保證系統在執行期內識別子類,這是保證繼承複用的基礎。
依賴倒置原則(Dependecy-Inversion Principle):依賴於抽象。具體而言就是高層模組不依賴於底層模組,二者都同依賴於抽象;抽象不依賴於具體,具體依賴於抽象。
介面隔離原則(Interface-Segregation Principle):使用多個小的專門的介面,而不要使用一個大的總介面。
10.jvm中垃圾回收分為scanvenge gc和full GC,其中full GC觸發的條件可能有哪些(CDE)
A。棧空間滿
B。年輕代空間滿
C。老年代滿
D。持久代滿
E。System.gc()
解析:
Full GC是對整個堆進行整理,包括新生代、舊生代和持久代,速度比Scavenge GC慢,觸發的條件有: (1).年老代被寫滿
(2).持久代被寫滿
( 3).顯示呼叫System.GC
( 4).上一個GC後個heap的各域分配策略動態變化。

程式設計題

把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
程式碼:

public int GetUglyNumber_Solution(int index) {
        if(index <= 0)
            return 0;
        if(index == 1)
            return 1;
        int t2 = 0, t3 = 0, t5 = 0;
        int [] res = new int[index];
        res[0] = 1;
        for(int i = 1; i<index; i++){
            res[i] = Math.min(res[t2]*2, Math.min(res[t3]*3, res[t5]*5));
            if(res[i] == res[t2]*2) t2++;
            if(res[i] == res[t3]*3) t3++;
            if(res[i] == res[t5]*5) t5++;
        }
        return res[index-1];
    }