牛客练习2
1.对于以下代码段,4个输出语句中输出true的个数是( 3)。
class A{}
class B extends A{}
class C extends A{}
class D extends B{}
A obj = new D();
System.out.println(obj instanceof B);
System.out.println(obj instanceof C);
System.out.println(obj instanceof D);
System.out.println(obj instanceof A);
//instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。
- 先有继承关系,再有instanceof的使用。
- 当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
该题中 C直接继承自A,obj的实际类型为D,和C没有关系。所以obj instanceof C 输出false。
2.下面代码的执行结果是 : A
class Chinese{
private static Chinese objref =new Chinese();
private Chinese(){}
public static Chinese getInstance() { return objref; }
}
public class TestChinese {
public static void main(String [] args) {
Chinese obj1 = Chinese.getInstance();
Chinese obj2 = Chinese.getInstance();
System.out.println(obj1 == obj2);
}
}
-
A:true
-
B:false
-
C:TRUE
-
D:FALSE
//饿汉式单例模式,在类创建时,就已经实例化完成,在调用Chinese.getInstance()时,直接获取静态对象 .
3.String s = new String(“xyz”);创建了几个StringObject? (两个或者一个都有可能)
//String对象的两种创建方式:
第一种方式:
String str1 = “aaa”; 是在常量池中获取对象(“aaa” 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象),
第二种方式: String str2 = new String(“aaa”) ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 “aaa” 字符串对象)。
如果常量池中存在“xyz”就只会创建一个对象,如果没有就会创建两个
4.下列程序的运行结果
public
void
getCustomerInfo() {
(A)
try
{
// do something that may cause an Exception
} catch (java.io.FileNotFoundException ex) {
System.out.print("FileNotFoundException!"
);
} catch (java.io.IOException ex) {
System.out.print(
“IOException!”``);`
} catch (java.lang.Exception ex) {`
System.out.print(“Exception!”);
}
}
A:IOException!
B:IOException!Exception!
C:FileNotFoundException!IOException!
D:FileNotFoundException!IOException!Exception!
//catch只会匹配一个,因为只要匹配了一个,虚拟机就会使整个语句退出
代码块中的do something that may cause an Exception说明程序运行时只会抛出一个异常, 但没有 指明是什么异常,三种异常均有可能。对于某个异常,只会被捕获一次, 因而只有A是可能的答案, 另外三个选项都 捕获了多个异常,与题意不符。
5.运行代码,输出的结果是(A)
publicclass
P {
publicstatic
int
abc = 123;
static{
System.out.println("P is init"
);
}
}
publicclassS extends P {
static{
System.out.println("S is init"
);
}
}
publicclassTest {
public static void main(String[] args) {
System.out.println(S.abc);
}
}
A:P is init<br />123
B:S is init<br />P is init<br />123
C:P is init<br />S is init<br />123
D:S is init<br />123
属于被动引用不会出发子类初始化
1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
2.通过数组定义来引用类,不会触发此类的初始化
3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化而静态代码块在类初始化的时候执行