爪哇基础题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是寒冬太冷还是我太菜#我是一个转码的小白,平时会在牛客中做选择题,在做题中遇到不会的内容就会去找视频或者文章学习,以此不断积累知识。这个专栏主要是记录一些我通过做题所学到的基础知识,希望能对大家有帮助