搜档网
当前位置:搜档网 › java基础测试题

java基础测试题

1.Java虚拟机(JVM)工作基本原理和相关特性
将.java文件通过javac命令进行编译,编译不通过将会报错,编译通过后会生成对应的.class 二进制字节码文件,
通过网络和本地磁盘被装载在JVM中,jvm对.class文件进行校验,校验失败会抛出异常,
校验成功后调用二进制字节码解释程序以及对应的机器指令来调用硬件,最后执行结果返回对应的平台。
java语言特性:“一次编译,到处运行”,只要对应的平台装有JVM,将.class文件装载到JVM中就可以被解释执行。
平台的无关性,提高了应用的高移植性和健壮性。

2.列举java的基本数据类型有哪些,分别对应的位数和字节数
byte boolean short char int float long double
1 /8 1 /8 2/16 2 /16 4/32 4 /32 8/64 8/64

3.在什么情况下会出现空指针异常和数组下标越界异常
空指针异常:当一个引用类型的变量没有实例化时,直接调用它的成员时,就会抛出空指针。
数组下标越界异常:当用过下标来查找数组中的元素时,下标值大于当前数组的最大下标值(数组的长度-1)。

4.面向对象和面向过程的区别
面向过程:“谓宾”结构,主要指明去做一件事情,关注是最终的结果,不强调这件事情是谁做的。
面向对象:“主谓”结构,主要强调一件事情是谁来做,具体到一个对象的概念,而且所做的事情都是该对象所拥有的功能,
包括一些对象本身的属性。

5.阐述一下匿名对象的特点和使用场合。
特点:一次性使用后,对象立马被销毁,大大降低了内存的占用,提高内存的利用率。
使用场合: 做方法的一次性调用和参数的一次性传递。

6.详细描述一下构造方法的作用
1.构造方法用来创建对象,同时在创建对象的时候可以定义有参数的构造方法来做初始化操作,初始化包括属性和方法调用。
2.在创建该类的对象时,当类中没有定义构造方法时,jvm会默认提供一个无参无方法实现的构造方法,
如果类中定义了无参的构造方法或者有参构造方法
JVM就不会为该类提供一个无参无方法实现的构造方法,如果类中只定义有参的构造方法,
同时还想使用无参的构造方法来创建对象,那么必须要定义一个无参的构造方法。
3.在一个类中提供重载的构造方法来满足对象创建时的需求,同时在重载的构造方法中使用this+(参数列表)来调用其他的重载 的构造方法。

7.分别描述对象的比较“==”和“equals”,并且描述一下String对象比较的细节,以及对应常用的方法,列举5个。
==:比较对象的地址 equals:比较对象的内容
String对象比

较:
1) 串池中字符串对象的比较
String s1="123"; String s2="123";
定义上面的语句时,s1首先去串池中找内容为“123”的字符串变量是否存在,不存在就创建,存在就让s1执行已存在的对象对应的地址。
s2做同样的操作。
if(s1==s2) 两个静态初始化的字符串变量,首先去串池中找内容为“123”的字符串对象所在的内存地址,
此时s1和s2对应地址是同一个地址,结果true。
if(s1.equals(s2)) 对象的内容比较。 结果true

2)存在非串池中字符串对象的比较
String s3="123"; String s4=new String("123");
定义上面的语句时,s3还是按照串池方式来操作,对象还是放在串池中,但是s4对象不会放在串池中,直接开辟一块内存来存放。
if(s3==s4) s3和s4对应的地址不是同一地址 结果false;
if(s3.equals(s4)) 对象的内容比较。 结果true

String常用的方法:
substring(截取子串),
indexof(一个字符第一次出现在字符串中的位置),
lastIndexof(一个字符最后一次出现在字符串中的位置),
getBytes(获取字符串对应的字节数组),
contains(查找字符串中是否存在某个字符),
startWith(字符串是否按照指定的串来匹配前缀),
endWith(字符串是否按照指定的串来匹配后缀),
split(按照指定的字符来分割字符串,返回一个字符串数组),
lowerCase(将字符变成小写),
upperCase(将字符变成大写),
concat(字符串拼接)



