【291天】我愛刷題系列050(2017.11.23)

叨叨兩句

  1. 果真靠譜,哈哈java

  2. 不去見作的好的怎麼作,你就永遠不知道本身還有哪些地方能夠提升正則表達式

牛客網——java專項練習030

1

關於抽象類和接口敘述正確的是? ( )算法

正確答案: D數組

  1. 抽象類和接口都能實例化的函數

  2. 抽象類不能實現接口翻譯

  3. 抽象類方法的訪問權限默認都是publiccode

  4. 接口方法的訪問權限默認都是public對象

抽象類
特色: 
1.抽象類中能夠構造方法 
2.抽象類中能夠存在普通屬性,方法,靜態屬性和方法。 
3.抽象類中能夠存在抽象方法。 
4.若是一個類中有一個抽象方法,那麼當前類必定是抽象類;抽象類中不必定有抽象方法。 
5.抽象類中的抽象方法,須要有子類實現,若是子類不實現,則子類也須要定義爲抽象的。 
6,抽象類不能被實例化,抽象類和抽象方法必須被abstract修飾
關鍵字使用注意: 
抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問修飾符修飾。
接口
1.在接口中只有方法的聲明,沒有方法體。 
2.在接口中只有常量,由於定義的變量,在編譯的時候都會默認加上public static final 
3.在接口中的方法,永遠都被public來修飾。 
4.接口中沒有構造方法,也不能實例化接口的對象。(因此接口不能繼承類) 
5.接口能夠實現多繼承 
6.接口中定義的方法都須要有實現類來實現,若是實現類不能實現接口中的全部方法則實現類定義爲抽象類。 
7,接口能夠繼承接口,用extends

2

Math.round(11.5) 等於:()
正確答案: C繼承

  1. 11接口

  2. 11.5

  3. 12

  4. 12.5

首先要注意的是它的返回值類型是long,若是 Math.round(11.5f),那它的返回值類型就是int,這一點能夠參考API
其次  Returns the closest long to the argument, with ties rounding to positive infinity
它返回的是一個最接近參數的long 值(例如: Math.round(11.6) = 12; Math.round(-11.6) = -12; Math.round(-0.1) = 0; Math.round(0.1) = 0 ),那若是出現向上向下距離同樣的數值, 好比題目中的11.5,該如何處理呢 ,彆着急,看它的後半句話, with ties rounding to positive infinity( 同時向正無窮方向取捨或者翻譯成取較大的值,英語水平較差,只能翻譯成這樣了;
例子:    Math.round(11.5)  ,首先與 11.5最接近的有兩個整數 11 和 12,取較大的那結果就是12;
           Math.round(-11.5), 首先與 -11.5最接近的有兩個整數 -11 和 -12,取較大的那結果就是-11;
           Math.round(0.5), 首先與 0.5最接近的有兩個整數 0 和 1,取較大的那結果就是1;
           Math.round(-0.5), 首先與 -0.5最接近的有兩個整數 -1 和 0,取較大的那結果就是0; )
而後它有三個特例:
1. 若是參數爲 NaN(無窮與非數值) ,那麼結果爲 0。
2.若是參數爲負無窮大或任何小於等於 Long.MIN_VALUE 的值,那麼結果等於Long.MIN_VALUE 的值。
3.若是參數爲正無窮大或任何大於等於 Long.MAX_VALUE 的值,那麼結果等於Long.MAX_VALUE 的值。
最後 最好仍是看一下API或者源碼,不要信了個人邪
round方法,它表示「四捨五入」,算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,因此,Math.round(11.5)的結果爲12,Math.round(-11.5)的結果爲-11。 ceil是天花板,向上取整。 floor是地板,向下去整。

3

下列哪種敘述是正確的()
正確答案: D

  1. abstract修飾符可修飾字段、方法和類

  2. 抽象方法的body部分必須用一對大括號{ }包住

  3. 聲明抽象方法,大括號無關緊要

  4. 聲明抽象方法不可寫出大括號

abstract修飾符可修飾字段、方法和類. × abstract只能用來修飾類、方法,不修飾字段(屬性)。
抽象方法的body部分必須用一對大括號{ }包住. × 抽象方法用「;」結束。
聲明抽象方法,大括號無關緊要. × 抽象方法沒有方法體,也不用大括號。

4

What results from the following code fragment?

int i = 5;
int j = 10;
System.out.println(i + ~j);

  1. Compilation error because」~」doesn’t operate on integers

  2. -5

  3. -6

  4. 15

