目录
如果要建立一个java.scut.computer的包,叙述正确的是? ( )
()运算符把其操作数中所有值为0和所有值为1的位分别在结果的相应中设置1和0
如果要建立一个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开头,可能会导致命名空间污染的问题。
下面有关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),因为构造函数不能指定返回值
- 编译错误将发生在(2),因为该类没有默认构造函数
- 编译错误将在(3)处发生,因为该类没有构造函数,该构造函数接受一个int类型的参数
- 该程序将正确编译和执行
来源:https://www.nowcoder.com/questionTerminal/6a484ffca453481888ae55a6aea30eaa
MyClass方法并不是构造参数,而是返回类型为void的普通方法
下面关于变量及其范围的陈述哪些是不正确的()
- 实例变量是类的成员变量
- 实例变量用关键字static声明
- 在方法中定义的局部变量在该方法被执行时创建
- 局部变量在使用前必须被初始化
来源: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选项错误。