Java刷题总结

选择题

  • 一个抽象类并不需要其中所有的方法都是抽象的。( 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修饰,即只可赋值一次,便不可再改变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值