面向对象习题(附带解析)
生活随笔
收集整理的這篇文章主要介紹了
面向对象习题(附带解析)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下代碼執行后輸出結果為( A)
解析:
靜態域:用staitc聲明,jvm加載類時執行,僅執行一次 構造代碼塊:類中直接用{}定義,每一次創建對象時執行。 執行順序優先級:靜態域,main(),構造代碼塊,構造方法。 1 靜態域 :首先執行,第一個靜態域是一個靜態變量 public static Test t1 = new Test(); 創建了Test 對象,會執行構造塊代碼,所以輸出blockA。然后執行第二個靜態域(即靜態代碼塊)輸出blockB。 2 main():Test t2 = new Test()執行,創建Test類對象,只會執行構造代碼塊(創建對象時執行),輸出blockA。 3 構造代碼塊只會在創建對象時執行,沒創建任何對象了,所以沒輸出 4 構造函數:使用默認構造函數,沒任何輸出2.根據以下代碼段,執行new Child("John", 10); 要使數據域data得到10,則子類空白處應該填寫
(D )。
class Parent {private int data;Parent(){}public Parent(int d){ data = d; } } class Child extends Parent{String name;Child(){}public Child(String s, int d){___________________name = s;} } A. data = d; B. super.data = d; C. Parent(d); D. super(d);解析:
1.子父類存在同名成員時,子類中默認訪問子類的成員,可通過super指定訪問父類的成員,格式:super.xx (注:xx是成員名);2.創建子類對象時,默認會調用父類的無參構造方法,可通過super指定調用父類其他構造方法,格式:super(yy) (注:yy是父類構造方法需要傳遞的參數)3. 下面代碼的輸出是什么?(A)
public class Base{private String baseName = "base";public Base(){callName();}public void callName(){System. out. println(baseName);} ?static class Sub extends Base{private String baseName = "sub";public void callName(){System. out. println (baseName) ;}}public static void main(String[] args){Base b = new Sub();} } A. null B. sub C. base解析:
Base b = new Sub();父類引用指向子類實例對象,向上轉型 向上轉型后,可以調用父類派生給子類的方法和子類重寫父類的方法,但不能調用子類獨有的方法 ?java的初始化順序,先初始化父類的成員變量,再初始化父類的構造函數,因為父類里面的構造函數里面的方法在子類中已經進行了重寫所以會調用子類的這個方法,但是子類成員變量還沒初始化,所以其為null4.下面這段程序的輸出結果是(A)
public class Main {public static void main(String[] args) {split(12);}public static int split(int number) {if (number > 1) {if (number % 2 != 0) System.out.print(split((number + 1) / 2));System.out.print(split(number / 2));}return number;} } A. 12136 B. 63121 C. 61213 D. 11236解析:
就是if那里判斷條件,兩條中間沒有else分隔,格式也不規范,所以不管是否滿足條件,第二個輸出語句都會執行!!!!先進后出,所以遞歸先執行遞歸到最深處,在棧頂的方法。 sout split(6) = {sout split(3) = {sout split(2) = {sout split(1)return 2}sout split(1)return 3;}return 6 }5.以下代碼輸出的是:(A)
public class SendValue{public String str="6";public static void main(String[] args) {SendValue sv=new SendValue();sv.change(sv.str);System.out.println(sv.str);}public void change(String str) {str="10";} } A. 6 B. 10 C. 都不對 D. 16解析:
對于基本數據類型數據的傳遞,傳遞的是值,所以方法內的參數的改變不會改變變量的值; 對于引用類型數據的傳遞,傳遞的也是值(地址值),即對象引用的副本,那么在方法內對參數內容的改變只能是改變該引用的副本所指向的對象的內容; 所以本題中,方法調用sv.change(sv.str);使得引用副本指向了其他引用,這樣沒有改變原引用sv.str,它指向對象的還是"6"6.指出下列程序的結果:(B)
public class Example{String str=new String("tarena");char[]ch={'a','b','c'};public static void main(String args[]){Example ex=new Example();ex.change(ex.str,ex.ch);System.out.print(ex.str+" and ");System.out.print(ex.ch);}public void change(String str,char ch[]){//引用類型變量,傳遞的是地址,屬于引用傳遞。str="test ok";ch[0]='g';} } A. tarena and abc B. tarena and gbc C. test ok and abc D. test ok and gbc解析:
當我們new一個字符串,給它賦值之后,那么當前對象的值就固定了,永遠不會改變。比如String str=new String("tarena"),那么str的值就是test,這是因為在String源碼當中是用char數組來按順序存儲字符串中的每一個字符的,并且這個char數組是用final修飾的,這意味著一旦我們給字符串賦值之后,這個對象的值就永遠不會改變。可是當我們在一個類當中的某個方法里面,給這個對象str賦值了一個新的字符串,它這時候的值是多少呢?比如這時str="good",str的值就是good,(你可以在這個方法里面寫輸出語句,輸出這個引用,就知道怎么回事了)可不是說引用的值不可以改變么?這里改變的不是引用的值,而是引用str指向的常量不一樣了而已,而這個引用的生命周期和當前方法的一樣的,也就是方法結束,引用被殺死,也結束了,那么它剛才指向good的這個引用,就結束了,所以在這個方法結束之后,再輸出引用str的值,自然就是引用str之前指向的值了,也就是tarena。但為什么char數組可改變???因為字符對象的指向的值被新的字符對象由a改成了g,所以改變了char數組的值。7.以下程序的執行結果是:(A)
public class Test{static boolean foo(char c){System.out.print(c);return true;}public static void main( String[] argv ){int i = 0;for ( foo('A'); foo('B') && (i < 2); foo('C')){i++ ;foo('D');}} } A. ABDCBDCB B. ABCDABCD C. 編譯時出錯 D. 運行時拋出異常8.下面代碼將輸出什么內容:(B)
public class SystemUtil{public static boolean isAdmin(String userId){return userId.toLowerCase()=="admin";}public static void main(String[] args){System.out.println(isAdmin("Admin"));} } A. true B. false C. 1 D. 編譯錯誤解析:
在源碼中 toLowerCase 是重新 new String()所以為 == 是比較對象是否是同一個對象,所以為 false 。9.下面有關java final的基本規則,描述錯誤的是?(B)
A. final修飾的類不能被繼承 B. final修飾的成員變量只允許賦值一次,且只能在類方法賦值 C. final修飾的局部變量即為常量,只能賦值一次。 D. final修飾的方法不允許被子類覆蓋解析:
final修飾的方法,不允許被子類覆蓋。final修飾的類,不能被繼承。final修飾的變量,不能改變值。final修飾的引用類型,不能再指向別的東西,但是可以改變其中的內容。10.關于static說法不正確的是( D)
A. 可以直接用類名來訪問類中靜態方法(public權限) B. 靜態塊僅在類加載時執行一次 C. static方法中不能有用this調用的方法 D. 不可以用對象名來訪問類中的靜態方法(public權限)解析:
靜態方法屬于類本身,可以使用類名調用。 ?靜態塊只執行一次。 ?static塊和方法不能出現this和super ?可以的,實例對象也可以調用靜態方法總結
以上是生活随笔為你收集整理的面向对象习题(附带解析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅机器学习笔记第14周_生成式对抗网
- 下一篇: lua游戏脚本开发之叉叉集成开发环境使用