【293天】我愛刷題系列052(2017.11.25)

叨叨兩句

  1. 加油!

牛客網——java專項練習032

1

有如下類定義:java

abstract class Animal{安全

abstract void say();

}
public class Cat extends Animal{app

public Cat(){
    System.out.printf("I am a cat");
}
public static void main(String[] args) {
    Cat cat=new Cat();
}

}
運行後:
正確答案: Bthis

    1. am a cat
  1. Animal能編譯,Cat不能編譯
  2. Animal不能編譯,Cat能編譯
  3. 編譯能經過,可是沒有輸出結果
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類同樣,一樣能夠擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:
1)抽象方法必須爲public或者protected(由於若是爲private,則不能被子類繼承,子類便沒法實現該方法),缺省狀況下默認爲public。
2)抽象類不能用來建立對象;
3)若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。
在其餘方面,抽象類和普通的類並無區別。

2

Java程序中的類名稱必須與存放該類的文件名相同。
正確答案: B線程

聲明爲public類型的類名必須與文件名相同,默認權限的能夠不一樣
而且內部類的類名通常與文件名不一樣

3

下面代碼將輸出什麼內容:()code

public class SystemUtil{對象

public static boolean isAdmin(String userId){
    return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
    System.out.println(isAdmin("Admin"));
}

}繼承

正確答案: B 你的答案: A (錯誤)接口

  1. true
  2. false
  3. 1
  4. 編譯錯誤
在源碼中 toLowerCase 是從新 new String()

因此爲 == 是比較對象是不是同一個對象,因此爲 false

4

在Java中下面Class的聲明哪些是錯誤的?
正確答案: A B C 進程

public abstract final class Test {

abstract void method();

}
public abstract class Test {

abstract final void method();

}
public abstract class Test {

abstract void method() {

}
}
public class Test {

final void method() {

}
}

A、final修飾的類爲終態類,不能被繼承,而 抽象類是必須被繼承的纔有其意義的,所以,final是不能用來修飾抽象類的。
B、 final修飾的方法爲終態方法,不能被重寫。而繼承抽象類,必須重寫其方法。
C、抽象方法是僅聲明,並不作實現的方法。

5

如下哪些類是線程安全的()
正確答案: A D E

  1. Vector
  2. HashMap
  3. ArrayList
  4. StringBuffer
  5. Properties
java中的線程安全是什麼:
就是線程同步的意思,就是當一個程序對一個線程安全的方法或者語句進行訪問的時候,其餘的不能再對他進行操做了,必須等到此次訪問結束之後才能對這個線程安全的方法進行訪問
什麼叫線程安全:
若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。 
或者說:一個類或者程序所提供的接口對於線程來講是原子操做或者多個線程之間的切換不會致使該接口的執行結果存在二義性,也就是說咱們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態變量引發的。
若每一個線程中對全局變量、靜態變量只有讀操做,而無寫操做,通常來講,這個全局變量是線程安全的;如有多個線程同時執行寫操做,通常都須要考慮線程同步,不然就可能影響線程安全。
看過vector源碼的同窗就會知道他的許多操做都是加了synchronized修飾的好比他的添加元素。(不知道synchronized是什麼意思的自行百度!)


public synchronized void addElement(E obj) {  modCount++;
       ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;
}
而HashMap的全部操做都沒有加synchronized修飾 ,不如他的put源碼



public V put(K key, V value) {
     if (key == null)
         return
      putForNullKey(value);
      int hash = hash(key.hashCode());
      int i = indexFor(hash, table.length);
      for(Entry<K,V> e = table[i]; e != null; e = e.next) {
         Object k;
         if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
             V oldValue = e.value;
             e.value = value;
             e.recordAccess(this);
             return
             oldValue;    }
     }
     modCount++;
     addEntry(hash, key, value, i);
     return null;
 }
再看看ArrayList的add方法的源碼


public boolean add(E e) {
     ensureCapacity(size + 1);  // Increments modCount!!
     elementData[size++] = e;
     return true;
 }
再看StringBuffer的append源碼,他是有synchronized修飾的


public synchronized
  StringBuffer append(String str) {
     super.append(str);
     return this;
 }
最後是Properties的setProperty方法,他是有synchronized修飾的


public synchronized
  Object setProperty(String key, String value) {
      return
      put(key, value);
 }
由此就能夠判斷出誰是線程安全的了。
相關文章
相關標籤/搜索