来源视频:https://www.bilibili.com/video/BV16V411e7qe
笔记整理:yijia
目录
一、面向过程环节
1、java标识符你真的会用吗
2、类名和java文件名是什么关系
3、java数据类型关系
4、java的循环竟然还能这么玩涨姿势了
5、三元运算符这么玩是认真的吗
6、局部变量使用的奥秘
7、多变量定义和前加加综合
8、主方法main竟然还可以这么写
9、下面哪个是死循环?
10、字符(串)拼接的坑爹题
11、java基础的变量定义这么玩
12、下面的变量定义哪个是正确的?
13、switch这题选什么?
14、后加加、前减减这题选什么?
15、如此坑的java基础题还是第一次见
16、短路与和短路或的玩法
17、java值传递的原来是这么回事
18、java基本数据类型百变不离其宗
19、局部变量作用域如何理解
20、短路运算符原来要这么理解
21、默认的整数真的是int类型吗
22、下面程序的运行结果是什么?
23、方法返回值的题要怎么选
24、方法的定义下面错误的是?
25、理解单与号&的另外一层含义
26、这个数组怎么会报错呢?
27、数组定义方式哪个是错误的?
二、面向对象环节
28、方法重载说法错误的是?
29、下面哪个是方法的重载呢?
30、构造方法下面正确的是?
31、关于类的说法不正确的是?
32、java中哪个包是自动导入?
33、下面构造器定义正确的是?
34、抽象方法的定义
35、一道可以把接口玩转的题
36、修饰符可以放在哪里呢?
37、一个类实现多个接口哪个是正确的?
38、java真的单继承吗?
39、this关键字的检测题
40、看程序关于构造器的调用选什么
41、一个类可以定义多少个构造器
42、类属性和类方法真的懂吗?
43、关于接口定义下面说法正确的?
44、关于抽象类说法正确的是哪个呢
45、关于final下面描述正确的是
46、关于抽象类和接口正确的是?
47、关于接口常量定义正确的是
48、关于构造器下面说法正确的是
49、下面程序运行结果是
50、关于构造器下面程序运行结果是什么
51、下面程序哪一行编译是错误的
52、关于类的构造器下面程序结果是
53、关于构造器的继承下面程序运行结果是
54、父子类继承构造器本题选什么
55、90%的人都会选错的一道题
56、多态里面最重要的父子类转换
57、多态题下面程序运行结果是什么
58、子类重写方法程序运行结果是什么
59、下面哪种是多态形式的方法调用
60、99%都会答错的多态题
61、关于构造器调用下面说法正确的是哪个
62、如何判断父类的真身是什么
63、无数人答错的一道烧脑题
64、方法重载的变态坑爹题
65、对象创建的属性赋值流程你真的懂吗
66、类属性加载流程和单例的综合
异常
67、所有异常类都继承于哪个类
68、关于异常下面说法正确的是
69、多个catch的排列方式是
70、关于异常下面说法正确的是
71、异常程序题输出什么
72、关于异常清理工作下面选哪个
73、关于finally下面程序返回结果是
74、关于String说法正确的是
75、关于比较下面说法正确的是
76、关于字符串长度下面正确的是
77、关于字符串创建个数哪个正确呢
78、字符串比较下面正确的是
79、关于字符串拆分下面哪个正确
80、关于字符串截取下面说法正确的是
81、关于可变字符串下面说法正确的
82、那些是编译期的异常
83、下面关于final,finally,finalize错误的
84、下面程序结果正确的是
85、下面关于包装类说法正确的是
86、下面包装类说法错误的是
87、关于随机数下面哪个是正确的
答案:BCDE
解析:标识符的规范: 26 个字母,数字,_,$。数字不能开头。A中数字开头了,F中#不合法,G中¥虽然能编译通过(¥是中文符号,中文字符是可以编译通过的),但是不是规范。
答案:AD
解析:
答案:D
解析:java中基本数据类型占用的字节数:byte(1)、short(2)、int(4)、long(8)、float(4)、double(8)、boolean(1)、char(2)。数值类型表数范围依次增大。
答案:C
解析:
A中循环条件要以表达式的方式来体现,计算结果是boolean类型,不能在条件中定义变量。
B中循环条件必须是boolean类型,编译时会提示"不兼容的类型: int无法转换为boolean"
D中的loop应该用于标识一个循环,在嵌套循环中用于标识内外层循环。标识符可自定义。
答案:C
解析:数值类型变量在做运算的时候,会自动把低精度的数值往高精度的数值类型转换。小数默认为double类型。
答案:D
解析:局部变量在使用之前一定要初始化。
答案:D
解析:i在前加加之后变为了2,再将2赋值给j。同一种类型的变量同时定义,可以省略后面变量的类型声明,且需要用逗号分隔。
答案:AD
解析:java中main方法"psvm"是固定写法,缺一不可。入参则是一个字符串数组,遵循入参的写法即可,写法可以不一样,因此还可以这样写:public static void main(String... args) 。
答案:C
解析:考察数值类型的边界问题。int类型表述整数的时候有范围,因此题干中说明了不考虑极值的情况。如果不说明这一点,则C答案在k达到边界值的时候就会停下来。
答案:D
解析:代码中的5是字符,并不是用双引号引起来的字符串,因此在和数值做运算的时候,会转为ASCII码,5对应的ASCII码是53因此相加是55。
答案:BCD
解析:A中byte的表数范围是-128~127。B中是boolean类型的包装类。C中0x表示16进制数,L表示是long类型。D中的d表示是double类型。
答案:A
解析:A中的L表示long类型,long类型是可以转换为float类型的,表数范围小的类型可以转换为表数范围大的类型。B中的字符类型要用单引号而不是双引号。C中的boolean是基本数据类型,null是包装类/类的默认值。D中的double类型是不可以自动转成int的,要转只能使用强转。
答案:B
解析:case会穿透执行,如果执行匹配一个,则需要在case中加上break。long类型的数值不能转成int类型的值去返回,如果需要返回int,应该先在程序中转换成int后再返回。
答案:B
解析:i在和2相乘后变为了2,参与运算的是1这个值,在和3相乘时先由2自减为1再运算,参与运算的是1这个值。因此最终i的值为1,j的值为1*2+3*1=5。
答案:C
解析:考察jvm的栈帧以及字节码。核心代码num = num++;分析字节码。局部变量表存放变量真实的值,操作数栈存放操作过程的临时结果。
初学阶段记住i = i++无效即可。
答案:D
解析:没有括号的if,if体就是这个下面的第一行。“||”是短路或,第一个表达式是true后,后面的表达式将不会再执行。如果使用“|”,结果就是101和21。
答案:B
解析:考察Java的值传递。
答案:B
解析:int类型和int类型做运算,最终得到的是int类型,因为题目中的答案应该是2。如果将int改为float,结果将是2.5。1.0f == 1的结果是true。
答案:A
解析:局部变量的作用域在它定义时的大括号内部。
答案:BD
解析:考察短路运算符。&&如果左边是false,则后面不再执行。如果||左边是true,则后面不再执行。(只要左边能够确定最终的结果,后面的表达式就不再执行。)
答案:ABCD
解析:整数的默认类型是具体数值所处最小能够表述该数的类型。在计算后,将结果具体的类型转化为定义变量的类型再赋值。如:int i = 97中的97是byte类型,由byte转成int后再赋值。原理就是在操作数栈中分配最小能够容纳该操作数的空间。
答案:C
解析:if中的=为赋值符号,因此是在赋值后再判断flag的值。
答案:AD
解析:
有返回值的方法必须通过return返回一个值,A中使用了return但是未返回值。
返回的值的数据类型要小于等于方法中声明的数据类型,(也就是说如果返回的数据类型和声明的数据类型不一致,返回的数据类型需要能够自动转换为声明的类型),D中的double无法自动转换为float。
没有返回值的方法不需要使用return,如果使用了return,不需要携带返回值,唯一的含义表示结束该方法。
答案:CD
解析:类中的构造方法没有返回值,不能声明返回值类型,因此C选项错误。void方法中可以有return,用于结束方法。
答案:C
解析:&可以用作逻辑运算符,也可以用作位运算符。本题中用于二进制的位运算。
4 = 0100, 5 = 0101;4&5 = 0100 & 0101 = 0100 = 4。
答案:B
解析:数组的索引是从0开始的,因此i[5]会发生数组越界异常(运行时异常)。数组在声明的时候没有给定初始值,那么元素的初始值就是元素类型的默认值。
答案:D
解析:A是常规定义数组的方式,B是直接初始化的方式,C是定义并初始化,由于初始化的列表中能体现数组的长度,因此不用再声明长度,所以D错误。
AB常用于需要先定义再赋值的情况,C常用于不需要提前定义的情况,一般就是在方法调用传参的时候,定义并初始化数组直接传入。
答案:CD
解析:方法重载对返回值以及重载的次数没有要求。
答案:AC
解析:BD中参数列表一致,因此是相同方法,返回值类型不是决定因素。
答案:AB
解析:
A中,构造方法不能被继承,父类的构造方法只能在子类构造方法且在方法体第一行中通过super()调用。
B中,重写发生在继承关系中,由于构造方法不能被继承,因此也无法被重写。
C中,重载发生在同一个类中,同一个类中可以有不同参数列表的构造方法,因此可以重载。
D中,构造方法可以声明为private,此时只能在类中调用该构造方法,在单例模式中有所体现。
答案:D
解析:概念题。
答案:B
解析:java.lang是Java语言的核心包,在使用该包下的类时不需要import,默认导入。
答案:BC
解析:构造器的名字必须和类名一样,可以有不同的权限修饰符,不能有返回值。如果C中的MyClass改为myClass就不对了。
答案:B
解析:考察抽象类以及抽象方法的作用。
答案:A
解析:在jdk1.8中接口中的方法可以是static的,也可以用default进行默认实现。
在类中,四种修饰符的作用域如下:
而在接口中,所有的方法一定都是public的,public在1.8是可以省略的,这和类中省略修饰符的作用域有所区别。
定义接口所用的关键字是interface,接口中只能定义常量和属性是不同的概念。
因此,ACD错误。
答案:DE
解析:DE不可以修饰在外部类中,但是内部类中是可以的。
答案:C
解析:考察类实现多个接口的语法。
答案:CD
解析:单继承只是针对java中的类的,而接口是可以多继承的。一个类可以实现多个接口。
接口中的菱形继承:D中继承下来的方法其实是一样的,因此会合并成一个。(在1.8由于有了默认实现,因此接口中的菱形继承也要分情况,1.8之前是默认支持的,1.8有默认实现并且子接口有重写的方法是不可以的,没有默认实现也是可以的)
而类中的菱形继承就会带来问题:D类继承了BC类的相同方法,并且都是重写过的,因此无法合并,就会导致同一类中有两个相同的方法,语法错误。
答案:C
解析:this表示类的具体实例对象。在局部变量名和属性名相同的时候,用this来区分二者。
答案:C
解析:super是调用父类构造器的,而且必须要出现在子类构造器的第一行。super省略会默认调用父类的默认构造器。如果父类中的构造器存在重载,在子类中需要显式的调用有参构造器或在父类中显式的声明无参构造器。
答案:D
解析:构造器存在重载现象。
答案:D
解析:考察static关键字,类中加了static关键字的方法和属性成为类方法和类属性。没加的就叫做实例(对象)方法或属性。类方法/属性比实例方法/属性先加载,因此实例的可访问实例和类的,类的只能访问类的。类的属性和方法在类加载的时候就初始化好了。实例的属性和方法在创建对象时初始化。原理请查阅jvm相关知识。
A中,实例方法可以访问实例方法实例变量以及类变量和类方法。
B中,类方法中不可以访问实例变量。
C中,类方法可直接调用。
答案:D
解析:考察接口。
A中,jdk1.8之前说法正确,1.8的接口可以有默认实现。
B中,接口中的变量默认是public static final的,可省略不写,因此必须写明就错误了。
C中,每个实现类实现接口中的方法时,可根据实现类实际需要进行自定义编码。
D中,接口中的抽象方法默认是public abstract,可省略不写。实际上,如果一个类实现接口时没有实现对应接口的全部抽象方法,可以定义成抽象类。因此D选项的说法不严谨,D中应该表达的是实现方法的类而非实现接口的类。
答案:C
解析:A中,抽象类可以实现抽象父类的抽象方法,但是不是必须的,如果实现了抽象方法,后续的实现也就不用必须实现了。
BC中、抽象类和接口是两种不同的Class类型,但是都不能用于实例化。
D中、抽象类中可以有非抽象的方法。
答案:C
解析:考察final关键字。final可以修饰类和属性和方法,都表示不可再修改。final类不可继承,属性不可更改值,方法不可重写。
C中,final成员变量必须初始化(直接初始化和在构造器中初始化),初始化后不能再更改,因此,如果声明之后没有赋值,仅可在构造器中对其初始化。
答案:ACE
解析:
AB,抽象类中可以什么都没有,可以有属性,非抽象方法、抽象方法。A错。
D,接口中,1.8之前接口中的方法都是抽象方法。1.8及之后,可以有default和static方法。
E,接口中的变量都是常量,默认是public final static,可省略,因此必须初始化。
答案:ABCD
解析:同上题E选项。接口中的变量都是常量,默认是public final static,可省略,写出来也是对的,提倡都写出来,提高可读性。
答案:D
解析:
A,类中默认的构造器是隐式的。
B,构造器没有返回值。
C,有参构造器就是有参数的。
D,构造器存在重载,因此可以有多个。
class Penguin { private String name = null; // 名字 private int health = 0; // 健康值 private String sex = null; // 性别 public void Penquin() { health = 10; sex = "雄"; System.out.println("执行构造方法。"); } public void print() { System.out.println("企鹅的名字是" + name + ",健康值是" + health + ",性别是" + sex); } public static void main(String[] args) { Penguin pgn = new Penguin(); pgn.print(); } }
答案:C
解析:构造器没有返回值,因此有返回值的不是构造器。
答案:D
解析:简单题。
答案:D
解析:i是私有的,子类中不能访问。私有属性通过封装对外使用。
52.给定如下一个Java 源文件 Child.java,编译并运行 childjava,以下结果正确的是 ()。
class Parent1 { Parent1(String s) { System.out.println(s); } } class Parent2 extends Parent1 { Parent2() { System.out.println("parent2"); } } public class Child extends Parent2 { public static void main(String[] args) { Child child = new Child(); } }
答案:B
解析:如果父类包含有参构造器,子类的构造器必须显示的调用,或者父类显示声明构造。
class Parent { public String name; public Parent(String pName) { this.name = pName; } } public class Test extends Parent { // 1 public Test(String name) { // 2 name = "hello";// 3 super("kitty");// 4 } }
答案:C
解析:
A,第二行没有错误,但是会提示父类中没有默认构造器。There is no default constructor available in 'Parent'。子类的构造器参数和父类的构造器参数没有直接关系。
B,第三行属性的赋值没有错误。当子类属性和父类属性没有名字冲突的时候,可以直接使用属性名,属性默认用的就是父类中的。
C,对。父类的构造器必须在第一行进行声明。Call to 'super()' must be first statement in constructor body
class One { public One() { System.out.print(1); } } class Two extends One { public Two() { System.out.print(2); } } class Three extends Two { public Three() { System.out.print(3); } } public class Test { public static void main(String[] args) { new Three(); } }
答案:C
解析:继承关系中,子类会默认依次调用父类的默认构造器。
答案:C
解析:考察类方法和对象方法的堆栈结构。IDE会提示:不应该通过类实例访问静态成员,但是能正常运行。
对于null的对象变量,访问对象变量和对象方法时,由于会依赖具体对象,因此都会出现空指针异常。访问类变量和类方法时,由于不依赖对象,因此调用是没有问题的。堆栈结构查阅jvm相关知识。
class ClassA { } class ClassB extends ClassA { } class ClassC extends ClassA { } public class Test { public static void main(String[] args) { ClassA p0 = new ClassA(); ClassB p1 = new ClassB(); ClassC p2 = new ClassC(); ClassA p3 = new ClassB(); ClassA p4 = new ClassC(); // <插入代码> } }
答案:A
解析:
A,子类引用赋值给父类。父类可强转到子类。
BC,子类引用赋值给另一个子类引用(兄弟类)是不允许的。
D,子类不可强转到另一个子类。父类可强转到子类。
注意:
ClassA p5 = new ClassB();
ClassC p6 = new ClassC();
p6 = (ClassC)p5;
中,编译器不报错,但是运行期会报错,不能转换,因为p5虽然是父类的引用,但是是子类的实例,因此p5和p6之间是依然存在子类之间的转换。
总结:多态中,仅可父子类之间转换。
public class Animal { public String noise() { return "peep"; } public static void main(String[] args) { Animal animal = new Dog(); Cat cat = (Cat) animal; System.out.println(cat.noise()); } } class Dog extends Animal { public String noise() { return "bark"; } } class Cat extends Animal { public String noise() { return "meow"; } }
答案:D
解析:考察点是多态,同上提。真身是Dog的类不能强转为Cat。运行时异常。
class SimpleCalc { public int value; public void calculate() { value += 7; } } public class MultiCalc extends SimpleCalc { public void calculate() { value -= 3; } public void calculate(int multiplier) { calculate(); super.calculate(); value *= multiplier; } public static void main(String[] args) { MultiCalc calculator = new MultiCalc(); calculator.calculate(2); System.out.println("Value is: " + calculator.value); } }
答案:A
解析:考察继承、重写、重载。
59、请看下列代码
public abstract class A { abstract void a1(); void a2() { } } class B extends A { void a1() { } void a2() { } } class C extends B { void c1() { } }
和
A x = new B();
C y = new C();
A z = new C();
下列选项中属于多态形式调用方法的是
A.x.a2();
B.z.a2();
C.z.c1();
D.y.c1();
答案:AB
解析:多态调用指的是父类通过自身调用子类重写后的方法。
A,A调用B中重写后的方法
B,A调用C中重写后的方法
C,A中没有c1方法,编译错误。
D,调用C中独有的方法
60、程序执行的结果是:()
class Foo { public int a; public Foo() { a = 3; } public void addFive() { a += 5; } } class Bar extends Foo { public int a; public Bar() { a = 8; } public void addFive() { this.a += 5; } } public class Test { public static void main(String[] args) { Foo foo = new Bar(); foo.addFive(); System.out.println("Value: " + foo.a); } }
答案:A
解析:foo.addFive();是多态调用,调用的是子类重写后的方法,foo.a是调用父类的成员变量,属性没有多态调用。在子类创建的时候,父类的成员变量默认赋值了。因此最终输出为3.
public class Test { public static void main(String[] args) { Child c = new Child(); } } class Father { public Father() { System.out.println("父类无参构造函数"); } public Father(String name) { System.out.println("父类有参构造函数"); } } class Child extends Father { public Child() { this("dd"); System.out.println("子类无参构造函数"); } public Child(String name) { super("dd"); System.out.println("子类有参构造函数"); } }
答案:A
解析:考察继承关系中构造器的调用链。
this和super调用构造器的时候均需要在第一行,不能同时使用,保证构造子类对象时最终调用的构造器能够显式或隐式的调用父类构造器。
this用于调用本类中的其他构造器,使用this后不再调用父类的构造器而是传递给最终调用的构造器调用。super用于调用父类的构造器。
子类构造器中如果显式的调用了父类的有参构造,则父类的默认构造将不再调用。如果没有显式调用,则会在调用的最终构造器中隐式调用父类的默认构造器。
62、下列代码运行的结果是:()
public class Animal { public String noise() { return "peep"; } public static void main(String[] args) { Cat cat = null; Animal animal = new Dog(); if (animal instanceof Cat) { cat = (Cat) animal; System.out.println(cat.noise()); } else { System.out.println("animal is not Cat's instance"); } } } class Dog extends Animal { public String noise() { return "bark"; } } class Cat extends Animal { public String noise() { return "meow"; } }
答案:D
解析:instanceo用于判断实例具体类型,解决子类强转引发的运行时异常。
答案:B
解析:重载方法参数中的多态。子类可以向父类自动转换,但父类只能强转到子类。因此在没有具体匹配的形参类型时,只要是能自动转换的类型,在调用方法传递参数时也可以匹配,在有具体匹配的形参类型时,调用方法不需要自动转换类型,调用精度最高的形参那个方法。
答案:A
解析:重载方法参数中的多态。重载方法中,参数存在父子关系,则传入的参数,以匹配精度最高为准(子类优先级最高)。null是引用数据类型的默认值。如果不存在父子关系,则传入null都匹配,代码编译报错。
答案:D
解析:构造器的作用是为属性初始化值,在执行构造器的时候,会先为有等号的属性赋值,再执行构造器体的内容。
在为i赋值时,j的值是10,当给i赋值完毕后,接着继续给j赋值为0,因此最终i=10,j=0。但是i的输出在赋值之前,因此输出都是0。
总结:new一个对象的时候:1.创建对象,2.为属性后面有等号的赋值属性值,3.执行构造器的方法体。
66、下面的程序运行后输出什么
public class Test { public static void main(String[] args) { Singleton s = Singleton.getSingleton(); System.out.println("counter1 = " + s.counter1); System.out.println("counter2 = " + s.counter2); } } class Singleton { private static Singleton singleton = new Singleton(); public static int counter1; public static int counter2 = 0; private Singleton() { counter1++; counter2++; } public static Singleton getSingleton() { return singleton; } }
答案:B
解析: 类加载的时候会先初始化静态属性(此时,counter1和counter2均为默认值0),然后对有等号的变量进行赋值,在new Singleton()的时候,执行构造器,counter1和counter2都是1。由于counter1后面没有等号,因此不再进行赋值,保持1,counter2后面有等号需要进行赋值,因此变为0。最终静态变量的值就赋值完成。counter1为1,counter2为0。
答案:B
解析:基础题。
答案:D
解析:
A,异常分为运行时异常和编译期异常。
B,程序只有运行到会产生异常的代码时,异常才会被创建。由jvm判断和创建异常对象。
C,异常的控制是为了增强程序的健壮性的,和运行速度无关。
答案:B
解析:异常捕获也是从上到下的,因此应该是精确度最高的在前面。
70、下列程序的执行,说法错误的是()
public class MultiCatch { public static void main(String[] args) { try { int a = args.length; int b = 42 / a; int c[] = {1}; c[42] = 99; System.out.println("b=" + b); } catch (ArithmeticException e) { System.out.println("除0异常:" + e);// 1 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组超越边界异常:" + e);// 2 } } }
答案:D
解析:分情况,如果运行程序的参数是0个,会出现除0异常。如果运行程序传递了参数,则a不为0,会出现数组越界异常。
71、下列程序的执行,说法正确的是()
class ExMulti { static void procedure() { try { int c[] = {1}; c[42] = 99; } catch (ArithmeticException e) { System.out.println("数组超越界限异常:" + e);// 1 } } public static void main(String[] args) { try { procedure(); int a = args.length; int b = 42 / a; System.out.println("b=" + b); } catch (ArithmeticException e) { System.out.println("除0异常:" + e);// 2 } } }
答案:C
解析:由于procedure()方法中的异常未被捕获到,因此1和2处都不会输出。
答案:C
解析:基础题。
73、此方法返回值是多少()
public static int divide() { int i = 3; try { int a = 10 / 0; return i; } catch (Exception e) { i = 4; return i; } finally { i = 5; } }
答案:B
解析:执行顺序依然是try-catch-finally。return用于形成方法的返回值,后续(finally)修改返回的变量是不会影响到方法的返回值的,因此本题中方法的返回值是4。如果在finally形成方法的返回值,方法的最终结果应该是5。finally是唯一一个可以修改返回值的代码块。
答案:B
解析:基础题。C,String在java.lang中,改包是自动引入的。D,String是final类型的,是不可以被继承的。
答案:ABD
解析:考察==和equals。B,对于对象是否相等,没有明确的定义,可以通过比较引用,也可以通过比较内容来判断是否相等。==对于两个对象,比较的是两个对象的引用。CD,equals是一个方法,在Object中定义(默认用==实现),因此是无法用于判断基本数据类型的,只可以比较两个对象。
答案:BD
解析:只有类才有方法,数组不是类,因此数组没有length()方法,只有length属性,String是类,并且有length()方法。
答案:D
解析:考察字符串常量池和堆。 new的对象存在堆中。在创建对象的时候,会判断xyz是否在常量池中。如果存在,对象将指向这个常量的地址。 如果不存在,会先在地中创建一个对象,然后在常量池中创建一个对象。因此,题目中的代码要分情况,答案选D。
78、关于下面的程序说法正确的是()
public class Test { public static void main(String[] args) { String str1 = "xyz"; String str2 = "xyz"; String str3 = new String("xyz"); String str4 = new String("xyz"); } }
答案:AC
解析:题干表达有问题,改为结果为true的是更为准确。
考察的是字符串常量和new对象。str1和str2均指向字符串常量池中的xyz,因此引用相等,A为true。new出的对象存在堆中,每new一个对象都会重新分配空间,因此str3和str4的地址不同,与str1和str2的也不同,B为false。但是str3和str4内部指向的常量依然是xyz,因此四个变量产生了三个地址,内容全部相同,而==比较的是对象的引用,因此C是true,D是false。
答案:C
解析:考察split这个API。split方法传入的不是普通字符串而是一个正则表达式。.在正则中表示任意字符,因此A无法拆分。因此需要对.进行转义,转义时,\也有特殊含义,因此正确的转义应该是\\.。因此C对,B会产生编译错误。D中的表达式无法达到正确的拆分。
答案:D
解析:substring截取子字符串。代码的结果应该是.bb.。这个API的索引从0开始,包头不包尾,需要通过新的变量接收,原来的str不会被改变。
答案:AD
解析:String中的equals重写了,比较的是内容。StringBuffer和StringBuilder中的equals没有重写,比较的是引用。两者append方法返回的this,因此引用相同。
答案:CE
解析:基础题,考察编译期异常,靠平时积累。空指针,下标越界,类转换都是运行异常。IO和文件找不到是编译期异常。
答案:BD
解析:基础题,考察各种说法的严谨性。
A,说法没问题,但是漏掉了局部变量,也表示不可变。
B,总是执行说法绝对,在执行System.exit(-1)退出jvm的时候,finally不再执行。其他情况均会执行。
C,正确。
D,由于final修饰的属性是不可变的,因此在创建类之后必须要有初始值。初始值不一定在声明的地方赋值,也可以在构造器中。因此D的说法偏向于声明时必须赋值初始值就错误了。
答案:B
解析:考察Math.round的用法。Math.round返回最接近入参的int或long。传入double则返回long,传入float返回int。算法为Math.floor(x+0.5) ,即将原来的数字加上 0.5 后再向下取整,所以 Math.round(11.5) 的结果为 12,Math.round(-11.5) 的结果为 -11。
答案:C
解析:可以通过int.class获取到Class类对象。
答案:D
解析:B属于自动装箱,C属于自动拆箱。基本数据类型的包装类只有int和char的单词是不一样的,分别是Integer和Character,其他都是首字母大写,因此D错误。
答案:C
解析:考察基础Random的API。nextInt返回0到边界(不包含)的随机int值。
Returns:the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive) from this random number generator's sequence