Java错题集(十七)

目录

如果要建立一个java.scut.computer的包,叙述正确的是?  ( ) 

下面有关java object默认的基本方法,说法错误的是

以下JAVA程序的运行结果是什么(  )

()运算符把其操作数中所有值为0和所有值为1的位分别在结果的相应中设置1和0

尝试编译以下程序会产生怎么样的结果?()

下面关于变量及其范围的陈述哪些是不正确的()

下面有关值类型和引用类型描述正确的是()

以下哪项不属于java类加载过程?

下列程序的运行结果

下面哪些赋值语句是正确的()


如果要建立一个java.scut.computer的包,叙述正确的是?  ( ) 

A.只需在代码中加入“package java.scut.computer;”一个语句,并且必须放在代码的第一行
B.只需在代码中加入“package java.scut;”一个语句
C.必须在代码中加入“package java.scut;”和“package java.scut.computer;”两个语句
D.在代码中,不一定是第一句,只要是类定义前,加入package语句即可

来源:https://www.nowcoder.com/questionTerminal/c70fa69d5c0f4f09b7553d4f84bed281
实际上在Java语言规范中,不允许package name以“java”开头,不然会报一个java.lang.SecurityException 的错误。

因为假如我们允许包名以java开头,那么我们完全可以编写和jdk标准包下一模一样的类,如Java.lang.Integer。

因此在虚拟机进行类或接口解析时可能会发生冲突。

一句话总结就是:假如允许包名以java开头,可能会导致命名空间污染的问题。

学习博客:https://www.jianshu.com/p/f9a56a3edadd

 

下面有关java object默认的基本方法,说法错误的是

A.equals(Object obj) 指示某个其他对象是否与此对象“相等”

B.copy() 创建并返回此对象的一个副本

C.wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法

D.toString() 返回该对象的字符串表示

来源:https://www.nowcoder.com/questionTerminal/7d0f6ee46013412ba20443f797b41940

Object中没有copy方法(淦)

 

以下JAVA程序的运行结果是什么(  )

public static void main(String[] args) {
    Object o1 = true ? new Integer(1) : new Double(2.0);
    Object o2;
    if (true) {
        o2 = new Integer(1);
    } else {
        o2 = new Double(2.0);
    }
    System.out.print(o1);
    System.out.print(" ");         
    System.out.print(o2);
}
A.1 1
B.1.0 1.0
C.1 1.0
D.1.0 1

来源:https://www.nowcoder.com/questionTerminal/701d348fec8f4c1893740e253217a65f


三元操作符类型的转换规则:
1.若两个操作数不可转换,则不做转换,返回值为Object类型
2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。

4.若两个操作数都是直接量数字,则返回值类型为范围较大者

符合4,所以选D.

 

()运算符把其操作数中所有值为0和所有值为1的位分别在结果的相应中设置1和0

A.&

B.|

C.!

D.~

来源:https://www.nowcoder.com/questionTerminal/51582a16573b4d95b5ed775bcc6d5742

~是位运算符,意义是 按位非(NOT)
按位非也叫做补,一元运算符NOT“~”是对其运算数的每一位取反。

  • 仅用于整数值
  • 反转位,即0位变为1位,1变成0
~ 0111 (7) = 1000 (8)

 

尝试编译以下程序会产生怎么样的结果?()

public class MyClass {
    long var;
    public void MyClass(long param) { var = param; }//(1)
    public static void main(String[] args) {
        MyClass a, b;
        a =new MyClass();//(2)
        b =new MyClass(5);//(3)
    }
}
  1. 编译错误将发生在(1),因为构造函数不能指定返回值
  2. 编译错误将发生在(2),因为该类没有默认构造函数
  3. 编译错误将在(3)处发生,因为该类没有构造函数,该构造函数接受一个int类型的参数
  4. 该程序将正确编译和执行

来源:https://www.nowcoder.com/questionTerminal/6a484ffca453481888ae55a6aea30eaa

MyClass方法并不是构造参数,而是返回类型为void的普通方法

 

下面关于变量及其范围的陈述哪些是不正确的()

  1. 实例变量是类的成员变量
  2. 实例变量用关键字static声明
  3. 在方法中定义的局部变量在该方法被执行时创建
  4. 局部变量在使用前必须被初始化
