选择题
- 一个抽象类并不需要其中所有的方法都是抽象的。( A )
A.正确
B.错误
解析:
1)抽象类可以包括抽象方法和非抽象方法
2)如果类里面有抽象方法的话,那么类一定要声明为抽象的!
抽象类中可以没有abstract方法,只需在类名前加上abstract - A 派生出子类 B , B 派生出子类 C ,并且在 Java 源代码中有如下声明:
A a0=new A();
A a1 =new B();
A a2=new C();
问以下哪个说法是正确的? ( D)
A.只有第1行能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行、第2行和第3行的声明都是正确的 - 在java中,无论在何处调用,使用静态属性必须以类名做前缀。(B)
A.正确
B.错误
解析:
1如果是本类使用,可以直接就用静态变量名。2如果是其他类使用,可以使用类名来调用,也可以创建一个实例对象来调用。3如果静态变量所在的类是静态类,那么不管在本类里或者在其他外部类,都可以直接使用静态变量名。 - 以下代码执行后输出结果为( A)
public class ClassTest{
String str = new String("hello");
char[] ch = {'a','b','c'};
public void fun(String str, char ch[]){
str="world";
ch[0]='d';
}
public static void main(String[] args) {
ClassTest test1 = new ClassTest();
test1.fun(test1.str,test1.ch);
System.out.print(test1.str + " and ");
System.out.print(test1.ch);
}
}
A.hello and dbc
B.world and abc
C.hello and abc
D.world and dbc
解析:
这道题里方法中修改值都是修改形参的值,区别是一个通过形参修改堆值,而另一个仅仅只是修改形参。
详细分析一下:
char[] ch = {‘a’,‘b’,‘c’};是数组,数组存放在堆中,所以当方法通过形参修改值时会去堆中修改。当成员变量ch再去访问时,堆中的值已经修改,所以输出dbc。
而String str = new String(“hello”);会进行两步操作:
1、先在堆中创建一个指定的对象"hello",并让str引用指向该对象。
2、在常量池中 寻找或新建 一个”hello”,并让堆中对象与之关联。
所以当方法为形参赋值时(str=“world”;),只是为形参在常量池中新建一个”world”并引用,也只修改了形参,成员变量str本身未被修改。
所以,当new了除String以外的对象时,即便通过形参修改值也会去堆中修改。
所以,当String str = new String(“hello”);时产生了1-2个对象。
Java的栈、堆、常量池和方法区。
在jdk1.7已经将运行时常量池放入堆内存中了。栈存放引用;堆存放new对象和数组;常量池存放常量。方法区——方法中的局部变量,存放在方法运行时临时建立的方法栈中,其随着栈的销毁而结束。
- 在java的一个异常处理中,可以包含多个的语句块是 ( D)。
A.try
B.finally
C.throws
D.catch
解析:
异常处理一般格式:
捕获异常:
try{
//代码块
}catch(异常类型,例如:Exception e){
//需要抛出的异常,例如:e.printStackTrace();
}catch(异常类型){
//需要抛出的异常
}finally{
//必定执行的代码块
}
所以说在一个异常处理中catch语句块是可以多个的,也就是可以抛出多个异常!
- 假设有以下代码
String s = "hello";
String t = "hello";
char c[] = {'h', 'e', 'l', 'l', 'o'};
下列选项中返回false的语句是:(B)
A.s.equals(t);
B.t.equals©;
C.s==t;
D.t.equals(new String (“hello”));
解析:
String s = "hello";
String t = "hello";
char c [ ] = {'h','e','1','1','o'};
System.out.println(s.equals (t)); //true s和t指向内存常量区的同一个字符串 ;
System.out.println(t.equals (c));//false 一个返回字符串,一个返回对象 ;
System.out.println(s==t);// true s和t指向内存常量区的同一个字符串 ;
System.out.println(t.equals (new String ("hello")));//true equal用于比较
两个对象的值是否相同,和内存地址无关
- 以下哪一个不是赋值符号?(C)
A.+=
B.<<=
C.<<<=
D.>>>=
解析:
A.很明显是赋值符号
B.<<=左移赋值
C.不是
D.>>>= 右移赋值,左边空出的位以0填充 - (B)
A.505000
B.0
C.运行时错误
D.5050
解析:
count = count ++;这个先将count这个值0暂存起来,然后count自加1变成1,最后将暂存的值赋值给count,count最终的值为0。 - 下面的对象创建方法中哪些会调用构造方法 (AC)?
A.new语句创建对象
B.调用Java.io.ObjectInputStream的readObject方法
C.java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
D.调用对象的clone()方法
解析:
题目的四个选项是构造方法new,序列化对象,反射,克隆分别创建一个对象的方法,,只有new和反射用到了构造方法。 - 下列代码片段中,存在编译错误的语句是(BCD)
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*语句1*/
b6=b4+b5; /*语句2*/
b8=(b1+b4); /*语句3*/
b7=(b2+b5); /*语句4*/
System.out.println(b3+b6);
A.语句2
B.语句1
C.语句3
D.语句4
解析:
本题答案应为:B、C、D
------------知识点------------
Java表达式转型规则由低到高转换:
1、所有的byte,short,char型的值将被提升为int型;
2、如果有一个操作数是long型,计算结果是long型;
3、如果有一个操作数是float型,计算结果是float型;
4、如果有一个操作数是double型,计算结果是double型;
5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。
--------------解析--------------
语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;
语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型;
语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);
语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变。