java考核题的错题积累
一.选择题
1.下列不可做为Java语言标识符的是:A,D,F,H
A. /aa B. $2 C. _2 D. 22 E.二二
F. Float G. a2 H. 2a
考点:
标识符的命名规则:
-合格的标识符只能由数字,字母,下划线,美元符组成
-不能由数字开头
-关键字不能做标识符
注意:所以汉字、日语、韩文都可做标识符
2.下列有关继承的叙述正确的是:B
A.在java中只允许单一继承(可以多层继承)
B.在java中一个类只能实现一个接口
C.在java中一个类不能同时实现一个类和实现一个接口(在java中一个类可以同时实现一个类和实现一个接口)
D.在java中接口只允许单一继承(可以多重继承)
二.判断题
1.一个java源文件中可以有多个类,但只能有一个类是public的(√)
原因:每个编译单元都有单一的公共接口,用public类来实现
2.有的类定义时可以不定义构造函数,所以构造函数不是必需的(×)
原因:不定义会使用默认的构造函数,并不代表不存在
三.程序判断题
1.下面代码的结果是什么?还是抛出异常?
public class Test2{
public static void main(String[] args){
int i1 = 10,i2 = 10;
System.out.println("i1+ i2 = " + i1 + i2);
System.out.println("i1 - i2 = " + i1 - i2);
System.out.println("i1 * i2 = " + i1* i2);
System.out.println("i1 / i2 = " + i1 / i2);
}
}
结果:
i1 + i2 = 10 + 10
抛出异常
i1 * i2 = 100
i1 / i2 = 1
注:-,+优先级相同,且-,+是自左向右结合,第二个输出字符串不能进行加减运算
2.以下代码的结果是什么?
class Base{
}
public class Test4{
public static void main(String[] args){
new Test4().method();
}
//注:getSuperclass()方法的作用是获取当前类继承的父类
public void method(){
System.out.println(this.getClass().getName());
System.out.println(super.getClass().getName());
System.out.println(this.getClass().getSuperclass().getName());
System.out.println(super.getClass().getSuperclass().getName());
}
}
结果:
Test4
Test4
Object
Object
注:所有类的根父类为java.lang.Object
3.输出什么?
public class Test5{
public static void main(String[] args){
String str1 = "666";
System.out.println("str1=="666");
System.out.println(12 - 11.9 == 0.1);
}
}
结果:
true
false(第二个判断是从右向左开始,由于11.9!=0.1,所以为false)
4.请从下列的抽象类shape类扩展出一个名为Rectangle的类表示矩形,这个类包括:两个名为width和height的double型数据域作为私有成员,它们分别表示矩形的宽和高。width和height的默认值都为1,一个无参构造法,一个名为width和height指定值的矩形构造方法。一个名为getArea()的方法返回这个矩形的面积。一个名为getPerimeter()的方法返回这个矩形的周长。
public abstract class shape{//求抽象类
public abstract double getArea();//求面积
public abstract double getPrimeter();//求周长
}
结果:
class Rectangle extends shape{
public Rectangle() {
}
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
private double width;
private double height;
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
return width*height;
}
public double getPerimeter() {
return 2*(width+height);
}
}
四.算法题
1.删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。
示例1:
给定数组nums = [1,1,2],函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1,2。你不需要考虑数组中超出新长度后面的元素。
示例2:
给定nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度5,并且原数组nums的前五个元素被修改为0,1,2,3,4。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整形,但输入的答案是数组呢?
请注意:输入数组是以[引用]方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
//nums是以”引用“方式传递的,也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
//在函数里修改数组对于调用者是可见的。
//根据你的函数返回的长度,它会打印出数组中该长度范围内所有元素
for(int i=0;i<len;i++){
print(nums[i]);
}
模板:
class Solution{
public int removeDuplicates(int[] nums){
}
}
代码:
public int removeDuplicates(int[] nums) {
/*首先应该判断是否为空数组*/
if(nums == null||nums.length ==0){
return 0;
}
int k=1;
for(int i=1;i<nums.length;i++){
if(nums[i]!=nums[i-1]){
nums[k++]=nums[i];
}
}
return k;
}
五.加分题
1.String字符串类对象有哪两种创建方法,两者之间的区别是什么?
2.两个对象值相同(x.equals(y) ==== true,它们的hash code应当相同。
ture),但却可有不同的hash code,这句话对不对?
结果:
1.
①直接赋值
②通过String类型的构造方法创建对象
不同点:直接赋值方式创建对象是在方法区的常量池(方法区里存储着class文件的信息和动态常量池,class文件的信息包括类信息和静态常量池。可以将类的信息是对class文件内容的一个框架,里面具体的内容通过常量池来存储。),而构造方法的方式创建对象是在堆空间
2.
不对,如果两个对象 x 和 y 满足 x.equals(y) Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals 方法返回 true ),那么它们的 hashCode 值一定要相同;(2)如果两个对象的 hashCode 相同,它们并不一定相同。
补充:equals()方法没有重写的话,用于判断对象的内存储值是否用同一个地址;重写之后一般比较对象的内容是否相等