来源:https://www.nowcoder.com/questionTerminal/8594961e5b04442084ab6d5ae0f536e2
C:在方法中定义的局部变量在该方法被执行时创建是错误的是错误的

不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”

栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出口”四个部分。

举例说明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class Demo {

     

    public void test() {

        int a;

        int b = 5;

        int c = b + 4;

        a = 2;

    }

     

    public static void main(String[] args) {

        Demo demo = new Demo();

        demo.test();

    }

}

定义了一个Demo类,其中有一个测试主方法main以及一个test()方法

那么在执行main的时候,内存分配如下

其中我们只看test()桢栈中具体的流程

首先我们使用javac Demo.java来生成Demo.class文件,然后通过执行javap -c Demo来查看执行原理,这里我只截取test()方法部分

其中

1

0:iconst_5,表示将一个int类型的常量5,压入操作数栈中

 

1

1:istore_2,表示将这个int值从栈中取出,存储到局部变量_2中(代码为变量b)

 

1

2:iload_2,表示将变量2,int类型的值取出,压到操作数栈

 

1

3:iconst_4,表示将一个int类型的常量4,压入操作数栈中

 

 

1

4:iadd,执行int类型的加***将操作数栈的4和5从栈中弹出并相加,将结果压入操作数栈中

 

1

5:istore_3,表示将这个int值从栈中取出,存储到局部变量_3中(代码为变量c)

 

1

6:iconst_2,表示将一个int类型的常量2,压入操作数栈中

 

1

7:istore_1,表示将这个int值从栈中取出,存储到局部变量_1中(代码为变量a)

 

1

8:return,方法结束,返回

以上可以看出,虽然int a;在第一行就声明了a变量,但是直到给a赋值之后,才会在局部变量表中给a分配内存空间

我们可以把赋值的代码删掉,再看看执行流程

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Demo {

     

    public void test() {

        int a;

        int b = 5;

        int c = b + 4;

    }

     

    public static void main(String[] args) {

        Demo demo = new Demo();

        demo.test();

    }

}

 

下面有关值类型和引用类型描述正确的是()

A.值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。

B.值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。

C.引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。

D.值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。

来源:https://www.nowcoder.com/questionTerminal/5fa87c11e3c14f97b7004cb5f647fe83

 

以下哪项不属于java类加载过程?

A.生成java.lang.Class对象

B.int类型对象成员变量赋予默认值

C.执行static块代码

D.类方法解析

来源:https://www.nowcoder.com/questionTerminal/3c9591e7f61343faab53f9288ff6a47f

类的加载包括:加载,验证,准备,解析,初始化。

选项A:生成java.lang.Class对象是在加载时进行的。生成Class对象作为方法区这个类的各种数据的访问入口。

选项B:既然是对象成员,那么肯定在实例化对象后才有。在类加载的时候会赋予初值的是类变量,而非对象成员。

选项C:这个会调用。可以用反射试验。

选项D:类方法解析发生在解析过程。

 

下列程序的运行结果

A.IOException!
B.IOException!Exception!
C.FileNotFoundException!IOException!
D.FileNotFoundException!IOException!Exception!

来源:https://www.nowcoder.com/questionTerminal/67a38ecf68be4559a88789f703845f8f

1)  必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。

2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3) catch 块与相应的异常类的类型相关。
4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或 其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5) 可嵌套 try-catch-finally 结构。
6) 在 try-catch-finally 结构中,可重新抛出异常。

7) 除了下列情况,总将执行 finally 做为结束: JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击

由此可以看出,catch只会匹配一个,因为只要匹配了一个,虚拟机就会使整个语句退出

 

下面哪些赋值语句是正确的()

A.long test=012
B.float f=-412
C.int other =(int)true
D.double d=0x12345678
E.byte b=128

链接:https://www.nowcoder.com/questionTerminal/f838b38081b942fba7ab2869f71ad071

选ABD

A和B中long和float,正常定义需要加l和f,但是long和float属于基本类型,会进行转化,所以不会报出异常。AB正确

boolean类型不能和任何类型进行转换,会报出类型异常错误。所以C错。

D选项可以这样定义,D正确。

E选项中,byte的取值范围是-128—127。报出异常: cannot convert from int to byte.所以E选项错误。

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值