Java 错题整理

195 阅读6分钟
  1. 请给出最终输出内容(it me
 int i = 3;
String result = new String();
switch (i) {
case 1:
result = result + "him ";
case 2:
result = result + "her ";
case 3:
result = result + "it ";
default:
result = result + "me ";
}
System.out.println(result);

解:没有break,会产生穿透,从满足条件的case开始执行到底

  1. 若有下列定义,下列哪个表达式返回false?(B)
String s = "hello";
String t = "hello";
char c[] = {'h', 'e', 'l', 'l', 'o'} ;

A s.equals(t);
B t.equals(c);
C s==t;
D t.equals(new String("hello"));

解:和t两个String类型变量都是常量池中的字符串,只有变量名不同是可以用双等号判断是否相等的,内存都是常量池中的字符串。

因此A,C正确,String类型重写了equals方法,用于判断字符串内容是否相等,t和new出来的"hello"内容显然是相等的,D正确。

String底层源码的equals()方法处有判断这个参数是不是String类的实例,如果不是则不执行判断直接返回false。B错误

  1. 在java中重写方法应遵循规则的包括()

可以有不同的访问修饰符

参数列表必须完全与被重写的方法相同

注解:

方法重写要注意的事项:
    1.方法重写时, 方法名与形参列表必须一致。
    2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
    3.方法重写时,子类的返回值类型必须要小于或者等于父类的返回值类型。
    4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。
            Exception(大)
            RuntimeException(小)

4.下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试(C)

A java
B javadoc
C jdb
D javaprof

解: java.exe是java虚拟机

javadoc.exe用来制作java文档

jdb.exe是java的调试器

javaprof,exe是剖析工具

  1. 关于java编译和运行命令叙述不正确的是?  (A)
A 运行“java Scut.class”
B 运行“java Scut”
C 编译 Scut.java文件,使用“javac Scut.java”命令的输出文件是Scut.class
D java这个命令的运行对象是Scut.class

解:A  错误 运行命令是java + 你的 Java 程序的名字但是不加后缀所以这道题错在多了 .class这个后缀

B  正确

C  javac 是编译命令,后跟 你的 Java 程序名字加后缀,也就是 YourClassName.java 所以答案正确

D JVM (Java 虚拟机)运行的是编译后的字节码文件(以.class为后缀的文件) ,也就是 YourClassName.class 所以答案正确

  1. 下面哪几个函数 public void example(){....} 的重载函数?(AD)
A public void example(int m){...}
B public int example(){..}
C public void example2(){..}
D public int example(int m,float f){...}

解:函数方法名必须相同,看参数列表即可,无关返回值。

  1. 以下类定义中的错误是什么?(方法没有正确定义)
abstract class xy
{
    abstract sum (int x, int y) { }
}

解:抽象方法不可以有方法体

  1. 关于身份证号,以下正确的正则表达式为( AC )
A isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
B isIDCard=/^[1-9]\d{7}((9\d)|(1[0-2]))(([0|1|2]\d)|3[9-1])\d{3}$/;
C isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
D isIDCard=/^[1-9]\d{5}[1-9]\d{3}((9\d)|(1[9-2]))(([0|1|2]\d)|3[9-1])\d{4}$/;

解:A选项:isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/

C选项:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/  
^:起始符号,^x表示以x开头  
$:结束符号,x$表示以x结尾  
[n-m]:表示从n到m的数字  
\d:表示数字,等同于[0-9]  
X{m}:表示由m个X字符构成,\d{4}表示4位数字  
  
15位身份证的构成:六位出生地区码+六位出身日期码+三位顺序码  
18位身份证的构成:六位出生地区码+八位出生日期码+三位顺序码+一位校验码  
  
C选项的构成:  
[1-9]\d{5}:六位出生地区码,出生地区码没有以0开头,因此第一位为[1-9][1-9]\d{3}:八位出生日期码的四位年份,同样年份没有以0开头。  
((0\d)|(1[0-2])):八位出生日期码的两位月份,| 表示或者,月份的形式为0\d或者是101112。  
(([0|1|2]\d)|3[0-1]):八位出生日期码的两位日期,日期由0131。  
\d{4}:三位顺序码+一位校验码,共四位。  
A选项的构成:  
[1-9]\d{7}:六位出生地区码+两位出生日期码的年份,这里的年份指后两位,因此没有第一位不能为0的限制,所以合并了。  
后面的与C选项类似了。

  1. 往OuterClass类的代码段中插入内部类声明, 哪一个是错误的:(ABCD)
public class OuterClass{
    private float f=1.0f;
    //插入代码到这里
}

A class InnerClass{ public static float func(){return f;} }
B abstract class InnerClass{ public abstract float func(){} }
C static class InnerClass{ protected static float func(){return f;} }
D public class InnerClass{ static float func(){return f;} }

解:1.静态内部类才可以声明静态方法

2.静态方法不可以使用非静态变量

3.抽象方法不可以有函数体

  1. 关于String、StringBuffer、StringBuilder以下说法错误的是(C)
A StringBuilder运行速度最快
B StringBuffer是线程安全的
C String的值是可变的
D StringBuffer运行速度比String

解:String是final修饰的,不可变

在运行速度上StringBuffer因为兼顾了线程安全,效率不及StringBuilder

StringBuffer是线程安全的

  1. 程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。

    关于变量的叙述,正确的是()

A 根据作用域规则,在函数中定义的变量只能在函数中引用
B 在函数中定义的变量,其生存期为整个程序执行期间
C 在函数中定义的变量不能与其所在函数的形参同名
D 在函数中定义的变量,其存储单元在内存的栈区
D为什么是对的

首先说明栈内存和堆内存里存放的是什么

-   栈内存中存放函数中定义的一些基本类型的变量和对象的引用变量;
-   堆内存中存放new创建的对象和数组。

简单的来说,堆主要是用来存放对象的,栈主要是用来执行程序的

这么做是因为

-   栈的存取速度快,栈数据可以共享,但是栈中的数据大小和生存期必须确定,缺乏灵活性中存放一些基本类型的对象和对象句柄
-   堆是操作系统分配给自己内存,由于从操作系统管理的内存分配,所以再分配和销毁时都需要占用时间,因此用堆的效率非常低,
    但是优点在于编译器不需要指导从堆里分配多少存储控件,也不需要知道存储的数据要再堆里停留多长事件,因此用堆保存数据时会得到更大的灵活性