1、 java语言中,按照一定格式生成程序的文档的工具是?
javac
javah
javadoc
jar
2、下列关于java抽象类的说法哪个正确?(D)
某个抽象类的父类是抽象类,则这个子类必须重载父类的所有抽象方法
接口和抽象类是同一回事
可以用抽象类直接去实例化创建对象
一个类只能继承一个抽象类
解析:
如果一个类中有抽象方法,那么这个类必须声明为 抽象类
若父类包含有抽象方法(父类肯定是 抽象类 了), 子类必须去实现它
若父类是 抽象类 ,但某个方法是非抽象的, 那么子类可以直接继承这个方法(不用实现)
抽象类一般不能被实例化;
抽象类通常不是由程序员定义的,而是由项目经理或模块设计人 设计抽象类的原因通常是为了规范方法名 抽象类必须要继承,不然没法用,作为模块设计者,可以把让底层程序员直接用得方法直接调用,而一些需要让程序员覆盖后自己做得方法则定义称抽象方法
Java不支持多继承,但是通过一些巧妙的设计来达到和多继承同样的效果
通过接口、内隐类,继承、实现,互相配合,达到多继承的效果
1、Java中一个类不能继承多个具体class。
2、一个类只可继承自一个具体 class,但可实现多个接口。
interface不涉及到实现细节,不与任何存储空间有关连。
可以实现合并多个 interface ,达到可向上转型为多种基类的目的。
新类可继承自一个具象class,其余继承都得是interfaces。
3、outer class不可继承自多个具体 class,可在其内部设多个inner class,每个inner class都能各自继承某一实现类。
inner class不受限于outer class 是否已经继承自某一实现类。
4、inner class可以说是多重继承问题的完整解决方案。
inner class 可 “继承自多个具象或抽象类”。
一个类不能继承自多个一般类。但我们可以让其内部的多个inner class各自继承某一实现类达到类似的目的。
3、两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,则输出肯定不是哪个?(A)
10
12
22
解析:
每个线程进foo函数不止一次,那么我们暂且假设两个线程分别进入foo函数X次,
假设给线程编号,线程1有m次被堵在a++,线程2有n次被堵在a++处,
那么线程1必然会执行(X-m)次a- -,线程2必然会执行(X-n)次a- -,
那么最终a的值为(m+n)-((X-m)+(X-n))=2(m+n)-2X,
那么a必然是偶数
对于B选项:P1执行程序,输入1,P2执行程序,输出0;
对于C选项:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行判断语句,并执行输入,得到1,P1然后继续执行,此时它该执行a++,这时a=1,执行并输出,结果为2;
对于D答案:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行a++,得到a=1,中断,P1继续执行a++,a=2,P1输出,得到2,P1结束,P2继续执行输出语句,得到2;
4、
结果不正确,因为会溢出,用位与的方式就没问题
结果正确,即使会溢出
结果正确,不会溢出
其他选项都不对
解析:
设整形变量*a、*b的位表示为
*a = n31n30 ••• n0
*b = m31m30 ••• m0
只有当*a > 0 && *b > 0 或 *a < 0 && *b < 0时才会发生溢出。两者类似,只证明均大于0时的情况。必须扩展额外一位才能够容纳正确的结果,'|'左边为扩展位。
*a = 0|0n30 ••• n0 = n30*230 + n29*229 + ••• + n0*20 = N
*b = 0|0m30 ••• m0 = m30*230 + m29*229 + ••• + m0*20 = M
若和溢出,则33位表示必为
*a + *b = 0|1b30 ••• b0 = -231 + b30*230 + b29*229 + ••• + b0*20 = 2 31 + B ①
计算机将得到的33位结果truncate回原来的32位,即丢弃第33位(0)变为:
*a + *b = 1b30 ••• b0 = -231 + b30*230 + b29*229 + ••• + b0*20 =
javac
javah
javadoc
jar
2、下列关于java抽象类的说法哪个正确?(D)
某个抽象类的父类是抽象类,则这个子类必须重载父类的所有抽象方法
接口和抽象类是同一回事
可以用抽象类直接去实例化创建对象
一个类只能继承一个抽象类
解析:
如果一个类中有抽象方法,那么这个类必须声明为 抽象类
若父类包含有抽象方法(父类肯定是 抽象类 了), 子类必须去实现它
若父类是 抽象类 ,但某个方法是非抽象的, 那么子类可以直接继承这个方法(不用实现)
抽象类一般不能被实例化;
抽象类通常不是由程序员定义的,而是由项目经理或模块设计人 设计抽象类的原因通常是为了规范方法名 抽象类必须要继承,不然没法用,作为模块设计者,可以把让底层程序员直接用得方法直接调用,而一些需要让程序员覆盖后自己做得方法则定义称抽象方法
Java不支持多继承,但是通过一些巧妙的设计来达到和多继承同样的效果
通过接口、内隐类,继承、实现,互相配合,达到多继承的效果
1、Java中一个类不能继承多个具体class。
2、一个类只可继承自一个具体 class,但可实现多个接口。
interface不涉及到实现细节,不与任何存储空间有关连。
可以实现合并多个 interface ,达到可向上转型为多种基类的目的。
新类可继承自一个具象class,其余继承都得是interfaces。
3、outer class不可继承自多个具体 class,可在其内部设多个inner class,每个inner class都能各自继承某一实现类。
inner class不受限于outer class 是否已经继承自某一实现类。
4、inner class可以说是多重继承问题的完整解决方案。
inner class 可 “继承自多个具象或抽象类”。
一个类不能继承自多个一般类。但我们可以让其内部的多个inner class各自继承某一实现类达到类似的目的。
3、两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,则输出肯定不是哪个?(A)
void foo() {
if(a <= 0) {
a++;
}
else {
a--;
}
printf("%d", a);
}
01
10
12
22
解析:
每个线程进foo函数不止一次,那么我们暂且假设两个线程分别进入foo函数X次,
假设给线程编号,线程1有m次被堵在a++,线程2有n次被堵在a++处,
那么线程1必然会执行(X-m)次a- -,线程2必然会执行(X-n)次a- -,
那么最终a的值为(m+n)-((X-m)+(X-n))=2(m+n)-2X,
那么a必然是偶数
对于B选项:P1执行程序,输入1,P2执行程序,输出0;
对于C选项:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行判断语句,并执行输入,得到1,P1然后继续执行,此时它该执行a++,这时a=1,执行并输出,结果为2;
对于D答案:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行a++,得到a=1,中断,P1继续执行a++,a=2,P1输出,得到2,P1结束,P2继续执行输出语句,得到2;
4、
void swap_int(int *a,int *b){
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
以下说法正确的是:(B)
结果不正确,因为会溢出,用位与的方式就没问题
结果正确,即使会溢出
结果正确,不会溢出
其他选项都不对
解析:
设整形变量*a、*b的位表示为
*a = n31n30 ••• n0
*b = m31m30 ••• m0
只有当*a > 0 && *b > 0 或 *a < 0 && *b < 0时才会发生溢出。两者类似,只证明均大于0时的情况。必须扩展额外一位才能够容纳正确的结果,'|'左边为扩展位。
*a = 0|0n30 ••• n0 = n30*230 + n29*229 + ••• + n0*20 = N
*b = 0|0m30 ••• m0 = m30*230 + m29*229 + ••• + m0*20 = M
若和溢出,则33位表示必为
*a + *b = 0|1b30 ••• b0 = -231 + b30*230 + b29*229 + ••• + b0*20 = 2 31 + B ①
计算机将得到的33位结果truncate回原来的32位,即丢弃第33位(0)变为:
*a + *b = 1b30 ••• b0 = -231 + b30*230 + b29*229 + ••• + b0*20 =