【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);
 }
由此就能够判断出谁是线程安全的了。
相关文章
相关标签/搜索