【Java错题收集与解析】(1)

本文主要解析了Java编程中的几个常见问题,包括访问修饰符的作用范围、Math.round()方法的行为、字符串与StringBuilder的引用传递特性、类的构造方法与成员变量的使用规则,以及避免死锁的资源分配策略。这些问题对于深入理解和使用Java编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.访问修饰符的作用范围从大到小是?
答案:public->protected->default->private
解析:protected比default的作用范围大,protected修饰的成员,除了可以被同包中的类进行调用,还可以被不同包下的当前类的子类所调用。而default,顾名思义,默认权限,也就是同包权限。

2.Math.round(2.6)=? Math.round(-2.6)=?
答案:Math.round(2.6)=3 Math.round(-2.6)=-2
解析: Math.round()是四舍五入,返回最近的整数。

3.

public class Test {
    public static void change(String message,StringBuffer stringBuffer){
        message="讨厌";
        int  sb_length = stringBuffer.length();
        stringBuffer.delete(0,sb_length);
        stringBuffer.append("才怪");
    }

    public static void main(String[] args) {
        String message="喜欢";
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("好久了");
        change(message,stringBuffer);
        System.out.println("我"+message+"你"+stringBuffer.toString());
    }
}

输出结果为?
答案:我喜欢你才怪
解析:除了8种原始的数据类型外,方法调用传递的都是引用,从本质上来说,就是按值传递,当我们调用change方法时,实际上是把message的值(message指向空间的首地址)复制了一份,给形参message,我们在change方法里面,由于string是字符串常量,因此“message=”讨厌”;”只是改变了形参message的指向,使它指向了另一个字符串常量,因此主函数的message不变;
同理,stringBuffer是对申请的那段空间的引用,它的值其实是那段空间的首地址,当我们调用change方法时,实际上是把这个引用关系复制了一份给形参stringBuffer,当我们通过形参stringBuffer,改变形参stringBuffer所指向空间的值时,主函数里的stringBuffer所指向的空间的值就会改变,因为它们指向的是同一个空间。
再来看一个类似的题

public class Test {
    public static void change(String message,StringBuffer stringBuffer){
        message="讨厌";
        stringBuffer=new StringBuffer();
        stringBuffer.append("才怪");
    }

    public static void main(String[] args) {
        String message="喜欢";
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("好久了");
        change(message,stringBuffer);
        System.out.println("我"+message+"你"+stringBuffer.toString());
    }
}

这次的运行结果是?
答案:我喜欢你好久了
解析:很简单,正如之前所说的,形参实参传递其实是复制,当我们调用change方法时,主函数里的stringBuffer和形参stringBuffer指向同一段空间a,这时,我们更改了形参stringBuffer的指向,使他指向另外一 段空间b,再改变形参stringBuffer所指向空间的值,实际上是改变了b空间的值,而a空间的值(主函数里的stringBuffer所指向的空间的值)并没有发生改变。

4.以下关于类的说法正确的是?
A只要没有定义不带参数的构造方法,JVM都会给类生成一个默认的构造方法
B局部变量的作用范围仅仅在定义他的方法内,或者是在定义它的控制流块中
C使用其他类的方法,仅仅需要引用 方法的名字即可
D在类中定义的变量成为类的成员变量,在其他类中可以直接使用
答案:B
解析: 只要没有定义构造方法,JVM都会给类生成一个默认的构造方法,A错; 使用其他类的方法,要使用类名.方法来调用,C错;只有在类中定义的被static修饰的变量才是类的成员变量,而且,类的private修饰的成员变量不能被其他类使用,D错。

5.某系统有11个资源,n个进程公用这些资源,每个进程要使用3个资源,当n的取值不超过多少时,系统不会发生死锁?
答案:5
解析:这类题型可以这样来计算,a个资源,n个进程,每个进程b个资源,求n的最小值,那么,n的最小值就是:a/(b-1),当n小于等于a/(b-1)时,系统就不会发生死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值