(1)
该题考察的是继承的特性和实例方法、类方法的区别。
- 当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。
- 当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。
对于A,实例方法不可以调用超类的私有(private)实例方法。
对于B,实例方法不可以调用超类的私有(private)类方法。
对于C,同选项A一样的原因。
对于D,本类的类方法优先于实例方法地址的分配,所以实例方法可以调用优先于加载的类方法。D正确。
(2)
A.除数为0 等ArithmeticException,是RuntimException的子类。而运行时异常将由运行时系统自动抛出,不需要使用throw语句。Java编译器允许忽略运行时异常,一个方法可以既不捕捉,也不声明抛出运行时异常。
int a[]=null; a[0]=1;//会抛出空指针错误,不是数组越界,因为它没有分配空间NULL;
(3)经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;
128 -128
解析:
上面的解释好像都有点瑕疵,java中short占用2bytes,强转short类型为byte,会将多出的高8位进行截断,short类型的 128的补码:0000 0000 1000 0000,强转为byte后的补码:1000 0000,我们认识的是原码,所以需要求1000 0000的原码,再次对补码的真值位(符号位以外的)取反加一(或减一取反)即可得到原码为1111 1111+1=1100 00000,发现溢出了多出一位,计算机仍然将多出一位进行截断,保留为1000 0000,表示-0,注意,没有-0,只有0,而byte占用8bit,可以表示256个数,-127-127(对应的原码:1111 1111-- 0111 1111)都能表示出来,则共表示255个数,还差一个,所以为了充分利用资源,就将原来本应该表示“-0”的原码规定为代表-128,故结果为-128,有符号的byte类型也就能够表示的范围是-128-127.
(4)下面会输出什么 -6
int
i =
5
;
int
j =
10
;
System.out.println(i + ~j);
解析:
10原码:0000000000000000,0000000000001010;
~10: 1111111111111111,1111111111110101 变为负数,计算机用补码存储
~10反码:10000000000000000,0000000000001010
~10补码:10000000000000000,0000000000001011,等于 -11
故程序结果-6
(5)以下代码的输出结果是
public
class
B
{
public
static
B t1 =
new
B();
public
static
B t2 =
new
B();
{
System.out.println(
"构造块"
);
}
static
{
System.out.println(
"静态块"
);
}
public
static
void
main(String[] args)
{
B t =
new
B();
}
}
输出:
构造块 构造块 静态块 构造块
解析:
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态块按照申明顺序执行,所以先执行publicstaticB t1 = newB();该语句创建对象,则又会调用构造块,输出构造块
接着执行public static B t1 = new B();输出构造块
再执行
static
{
System.out.println("静态块");
}输出静态块
最后main方法执行,创建对象,输出构造块。
(6)
线程安全概念:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
LinkedList 和 ArrayList 都是不同步的,线程不安全; Vector 和 Stack 都是同步的,线程安全; Set是线程不安全的; Hashtable的方法是同步的,线程安全; HashMap的方法不是同步的,线程不安全;
(7)如何去判断一个类是否是线程安全的
java中的线程安全是什么:
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
看过vector源码的同学就会知道他的许多操作都是加了synchronized修饰的比如他的添加元素。(不知道synchronized是什么意思的自行百度!)
然后我们就可以根据有没有包含synchroized来证明是不是线程安全的