部分真题整理3

这篇博客主要涵盖Java编程的相关知识点,包括Javadoc工具的使用、抽象类的理解、线程并发执行的分析、数据结构与算法的应用、以及Java排序算法的探讨。内容涉及多线程安全、内存溢出、指针运算、排序算法的时间复杂度和Java中的二分查找策略。通过对这些核心概念的解析,帮助读者深入理解Java编程的关键点。
摘要由CSDN通过智能技术生成
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)
 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 =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值