一、不定项选择 (每题1分)
1.下列代码的输出是什么?
public static void main(String[] args) {
int a;
a = 6;
System.out.print(a);
System.out.print(a++);
System.out.print(a);
}
A:666
B:667
C:677
D:676
答案:B
解析:第一个a输出6,a++是a=a,a=a+1,所以输出a,第三个a已经自增了所以是7
2.String s = new String(“xyz”);创建了几个StringObject?
A:两个或者一个都有可能
B:两个
C:一个
D:三个
答案: A
解析:本题易错项为B,StringObject表示为String类型对象。想要搞懂,我们需要先搞懂几个概念
栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。
堆 :由JVM分配的,用于存储对象等数据的区域。
常量池:在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。
进入正题:String a = "abc";① String b = "abc";②
使用String a = “abc”;的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
①代码执行后在常量池中创建了一个值为abc的String对象,②执行时,因为常量池中存在"abc"所以就不在创建新的String对象了。String c = new String("xyz");① String d = new String("xyz");②
让我们来看看这两句代码在内存中发生了什么,①Class被CLassLoader加载时,你的"xyz"被作为常量读入,在常量池里创建了一个共享的"xyz",然后当调用到new String(“xyz”)的时候,会在heap里创建这个new String(“xyz”);②由于常量池中存在"xyz"所以不再创建"xyz",然后创建新的new String(“xyz”)。
对于String c = new String(“xyz”);的代码,与String a = "abc"不同的是一概在堆中创建新对象,不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。String s1 = new String("xyz"); //创建二个对象,一个引用 String s2 = new String("xyz"); //创建一个对象,并且以后每执行一次创建一个对象,一个引 String s3 = "xyz"; //创建一个对象,一个引用 String s4 = "xyz"; //不创建对象,只是创建一个新的引用
所以,本题选A
3.下列关于final,finally和finalize的说法正确的是()
A:final可以用来修饰类、方法、变量
B:finally是java代码保证重点代码一定要执行的一种机制
C:变量被final修饰后不能再指向其他对象,但可以重写
D:finalize设计目的是保证对象在被垃圾收集完成特定资源回收
答案:A B D
解析:final修饰变量,固定的变量的值不变,如果是基本类型,指定此变量的值不能变。变量为引用类型:可以修改值(地址值不变),C错误
4.局部内部类可以用那些修饰符修饰?
A:public
B:private
C:abstract
D:final
答案:C D
解析: 局部内部类不能使用public、private、protected、static这些修饰符,局部内部类只能在当前方法中使用 。所以选择C D
5.执行下列代码会发生什么?
public class Test {
static {
int x = 5;
}
static int x,y;
public static void main(String[] args) {
x--;//-1
myMethod();
System.out.println(x+y+ ++x);
}
public static void myMethod() {
y = x++ + ++x;//y= -1 +1 =0 x=1
}
}
A:编译出错
B:输出1
C:输出2
D:输出3
E:输出7
F:输出8
答案:D
解析: static虽然属于类,但static修饰代码块,里面的int x=5是局部变量,static int x,y才是全局变量,其不初始化值,默认为0。main方法和myMethod方法使用得都是static int x,y。看main方法,x–执行后,x=-1.执行了myMethod方法 y= x++ + ++相当于y = (x++) + (++x);x++先赋值后加,++x先加后赋值。所以是-1 + 1 =0。(无论是x++,还是++x最后x都会自增1,只是执行顺序不同)这时候全局变量x=1,y=0。最后x+y+ ++x结果为1 + 0 ++x =1 + 0 + 2 =3.固选D
6.下面那些赋值语句是正确的
A:long text = 012;
B:float t = -412;
C:int other = (int) true;
D:double d = 0x12345678;
E:byte b = 128;
答案:A B D
解析: 0开头表示为8进制的数,0x表示为16进制的数,计算机会自动识别。如八进制012代表十进制为10(012=1 * 8^1 +2* * 8^2=10)A正确,B:对于float来说,有小数需要加上f,如1.2f,如果没有可以不加f 。float是4个字节,32位,其中符号位1位,阶码位8位,数值位为23位。C:基本类型int和boolean不能强转,可以通过包装类来转。D:0x12345678为16进制数,正确。E:byte为1个字节。8位,一位是符号位,7位符号位最大为127。
7.以下程序的输出结果
class Base {
public Base(String s) {
System.out.print("B");
}
}
public class Dervid extends Base {
public Dervid(String s) {
System.out.print("D");
}
public static void main(String[] args) {
Dervid dervid = new Dervid("s");
System.out.print("C");
}
}
A:BD
B:DB
C:C
D:编译错误
答案:D
解析:在调用子类的构造方法前,没有写super,默认通过super()l来调用父类的无参构造方法,然而本题的Base类中写了有参构造方法,覆盖了默认的无参构造方法。解决方法有两种:一在子类构造方法第一句写上super(s);二是在父类补充无参构造方法(建议),反射的原理也是通过父类的无参构造方法,如果写明了构造方法,建议把被覆盖的无参方法也写明。
8.java继承的特点,下列说法正确的是
A:使类的定义复杂化
B:java只支持单继承,不可多继承,但可以通过实现接口来达到多继承的目的
C:子类继承父类的所有成员变量和方法,包括父类的构造方法
D:不可以多层继承,既一个类不可以继承一个类的子类
答案:B
解析:A:明显错误。C:子类只会继承父类非私有的成员变量和方法,C错误。D:Java不可以多继承,但是可以多级(层)继承,D错误。所以选择B
9.关于final关键字下列说法正确的是
A:如果修饰局部变量必须初始化
B:如果修饰类,则该类只能被一个子类继承
C:如果修饰方法,则该方法不能在子类当中重写
D:如果修饰方法,则该方法所在的类不能被继承
答案:C
解析:A:final修饰局部变量可以不初始化,但是使用的时候要初始化,A错误。B:final修饰类,该类不能被继承。C&D:如果修饰方法,则该方法所在的类可以被继承,该方法不能被重写。
10.下列说法正确的是
A:在类方法当中可以用this来调用本类的方法
B:在类方法当中调用本类的类方法可以直接调用
C:在类方法当中只可能调用本类的类方法
D:在类方法中绝对不能调用实例方法
答案:B
解析:类方法中不能使用this来调用本类的方法,类方法中可以直接调用本类的类方法,不能直接调用实例(对象)方法,需要先实例化对象,后借助对象来间接使用对象方法
11.关于java异常处理机制的叙述有哪些是正确的?
A:catch部分捕捉到异常情况时,才会执行finally部分
B:当try区分的程序发生异常的时候,才会执行catch区段的程序
C:在try区段不论程序是否发生异常,都会执行finally部分
D:以上都是
答案:B C
解析:在try区段不论程序是否发生异常,都会执行finally部分,当try区分的程序发生异常的时候,才会执行catch区段的程序
12.下列说法正确的是()
A:在类当中定义的变量称为类的成员变量,在别的类当中可以直接使用
B:局部变量的作用范围仅仅在定义它的方法内,或者在定义它的控制流块中
C:使用别的类的方法只需要引用方法名即可
D:只要没有定义不带参数的构造函数,JVM都会为类生成一个默认的构造函数
答案:B
解析:A:在类当中定义的变量称为类的成员变量是正确的,别的类能否使用需要看访问权限修饰符,A错误。C:是类的方法(static)需要用类名.方法名,如果是类的对象方法,还需要先实例化对象,C错误。D:只要定义了构造方法(无论有参无参),都会覆盖掉JVM为类生成的默认的构造函数,D错误。
13.关于Float,下列说法错误的是()
A:Float是一个类
B:Float在java.lang包中
C:Float a = 1.0 是正确的赋值方法
D:Float a = new Float(1.0)是正确的赋值方法
答案:C
解析:Float是基本类型float的包装类,即A正确,java.lang是java最核心的包,其中有基本类型以及其包装类等,使用java.lang包下的内容不需要导入,B正确。C的赋值方法是错误的,但是Float a = 1是正确的,Float a = 1.0f也是正确的这样是自动装箱,D的赋值方法正确。
14.java 反射机制主要提供了以下哪些功能?
A:在运行时判断一个对象所属的类
B:在运行时构造一个类的对象
C:在运行时判断一个类所具有的成员变量和方法
D:在运行时调用一个对象的方法
答案:A B C D
解析:
15.在java 当中下列说法错误的是
A:数组是一种对象
B:数组属于原生类
C:int num = []{1,2,3,4}
D:数组的大小可以任意改变
答案: B C D
解析: 数组是引用类型,是一种对象。B数组不属于原生类。C:命名数组的格式错误。D:数组的大小不是多态的,不能任意改变
16.下列代码运行的结果是
public class DemoTest {
public static void main(String[] args) {
String s;
System.out.println("hello" + s);
}
}
A:在控制台打印hello
B:报异常java.lang.NullPointException
C:编译报错
D:报异常java.RuntimeException
答案: C
解析: 局部变量引用类型一定要初始化赋值,在编译阶段就会报错,选择C。
17.下列说法正确的是
public class Student {
private String name;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public static void change(Student s1, Student s2){
Student temp = new Student("王五",20);
temp.name = s1.name;
s1.name = s2.name;
s2.name = temp.name;
}
public static void main(String[] args) {
Student zhangsan = new Student("张三", 18);
Student lisi = new Student("李四", 20);
Student.change(zhangsan, lisi);
System.out.print(zhangsan.toString());
System.out.print(lisi.toString());
}
}
A: Student [name=李四, age=18]Student [name=张三, age=20]
B: Student [name=李四, age=20]Student [name=张三, age=18]
C: Student [name=张三, age=20]Student [name=李四, age=18]
D: Student [name=张三, age=18]Student [name=李四, age=20]
答案: A
解析:在执行change方法前的状态
执行change方法时候的状态
change方法结束
固选A
18.关于java的一些概念那些是正确的?
A:所有的java异常和错误都是java.lang.Exception 包括java.lang.RuntimeException
B:通过try catch finally语句finally无论发生什么异常都会得到执行
C:Java中所有数据都是对象
D:Java语言是跨平台的,无论通过哪个版本编写的java程序,都能在所在的java平台当中运行
答案: B
解析:A:Exception是异常的父类,不是错误的父类。C:基本类型不是对象,没有在堆中开辟空间,C错误。D:低版本不能执行高版本的java程序,D错误
19.下列程序的运行结果
class Two{
Byte x;
}
public class Student {
public static void main(String[] args) {
Student student = new Student();
student.start();
}
void start() {
Two two = new Two();
System.out.print(two.x +" ");
Two two2 = fix(two);
System.out.println(two.x + " "+two2.x);
}
Two fix(Two tt) {
tt.x = 42;
return tt;
}
}
A: null null 42
B:null 42 42
C:0 0 42
D:0 42 42
E:Anexception is thrown at runtime
答案: B
解析:main方法执行了start方法,Two two = new Two();System.out.print(two.x +" ");这时候的two.x没有初始化,是null。Two two2 = fix(two);开辟了two2的空间,并把它执行了 fix(two)的返回结果,fix方法返回一个Two类型的对象(地址值),在fix方法内,把tt.x=42,传入的形参为two(相当于把地址传入),相当于two.x的值修改为42,two2的地址是fix返回的tt的地址。这里的tt,two,two2都指向一个地址。所以two.x和two2.x都是42。
20.以下对异常的描述不正确的是()
A:异常体系分为Error和Exception
B:Throwable是所有异常的父类
C:Exception是所有异常的父类
D:Exception分为运行时异常和非运行时异常
答案: B
解析:Throwable是异常和错误的超(父)