8.描述一下java面向对象封装的特性以及优点
特点:将类中的属性和方法定义成私有的,不让外部类直接访问类的成员,提供属性对应public的方法:set和get方法,
在方法中可以添加自己的逻辑来控制属性合法性.尽量少给外部类提供public的方法,隐藏类功能实现的细节。
优点:程序设计时增强了属性数据的安全性,增强代码可维护性,实现了高内聚低耦合,

9.分别描述静态成员变量,静态方法,静态代码块的特点以及在什么场合下使用。
1) 静态成员变量:
特点:静态变量在内存的静态区域中只有一个变量存在,而且是一个类共有的共享的属性,
降低了内存的占用,提高内存是利用率。
场合:在类设计时,如果类的成员属性是一个公共的属性,我们就需要定义成静态的成员变量
2) 静态成员方法:
特点:不需要创建对象就可以访问,降低了内存的占用,提高内存是利用率。
a.在同类中,静态方法可以直接被其他成员方法访问,但是在静态方法中是不可以访问非静态的成员。
b.不在同类中,静态方法可以通过“类名.方法名()”的形式来访问。
场合:类中经常被访问的,具有通用功

能和工具性功能的方法适合定义成静态方法。
3) 静态代码块:
特点:静态代码块在类第一次使用时被装载到jvm中时,静态代码块就会立即被执行,并且只执行一次,
主要做一些初始化操作,可以讲方法中能够做的初始化操作放到
静态代码块中,这样就不需要创建对象来访问,降低了内存的占用,提高内存是利用率。
场合:在类设计时,将一些功能中存在重复初始化的操作的代码就适合放在静态代码块中。

10.懒汉式单例模式和饿汉式单例模式各有几大要素,写出单例模式的实例。
单例模式:确保该类在整个应用中只有一个而且是同一个对象存在于内存中,降低了内存的占用,提高内存是利用率。
懒汉式:
1) 创造一个私有的构造方法。
2) 创建一个私有的静态的该类类型的对象引用,不需要实例化,但要初始化为null。
3) 创建一个静态的公开的返回类型为该类类型的getInstance方法
public class Dog {
private Dog(){}
private static Dog dog=null;
static public Dog getDog(){
if(dog==null){
dog=new Dog();
}
return dog;
}
}

饿汉式:
1) 创造一个私有的构造方法。
2) 创建一个私有的静态的不可被更改的该类类型的对象引用,并且要实例化该对象引用。
3) 创建一个静态的公开的返回类型为该类类型的getInstance方法
public class Dog {
private Dog(){}
private static final Dog dog=new Dog();
static public Dog getDog(){
return dog;
}
}

11.描述一下方法的重写和重载。
重写
原因:当父类定义的方法不能够满足子类的需求,子类需要扩展父类的方法的功能时,子类必须重写父类的方法,也叫覆盖。
规范:不在同一个类中,方法名,参数个数和类型,返回类型要严格匹配,访问权限子类不能够比父类严格。

重载(一般方法)
原因:当前类已有的方法不能够满足现有需求,此时在该类中定义同种操作的多元化方法,这样的方法从机构上来说就是重载。
规范:在同一个类中,方法名相同,参数个数或类型不同,返回类型不加限制。

重写和重载都是面向对象多态性的两种体现,重写是在父子类(一般的父类和子类,抽象类和一般子类,接口和一般的实现类)
中重写方法来体现多态性,
重载是在同一个类中提供多元化方法来体现多态性。

12.java的继承具有什么样的特点。
1) 简化类的定义,父类已有的成员在子类中不需要进行重复定义。
2) java支持单继承和多层继承,不支持多重继承。不可以继承父类私有的成员,不能够继承父类的构造方法。
3) 子类可以重

