爪哇基础题10

1.对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。(B)

A 正确

B 错误

异常的题已经做过两次了,是个高频题,在此进行巩固,再学习一下运行时异常和编译时异常的区别。

java中的异常被分为编译时异常和运行时异常。编译时异常必须显示处理,否则程序发生错误;运行时异常无需处理,也可和编译时异常做相同处理。

如下程序为运行时异常,arr[3]肯定无法访问,会出错,但是写的时候也就是编译的时候,没有报错,而运行后会报错(ArrayIndexOutOfBoundsException),所以称之为运行时问题。

public void method(){
	int[] arr = {1,2,3};
  	int c = arr[3];
}

如下为编译时异常,在parse出会爆红,有错误,编译时就出现了,必须显示处理,否则编译不通过,都到不了运行那一步,用try\catch处理。编译时异常是有可能出现异常,并不代表一定会出现异常, 只是提示一下做个准备。

public void method(){
  try{
	String s = "2048-08-09";
  	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  	Date d = sdf.parse(s);
  	System.out.println(d);
  }catch(ParseException e){
  	e.printStackTrace;
  }

}


2.下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:(B)

byte[] src,dst;

A dst=String.fromBytes(src,"GBK").getBytes("UTF-8")

B dst=new String(src,"GBK").getBytes("UTF-8")

C dst=new String("GBK",src).getBytes()

D dst=String.encode(String.decode(src,"GBK")),"UTF-8" )

字符串的编码解码问题,初学。

编码:

  • byte[] getBytes():使用平台(IDEA)的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
  • byte[] getBytes(String charsetName):适用指定的字符集将String编码为一系列字节,将结果存储到新的字节数组中。

解码:

  • String(byte[] bytes):通过平台默认的字符集解码指定的字节数组来构造新的String
  • String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

默认字符集为UTF-8,用三个字节表示一个汉字。

String s = "中国";
byte[] bytes = s.getBytes();
System.out.println(Arrays.toString(bytes));//[-28, -72, -83, -27, -101, -67]

指定字符集编码,指定为"UTF-8"

String s = "中国";
byte[] bytes = s.getBytes("UTF-8");
System.out.println(Arrays.toString(bytes));//[-28, -72, -83, -27, -101, -67]

再指定成GBK,两个字节表示一个汉字。

String s = "中国";
byte[] bytes = s.getBytes("GBK");
System.out.println(Arrays.toString(bytes));//[-42, -48, -71, -6]

通过平台默认方式解码

String s = "中国";
byte[] bytes = s.getBytes();
System.out.println(Arrays.toString(bytes));
String ss = new String(bytes);//中国
System.out.println(ss);

指定字符集解码,GBK。这里是有问题的,因为编码的时候用的UTF-8,需要把编码改成GBK

String s = "中国";
byte[] bytes = s.getBytes();
System.out.println(Arrays.toString(bytes));
String ss = new String(bytes,"GBK");//涓浗
System.out.println(ss);
String s = "中国";
byte[] bytes = s.getBytes("GBK");
System.out.println(Arrays.toString(bytes));
String ss = new String(bytes,"GBK");//中国
System.out.println(ss);

到这里此题选项就能选出来了,先把按GBK解码还原字符串,再按UTF-8编码。

3.对于如下代码段

class A{
    public A foo() {
        return this;
    }
}
class B extends A {
    public A foo(){
        return this;
    }
}
class C extends B {
    _______
 
}

可以放入到横线位置,使程序正确编译运行,而且不产生错误的选项是( C)

A public void foo(){}

B public int foo(){return 1;}

C public A foo(B b){return b;}

D public A foo(){return A;}

此题考查有关方法重写的内容,首先来看方法重写。

每一个类都有自己的虚方法表,每个类会把非private、非static、非final的方法存放在虚方法表中。存在继承关系时,子类会把父类虚方法表中的方法存放到自己的虚方法表中,然后再往里添加自己的方法。在子类中发生了方法重写,在子类中的虚方法表就会发生覆盖,不再是父类的了,而是自己的,本质就是覆盖了虚方法表中的方法而已

B中重写了method2,A中重写了B的method2。此时创建B的对象,B.method1()调用的C类中的method1,而B.method2调用的是B自己的,同理A.method2也是调用自己的方法。

重写注意事项:

1.重写方法的名称已经返回值类型必须和父类一致,也就是说只能改父类的方法体。

2.子类重写的方法访问权限必须大于等于父类(暂时了解:空着不写<protected<public)

3.子类重写方法时,返回值类型子类必须小于等于父类

建议:重写的时候子类尽可能和父类保持一致。

此时看选项,AB参数列表和方法名同父类一致,所以是重写,但是返回值类型和父类没有继承关系,所以错误。D选项返回了一个类就是不对的。C选项因为题目没说是重写还是重载,所以就会有重载的情况,C中的方法参数列表不同,不是重写而是重载,这里因为C继承了B,所以C中也有B的foo方法,所以C正确。

额外补充一点,这次还有一道重写重载的题做错了,文字题是真的难做,稍不注意就错了,也是我太菜了。这题结论就是:重载是一个类中多态性的表现,重写是父类与子类之间多态性的表现

#你的秋招进展怎么样了##我的求职思考##如何看待2023届秋招##0offer是寒冬太冷还是我太菜#
java基础知识 文章被收录于专栏

我是一个转码的小白,平时会在牛客中做选择题,在做题中遇到不会的内容就会去找视频或者文章学习,以此不断积累知识。这个专栏主要是记录一些我通过做题所学到的基础知识,希望能对大家有帮助

全部评论

相关推荐

评论
34
2
分享
牛客网
牛客企业服务