連接:https://www.nowcoder.com/questionTerminal/a568949ffbfc4a20977a2dab786032dd
來源:牛客網

我認爲應該是:
計算機自己儲存的就是補碼:
那麼10的補碼就是10的原碼:0000 0000 0000 1010——這是補碼,由於如今是計算機在計算
~10的補碼就是:1111 1111 1111 0101
~10的反碼就是:1111 1111 1111 0100——補碼減1
~10的原碼就是:1000 0000 0000 1011——反碼取反:這個纔是正常二進制數,換算爲整數爲-11
原碼才能夠對應爲正常的整數,補碼只有轉換爲原碼才能被正常人類識別
公式-n=~n+1可推出~n=-n-1,因此~10=-11再加5結果爲-6

5

用命令方式運行如下代碼的運行結果是()

public class f{

public static void main(String[] args){
    String foo1 = args[1];
    String foo2 = args[2];
    String foo3 = args[3];
}

}
命令: java T11 a b c

  1. 程序編譯錯誤

      1. c

  2. 程序運行錯誤

  3. t11

運行java命令,沒有T11對應的類,會報找不到或者沒法加載主類。
這裏java T11 a b c表示 運行java字節碼文件 T11  參數爲 a b c只輸入了三個參數,且args是數組下標從0開始,而程序中使用到agrs[3]顯然數組越界
命令:  java T11 a b c,依次是命令 類名  參數。因爲沒有找到相應的類名所對應的類,因此編譯會報錯。

6

如下代碼將打印出

public static void main (String[] args) {

String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
System.out.println(classFile);

}
正確答案: C 你的答案: B (錯誤)

  1. com. jd

  2. com/jd/MyClass.class

  3. ///////MyClass.class

  4. com.jd.MyClass

C。因爲replaceAll方法的第一個參數是一個正則表達式,而"."在正則表達式中表示任何字符,因此會把前面字符串的全部字符都替換成"/"。若是想替換的只是".",那麼久要寫成"\\.".

7

下面代碼的輸出是什麼?

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

  1. null

  2. sub

  3. base

new Sub();在創造派生類的過程當中首先建立基類對象,而後才能建立派生類。
建立基類即默認調用Base()方法,在方法中調用callName()方法,因爲派生類中存在此方法,則被調用的callName()方法是派生類中的方法,此時派生類還未構造,因此變量baseName的值爲null
1.首先,須要明白類的加載順序。
(1) 父類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)
(2) 子類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )
(3) 父類非靜態代碼塊( 包括非靜態初始化塊,非靜態屬性 )
(4) 父類構造函數
(5) 子類非靜態代碼塊 ( 包括非靜態初始化塊,非靜態屬性 )
(6) 子類構造函數
其中:類中靜態塊按照聲明順序執行,而且(1)和(2)不須要調用new類實例的時候就執行了(意思就是在類加載到方法區的時候執行的)
2.其次,須要理解子類覆蓋父類方法的問題,也就是方法重寫實現多態問題。
Base b = new Sub();它爲多態的一種表現形式,聲明是Base,實現是Sub類, 理解爲 b 編譯時表現爲Base類特性,運行時表現爲Sub類特性。
當子類覆蓋了父類的方法後,意思是父類的方法已經被重寫,題中 父類初始化調用的方法爲子類實現的方法,子類實現的方法中調用的baseName爲子類中的私有屬性。
由1.可知,此時只執行到步驟4.,子類非靜態代碼塊和初始化步驟尚未到,子類中的baseName尚未被初始化。因此此時 baseName爲空。 因此爲null。
public class Base {
    private String baseName = "base";
    public Base() {
        callName();
    }
    public void callName() {
        System.out.println(baseName);
    }
    public static void main(String[] args) {
        Base b = new Sub();
    }
}
class Sub extends Base {
    private String baseName = "sub";
    public void callName() {
        System.out.println(baseName);
    }
}
本題與內部類無關係,去掉內部類後代碼如上,
執行 Base b = new Sub();時因爲多態 b編譯時表現爲Base類特性,運行時表現爲Sub類特性,
Base b = new Sub();無論是哪一種狀態都會調用Base構造器執行 callName()方法;
執行方法時,因爲多臺表現爲子類特性,因此會先在子類是否有 callName();
而此時子類還沒有初始化(執行完父類構造器後纔會開始執行子類),
若是有就執行,沒有再去父類尋找
若是把父類 callName()改成 callName2(),則會輸出base
相關文章
相關標籤/搜索