1.下列说法中正确的是?(A)
A、java程序的main方法必须写在类里面
B、java程序中可以有多个main方法
C、java程序中类名必须与文件名一样
D、java程序的main方法中如果只有一条语句,可以不用{}括起来。
2.Java中,如图所示的Test类中(D)个构造方法。
public class Test{
private int x;
public Test(){
x=35;
}
public void Test(double f){
This.x=(int)f;
}
public Test(String s){}
}
A、0
B、1
C、2
D、3
构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。
Java 构造方法有以下特点:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
值得注意的是,如果为构造方法定义了返回值类型或使用 void 声明构造方法没有返回值,编译时不会出错,但 Java 会把这个所谓的构造方法当成普通方法来处理。
这时候大家可能会产生疑问,构造方法不是没有返回值吗?为什么不能用 void 声明呢?
简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。
注意:构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。构造方法用于初始化一个新对象,所以用 static 修饰没有意义。构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。如果不了解除 static、final 之外其他的关键字,教程后面会详细讲解。
3.以下不是合法标识符的是(C)
A、STRING
B、x3x
C、void
D、de$f
Java标识符由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。
下面的标识符是合法的:myName,My_name,Points,$points,_sys_ta,OK,_23b,_3_
下面的标识符是非法的:#name,25name,class,&time,if
4.表达式(11+3*8) /4%3的值是(D)
A、31
B、0
C、1
D、2
5.以下表达式不可以作为循环条件的是(A)
A、i++
B、i>5
C、str1 = str.equals("q")
D、count == i
循环条件需要结果为true或false,i++为死循环,不可以作为循环条件
6. 运算符优先级排序正确的是(A)
A、由高到低分别是 算术运算符,关系运算符,逻辑运算符,赋值运算符
B、由高到低分别是 关系运算符,算术运算符,赋值运算符,逻辑运算符
C、由高到低分别是 算术运算符,逻辑运算符,关系运算符,赋值运算符
D、由高到低分别是 关系运算符,赋值运算符,算术运算符,逻辑运算符
7.以下程序的运行结果是:B
public class Increment {
public static void main(String[] args) {
int a;
a = 6;
System.out.println(a);
System.out.println(a++);
System.out.println(a);
}
}
A、666
B、667
C、677
D、676
8.下列程序输出果是(B)
int i = 10;
while (i>0){
i = i+1;
if (i ==10){
break;
}
}
A、while循环10次
B、死循环
C、循环一次都不执行
D、循环执行一次
9.在java中下面代码是几条语句?B
int i;
i=123;
int j=0,k=0;
System.out.println(i+";"+";"+j+""+k);
A、3
B、4
C、5
D、6
10.下列之不为true的表达式有(C)
A、"john" = = "john"
B、"john".equals("john")
C、"john" = "john"
D、"john".equals(new String("john"))
c选项会报错
java: 意外的类型
需要: 变量
找到: 值
11. 执行下面代码的结果是 D
for (int i=0;;){
System.out.println("这是"+i);
break;
}
A、语法错误,缺少表达式2和表达式3
B、死循环
C、程序什么都不输出
D、输出“这是0”
12 .下面代码的输出结果是 B
int i=0,s=0;
do {
if (i%2 == 0){
i++;
continue;
}
i++;
s = s+i;
}while (i<7);
System.out.println(s);
A、16
B、12|
C、28
D、21
15.下列关于java封装的说法错误的是(D)
A、封装就是将属性私有化,提供共有的方法访问私有属性
B、属性的访问方法包括 setter方法和 getter方法
c、setter方法用于赋值,getter方法用于取值
D、包含属性的类都必须封装属性,否则无法通过编译
16.在JAVA中,LinkedList类和ArrayList类同属于集合框架类,下列()选项中的方法是LinkedList类有而ArrayList类没有的是?(D)
A、add(Object o)
B、add(int index,Object o)
C、remove(Object o)
D、removeLast()
17.下面关于数组的说法,错误的是(B)
A、数组是最简单的复合数据类型,是一系列数据的集合
B、声明数组时,必须分配内存
C、数组的元素可以是值(基本数据类型)、对象或其他数组
D、一个数组中的所有值都必须是相同的类型
一维数组的声明语法有两种:
- 类型 数组名字[];
- 类型[] 数组名字;
这两种效果完全一样,类型可以是基本数据类型,也可以是类类型,即引用类型。需要注意的是,这时候数组名还不能直接使用,因为没有初始化,也就没有分配内存。Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下:arrayName = new type[arraySize];
18.访问修饰符的作用范围由大到小是(D)
A. private-default-protected-public
B. public-default-protected-private
C. private-protected-default-public
D. public-protected-default-private
19.假设如下代码中,若线程t1线程在t2线程启动之前已经完成启动,代码的输出是(B)
public static void main(String[] args) throws InterruptedException {
final Object obj = new Object();
Thread t1 = new Thread() {
public void run() {
synchronized (obj) {
try {
obj.wait();
System.out.println("Thread 1 wake up.");
} catch (InterruptedException e) {
}
}
}
};
t1.start();
Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
Thread t2 = new Thread() {
public void run() {
synchronized (obj) {
obj.notifyAll();
System.out.println("Thread 2 sent notify.");
}
}
};
t2.start();
}
A、Thread 1 wake up
Thread 2 sent notify.
B、Thread 2 sent notify.
Thread 1 wake up.
C、A、B皆有可能
D、程序无输出卡死
解析:
执行obj.wait();时已释放了锁,所以t2可以再次获得锁,然后发消息通知t1执行,但这时t2还没有释放锁,所以肯定是执行t2,然后释放锁,之后t1才有机会执行。notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。