一、选择题(每题1分,共计25分)
- 对系统提供的构造函数下面说法正确的是( D )
- 默认的构造函数初始化方法中的局部变量
- 默认的构造函数不会调用父类的无参数的构造函数
- 默认的构造函数会初始化该类的成员变量
- 只有当没有其他构造函数时,编译器提供默认的构造函数
- 代码如下,运行的结果是( C )
class X {
public static void main(String[] args) {
try {
badMethod();
System.out.print("A");
} catch (Exception ex) {
System.out.print("C");
}
}
public static void badMethod() throws Exception{
System.out.print("B");
throw new Exception();
}
}
- 打印 ABC
- 打印 C
- 打印 BC
- 打印 BCA
- 对于catch子句的排列,下列哪种是正确的( B )
A.父类在先,子类在后
B.子类在先,父类在后
C.有继承关系的异常不能在同一个try程序段内
D.如何排列都可以
- 对于catch子句的排列,下列哪种是正确的( B )
A.父类在先,子类在后
B.子类在先,父类在后
C.有继承关系的异常不能在同一个try程序段内
D.如何排列都可以
5.异常处理正确的是(B)
A. 调用任何可能抛出异常方法,都必须捕捉try catch 或者throws
B. RuntimeException可以不捕捉或者throws
C .throw 跟throws 用法是一样的
D .try 必须有catch,可以没有finally
6.下列属于key—value使用方式是( A )
- HashMap
- ArrayList
- Vector
- LinkedList
7.下面关于 try---catch---finally 语句描述中,错误的是 ( A )
- Try语句后面的程序段一定会出现异常
- Catch()方法可以有多个
- Catch()方法有一个参数,该参数是异常类的对象
- Finally 语句后面的程序段总被执行
8.下列声明哪一种可防止该类产生子类(D)
- static class Test{}
- class Test{}
- abstract class Test{}
- final class Test{}
9.关于接口说法错误的是(D)
- 接口中的属性都是静态的常量
- 接口内只能有抽象的方法
- 接口可以继承另一个接口
- 一个类只能实现一个接口
10.程序段如下( B )
class Child {
public static void main(String [] args){
int index=1;
int foo[] = new int[3];
int x =foo[index];
int y=x+index;
}
}
-
- y的值是0
- y的值是1
- y的值是2
- 编译错误
11.程序的执行结果是( D )
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 子类无参构造函数 子类有参构造函数 父类无参构造函数
B 子类有参构造函数 子类无参构造函数 父类无参构造函数
C 父类无参构造函数 子类有参构造函数 子类无参构造函数
D 父类有参构造函数 子类有参构造函数 子类无参构造函数
12.下面哪个方法可以应用于类和类之间的继承( A )
A extends
B implements
C class
D interface
13.下列关于java多态阐述正确的是( C )
A Java的多态中动态加载是方法重载
B Java的多态中静态加载是方法重写
C Java多态父类引用指向子类对象,调用父类方法,实现结果为子类重写以后的是动态加载
D 以上说法全不正确
14.String的父类是以下哪个? (A)
A. Object B. StringBuffer C. StringBuilder D. 没有父类
15.下面初始化二维数组语句中,正确的是( B)
A、float b[2][2] = {0.1,0.2,0.3,0.4} B、int a[][] = {{1,2},{3,4}};
C、int a[2][]= {{1,2},{,3,4}} D、float a[2][2] ={0};
16、下列代码执行后i和j的值分别是什么( C )
Int i = 1;
Int j;
J = i++;
A、1,1
B、1,2
C、2,1
D、2,2
17、下面哪个表达式的数值与数组下标总量相等?(B)
- m.length();
- m.length
- m.length()+1;
- m.length-1;
18、下列代码的运行结果为( D )
Public static void main(String args[]){
Int x = 1;
Int y = 1;
Int z = 1;
If(x--==1&&y--==1||z--==1){
System.out.println(“x=”+x+”,y=” +y+” ,z=”+ z);
}
}
- x = 0,y = 1,z = 1;
- x= 0,y = 2,z = 2;
- X = 0, y = 2,z = 1;
- x = 0,y = 0,z = 1
19、下列哪种说法是正确的( A )
A. 实例方法可直接调用超类的实例方法
B. 实例方法可直接调用超类的类方法
C. 实例方法可直接调用其他类的实例方法
D. 实例方法可直接调用本类的类方法
20、在Java中,下面关于构造函数的描述正确的是( D )
A、类必须有显式构造函数
B、它的返回类型是void
C、它和类有相同的名称,但它不能带任何参数
D、以上皆非
21、下列说法错误的有(A,C)
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法时可直接调用
C. 在类方法中只能直接调用本类中的类方法
22、下列说法正确的有(B,C)
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new时执行
D. 一个class只能定义一个constructor
- 下列代码的输出结果是 (A)
Public static void main(String args[]){
Int a = 54;
Int b = 5;
System.out.println(a/b);
}
A、10
B、10.20
C、10.2
D、10.0
24、 在类的说明符中,被指定为私有的数据可以被以下(C)访问
A、程序中的任何函数
B、其他类的成员函数
C、类中的成员函数
D、派生类中的成员函数
25、 在类的说明符中,被指定为私有的数据可以被以下( C )访问。
A、程序中的任何函数
B、其他类的成员函数
C、类中的成员函数
D、派生类中的成员函数
- 简答题(每题2分,共计60分)
- 请描述你理解的数据类型?
数据类型分为基本数据类型和引用数据类型,基本数据类型有8种 分别为byte,short,int,long,float,double,boolean,char,对应的字节分别是1字节,2字节,4字节,8字节,4字节,8字节,1字节,2字节。引用数据类型则主要有类,接口,数组,枚举等。
- 地址传递和值传递的区别?
地址传递通过改变地址从而实现数据的传递,发生在jvm的堆中
值传递只会改变数值的大小并不会改变地址,发生在jvm的栈中
- 前置++和后置++的区别
前置++是先进行+1操作再执行后续操作
后续++是先执行具体操作再进行+1
- 逻辑运算符&&和&的区别
&&(短路与)其在前面的判断是false时就不会再去判断后面的语句而&会在判断完前面的为false后还会去判断后面的语句是否为false
- 请描述嵌套for循环执行的过程
嵌套for循环是在外层执行一次的情况下内层会执行若干次
- 为什么要重写toString()方法?
如若不重写toString()方法,输出的是地址。那么它的可读性是很差的,那如果重写toString()方法,可以根据业务逻辑或者读者的要求去进行设置,具有较强的可读性
- this与super的区别
this在调用属性时,会先在本类中寻找若本类中没有此属性那么会在父类中寻找
this在调用方法时,会先在本类中寻找若本类中没有此方法那么会在父类中寻找
this在调用构造方法时,会先调用父类的构造方法来初始化父类的属性,再初始化本类中的属性
super在调用属性时,会直接调用父类的属性
super在调用方法时,会直接调用父类的方法
super在调用构造方法时,会直接调用父类的构造方法
- 重载与重写的区别?
重载,是想要以统一的方法处理不同的数据类型,是多态的集中体现
重写,是建立在子类继承父类的基础上,对父类原有的方法进行扩展就是重写。
- 请写出空指针异常的名字(英文),并描述其产生的原因
NullPointerException,产生空指针的主要原因有
对象为空,但是调用其属性和方法,此时会出现空指针异常
局部变量未赋值,因在方法中的局部变量必须初始化,若未初始化那么也会出现空指针异常
- 你对static关键字的理解
static关键字既能修饰属性又能修饰方法,当用其修饰后,不管是方法还是属性都会变为共享数据。并且用static修饰的属性和方法是用类来调用而不是用对象来调用(也可以用类对象来调用),用static修饰的方法只能访问外界的static修饰的属性和方法,用static修饰的属性在jvm中和普通属性的放置位置是不同的,它放在方法区中,也解释了为什么其需要用类来调用,被static修饰的方法不能被重写。
- 类==和equals()方法的区别?
==在判断基本数据类型时,是判断的数值,当判断引用数据类型时,判断的是引用数据类型的地址。
equals方法不能用于判断基本数据类型,若判断的是引用数据类型,若equals()方法未被重写则判断的是地址相当于==,若equals()方法被重写了,则判断的是什么需要根据重写的内容进行判断
- final关键字的作用
final关键字可以修饰类,可以修饰方法,可以修饰属性
当其修饰类时,此类不能被继承
当其修饰方法时,此方法不能被重写
当其修饰属性时,此属性为常量
并且在接口中定义的所有属性都是final的
- 对多态的理解
多态就是同一方法,针对不同事物,表现出不同的行为
其主要应用在一个父类多个子类重写同一个父类方法时
- 写一个单例设计模式程序
单例设计模式分为饿汉式和懒汉式
饿汉式不会产生线程安全问题,懒汉式会产生线程安全问题
- 描述你对模板方法设计模式的理解
模板方法设计模式,见名知意,其主要思想是设计一个模板,当一个类需要此模板中的具体方法时,继承此模板,实现模板的价值。模板设计模式主要是对继承知识的应用。
- 描述你对工厂方法设计模式的理解
工厂方法设计模式,主要分为,简单工厂设计模式,工厂方法设计模式,抽象工厂设计模式
其中简单工厂设计模式是用来生产同一等级结构中的任意产品,但是对于新增产品时需要修改已有代码,扩展性较差
工厂方法设计模式是用来生产同一等级中的固定产品,支持新增同一等级下的产品,但是在生产其他品种的产品时扩展性较差
抽象工厂设计模式是用来生产不同品种的全部产品,当需要新增产品时,无能为力,但是在新增新的品种时会展现其模式的特点
工厂方法设计模式的主要思想就是将创建对象的内容隐藏只暴露一个接口从而实现了创建对象和调用方法的分离
- 描述你对代理设计模式的理解
代理设计模式分为静态代理和动态代理
代理设计模式的主要思想是将代理人和被代理人的公共方法提取,代理人执行方法同步给被代理人从而实现代理人和被代理人的数据同步,主要应用的知识点是接口
静态代理:将代理人和被代理人的公共方法提取,目的是使被代理人无需管理但是也会被同步。在代码逻辑上看,创建接口,代理人和被代理人实现接口,但是代理人可以定义其他方法,为了同步,需要在代理人类中创建被代理人类的属性和以被代理人为参数的构造方法。
动态代理:动态代理主要解决了静态代理的拓展问题,在静态代理中,当多个类需要代理时,那么需要创建多个接口,多个代理类,各个类的耦合度较高。那么用动态代理只需将需要代理的类名传入动态代理的方法中从而实现代理。动态代理也是SpringAop的底层原理,动态代理分为java动态代理和CGlib动态代理。
- 描述你理解的对象数组
对象数据,顾名思义,就是在普通数组中存储对象元素,其与普通基本元素数组的区别是其存储的不是元素本身而是其对象的地址,在访问对象数组的某个元素时,是先拿取地址再在地址的基础上去访问对象元素
- 描述数组的扩容机制
数组的扩容机制的主要思想是:创建一个新数组此数组是原来数组长度的二倍再将原数组中的元素传入新数组中,再利用地址传递的形式将新数组的地址赋给原数组的引用,从而实现了数组的扩容。
数组的扩容还可以利用Arrays类下的copy方法实现,但是其底层原理都是一样的
- 请描述动态数组中指定索引新增元素和指定索引删除元素的区别
动态数组中指定索引新增元素的思路是在原数组的基础上将指定索引之后的元素进行集体向后拷贝而指定索引元素删除元素的思路是在原数组的基础上将指定索引之后的元素集体向前拷贝。
动态数组中指定索引新增元素和指定索引删除元素的基本思路都是将原数组进行拷贝移动。
- 描述快速排序算法的比较过程及代码实现
首先定义两个变量分别接收函数传来的第一个元素和最后一个元素,再定义一个元素来定义基准值,普遍将基准值设置为首元素的值
若是将基准值设置为首元素那么应先去访问尾元素去判断其与基准值的大小,若比基准值大尾元素则向前移动一位,若比基准值小则不动,并将此处的值赋给首元素所在位置,再转为首元素移动,首元素若比基准值小则向后移动一位,若比基准值大则不动,并将首元素此时的值赋为尾元素所在位置,直至首元素位置和尾元素位置相等时,则将基准元素放在首元素位置也是尾元素位置。
最后利用递归的思想将前后部分分别按照上述的方式进行操作,最后即可产生顺序的数列
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try后的finally{}里的代码会在return之前执行,此处的流程是先遇到return然后将其压入栈中,因为每个try-finally语句必须执行finally中的代码,此时将执行完finally里的代码之后再将return语句弹出栈执行
- 如何删除层级文件目录
要删除层级目录及其包含的所有文件和子目录,可以使用递归方法。首先,检查目录是否存在。然后,遍历目录中的所有文件和子目录。对于子目录,递归地调用删除方法以删除其内容。对于文件,直接删除。最后,删除空目录。请谨慎操作,因为删除操作不可逆,并且会永久删除文件和目录。
- Map集合的值什么情况下存储一个ArrayList集合
Map集合的值存储一个ArrayList集合的情况是当需要将多个值关联到同一个键或者键对应的值可能有多个重复值时。这样可以使用ArrayList作为Map集合的值,将多个值存储在一起以便于访问和管理。
- 如何将一个数值型的字符串转成整数
利用包装类中的parsexxx()方法,可以将一个数值型的字符串转成整数。而将整形转为字符串型时是使用String类的ValueOf方法,也可以使用String类的构造方法。
- Instance of关键字的作用
Instance of 关键字使用在多态,其作用是判断父类引用是否由其子类创建的,若不是则返回false,若是则返回true
- ArrayList集合存储的是否是实例本身,如果不是,存储的又是什么?
对象数组存储的不是实例本身,其存储的是对象的地址
- Break、continue、Return的区别
break:应用在switch-case和循环语句中,在switch-case中遇到break时则结束此次判断,在循环中遇到break时则结束此循环
continue:应用在循环语句中,在循环中遇到continue时,则跳过此次循环执行下一次循环
return:应用在方法中,在方法中遇到return时,直接结束此方法
- 请简述你对构造方法的理解?
构造方法无返回值,主要作用是创建对象和初始化属性
构造方法分为无参构造和有参构造
若一个类中没有定义任何构造方法那么就会默认构建无参构造
有参构造可以根据不同的业务创建不同的有参构造方法
并且在构造方法中会无形的调用父类的构造方法初始化父类的属性
- 接口和抽象类的区别
抽象类和接口都不能创建对象,抽象类和接口中都可以编写抽象方法,抽象类和接口的实现类必须重写抽象类和接口中的所有的抽象方法,否则此实现类为抽象类
抽象类使用abstract关键字修饰,抽象类中既可以包括普通的方法也可以包括抽象方法,子类继承抽象类是单继承
接口使用interface关键字修饰,接口中包含抽象方法以及共有静态常量,public static修饰的方法,public default修饰的方法,接口的出现主要弥补了继承单继承的缺点,因此接口是多继承的
编