写父类中的成员方法,那么子类对象调用重写的方法时,就会覆盖掉父类的被重写的方法,
如果子类需要调用父类被重写的方法,可以通过super.成员。
4) 当子类对象实例化时,首先要创建父类对象,jvm会判断子类的构造方法中是否通过super(参数列表)显式调用了父类的构 造方法,如果没有调用JVM会默认调用父类无参的构造方法,确保父类对象的创建,如果显式的调用了父类的构造方法,那 么父类必须要提供对应的构造方法以供调用,依次类推可以追溯到Object类对象的创建,因为Object类是一切类的父类。


13.简述final关键字的几种用法
final主要修饰在类,方法,变量
类:该类不可被继承。
方法:该方法不可以被重写。
变量:表示常量,只能够赋值一次,不可更改。
如果一个变量定义成public static final 就是一个全局常量。

14.一般类,抽象类,接口的区别
一般类:定义成员方法必须要有方法体,定义成员变量可以显式初始化,也可以不显式初始化,当不显式初始化时,
jvm会默认提供对应类型的初始值。
抽象类:在类中存在一个没有方法体的方法声明,这样的方法就是抽象方法,但是需要通过abstract来修饰,
具有这样类型的方法的类就是抽象类。同时类也需要通过abstract来修饰。在抽象类中可以定义一般方法,
如果一般类来继承抽象类,必须要实现抽象类中未实现的方法,实现不了抽象类中的抽象方法,此类也必须是抽 象类,抽象类是不可以被实例化,也就是不可以 通过 new关键字来创建对象。
接口:1). 接口是特殊的抽象类,使用关键字interface来修饰,每个方法都是抽象的,只能够定义不可以实现,在接口中定 义的变量都是public static final的全局常量,接口本身不可实例化。
2).接口中的方法是定义了一套标准,让其实现类来实现它定义的方法,那么一般类和接口之间是通过implements来建 立实现关系,实现类必须全部实现接口中定义的方法。如果接口的实现类是抽象类,那么抽象类可以实现接口的部 分方法。接口和接口之间是继承关系.
三者区别:a.一般类是可以实例化,而抽象类和接口是不可以实例化
b.一般类的方法必须要有方法体,抽象类既可以有一般方法,也可以有抽象方法,而接口的方法全是抽 象的,但是不需要使用abstract来修饰。
c.一般类中可以定义成员变量,常量,全局常量,抽象类和一般类一样,但是接口中只能够定义全局常 量


意:当一个类继承了另外一个类时,并且还实现了一个或者多个接口,那么要按照“先继承后实现”的规则,位置不可以颠倒。

15.什么是面向对象的多态性?
在类的设计时,同一个类中的方法重载和父子类之间方法的重写,以及父类引用指向子类对象(父类指向子类的引用)
类的功能方法,接口中可以定义一套标准,可以让若干个实现类,按照每个实现类自己特性来实现接口中的标准,
充分体现了多态机制,在类的代码定义上使用父类指向子类的引用来体现多态性。一旦一个标准定义后,
可以通过标准来控制后来实现者的功能设计,“以不变应万变”,大大增强了程序设计的扩展性,可维护性。

16.什么是异常,在进行异常捕获的时候需要注意哪些规则,在子类重写父类方法时,对异常的抛出声明有哪些限定。
1.异常不是致命的错误,已经通过了编译,但是在jvm中被校验时,一旦检验失败就会抛出异常。
2.在程序设计时可以在方法上通过throws关键字来申明抛出异常,也可以在方法中通过try ......catch来试图执行功能语句,
一旦出现异常就捕获,也可以在方法中通过throw new 异常对象的形式来抛出一个已有的异常或者自定义异常,但是一旦抛 出就需要捕获。
3.在同一个类中进行异常捕获时,先捕获子类异常,后捕获父类异常,如果不存在父子类异常关系的话,捕获顺序不加限制。
4.当子类重写父类的方法时,父类方法有异常抛出,那么子类重写的方法抛出的异常可以和父类保持一致或者是父类抛出异常的 一个子集,不容许子类抛出父类方法中不存在的异常(排除运行时异常RunTimeException以及对应的子类异常)。
5.自定义异常需要继承Exception,这样在方法中通过throw new CustomerException()来进行异常的抛出,并捕获进行异常后 的相关处理。

相关主题