JavaOOP
1. 请简述java中四种访问修饰符的区别。
private 只能本类访问
default 在同包内可以被访问
protected 在同包,或者子类中可以被访问
public 所有类均可访问
2. 抽象类和接口有哪些相同点和不同点?
相同点:(1)都可以存在抽象方法;(2)都可以被继承;(3)普通子类都需要重写抽象方法;(4)不能实例化
不同点:(1)关键字:abstract(抽象类),interface(接口);(2)抽象类中可以有普通方法,接口中不可以;(3)类能继承抽象类,接口继承接口;
3. Java中的final关键字有哪些用法?
(1)修饰类:类不能被继承;(2)修饰属性:常量;(3)修饰方法:不能被重写。
4. 重载(overload)和重写(override)有哪些异同点,请对比说明。
(1)重载在同一个类,重写在继承关系的父子类;
(2)重写方法名,返回值(不严于被重写方法),参数列表相同,重载方法名相同,参数列表不同(个数,顺序,类型),与返回值无关;
(3)重写的方法修饰符大于等于父类的方法,重载和修饰符无关
5. 简述类的封装的定义、具体步骤和优点。
封装的实质就是将类的状态信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。步骤为:1.修改属性的可见性,2.设置setter和getter方法,3.设置属性的存取限制。好处:隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据,可以方便的加入存取控制语句,限制不合理操作。
6. 简述多态的概念,子类和父类之间转换时遵循的规则。
同一个引用类型,使用不同的实例,而执行不同的操作。
向上转型语法:<父类型><引用变量名>=new<子类型>();
向下转型语法:<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
7. 简述Java集合框架的三大 类接口及其区别。
分别为:List、Set和Map
Set 接口继承Collection接口,存储一组唯一(不允许重复),无序的对象。
List 接口继承Collection接口,存储一组不唯一(允许重复),有序(以元素插入的次序来放置元素,不会重新排列)的对象。
Map接口存储一组(键-值)对象,提供key(键)到value(值)的映射。Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。
8. 根据你的理解,请说明ArrayList和LinkedList的区别。
ArrayList是List接口的一个具体实现类,它实现了可变大小的数组,在进行随机访问和遍历元素时,它提供更好的性能。
LinkedList是List接口的一个具体实现类,它提供了额外的addFirst()、addLast()、removeFirst()、removeLast()等方法,可以在LinkedList的首部或尾部进行插入或者删除操作。而且,相较于ArrayList,在插入或者删除元素时,LinkedList提供更好的性能。
9. 如何实现多线程?
① 继承Thread类 ② 实现Runnable接口
10. 线程的生命周期中包含几种状态,请描述每种状态的特征。
任何线程一般都具有5种状态,即创建、就绪、运行、阻塞、终止状态。
1.创建状态
在程序中用构造方法创建了一个线程对象后,新的线程对象就处于创建状态,此时,它已经获取了相应的资源,但还没有处于可运行状态,这时可以通过Thread类的方法来设置线程对象的属性,如设置线程名(setName())、设置线程优先级(setPriority())等。
2.就绪状态
线程创建之后,就可以通过调用start()方法启动线程,即进入就绪状态。此时,线程将进入线程队列排队,等待CPU资源,这表明它已经具备了运行条件,在未获得CPU资源时,仍不能真正执行。举例来说,去医院看病,某主任的专家号每天只有20个,挂上号的病人还需在分诊处等待叫号。这里每个挂到专家号的病人可以看成一个就绪状态的线程。
3.运行状态
当就绪状态的线程获得CPU资源时,即可转入运行状态,执行的run()方法。对于只有一个CPU的机器而言,任何时刻只能有一个处于运行状态的线程占用CPU,即获得CPU资源。延续上面医院看病的例子,被叫到的病人才能真正就诊,而每个主任专家在一个时刻只能为一个病人看病。
4.阻塞状态
一个正在运行的线程因某种原因不能继承运行时,进入阻塞状态。阻塞状态是一种“不可运行”的状态,而处于这种状态的线程在得到一个特定的事件之后会转回可运行状态。举例来说,轮到小张看病了,医生为查明原因要求他去做个化验,医生得到化验结果后才能继续诊断,如果把医生给小张看病看作一个线程,该线程此时即处于阻塞状态。
可能使线程暂停执行的条件:
线程优先级比较低,因此它不能获得CPU资源。
使用sleep()方法使线程休眠。
通过调用wait()方法,使线程等待。
通过调用yield()方法,线程显式出让CPU控制权。
线程由于等待一个文件I/O事件被阻塞。
5.死亡状态
一个线程的run()方法运行完毕,线程则进入死亡状态。处于死亡状态的线程不具有继承运行的能力。
11. 调用线程对象的start()方法会执行run()方法,为什么不能直接调用run()方法?
线程实例调用start()方法和调用run()方法有着天壤之别,前者是调用实例方法,只有主线程执行,只有一条执行路径,后者是启动线程。
12. 简述Java中流的分类。
字节流:输入流InputStream和字节输出流OutputStream。
字符流:字符输入流Reader和字符输出流Writer。
13. 写出使用dom4j解析xml的主要方法。
获取文档的根元素: getRootElement();
获得某个节点的单个子节点: element(“节点名称”);
获得节点的文本内容: getText();
获取某节点下的所有子节点: elements();
添加子节点: addElement(“节点名称”);
删除某个节点: remove(“节点名称”);
14. 类中的那些成员不能被继承?
private成员
子类与父类不在同包,使用默认访问权限的成员
构造方法
15. 定义接口和实现接口的关键字分别是什么?如何实现多个接口?
定义:interface
实现: implements
implements 接口1,接口2,接口3
16. 什么是面向接口编程?
面向接口编程是开发程序的功能先定义接口,接口中定义约定好的功能方法声明,通过实现该接口进行功能的实现,完成软件或项目的要求.软件或项目随着时间的不断变化,软件的功能要进行升级或完善,开发人员只需要创建不同的新类重新实现该接口中所有方法,就可以达到系统升级和扩展的目的.
17. 什么是异常?异常和错误有什么区别?
异常就是在程序的运行过程之中所发生的不正常的事件,
exception是程序正常运行中,可以预料的意外情况,并且应该被捕获,进行相应的处理
error是指在正常情况下,不大可能出现的情况,绝大部分的error都会导致程序(比如jvm自身)处于非正常的、不可恢复的状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类
18. Java中如何处理异常?
使用try-catch-finally 捕获异常,把可能出现异常的代码放入try语句中,并使用catch语句块捕获异常,finally无论是否发生异常都会执行(System.exit(1)除外),可省略。
19. 如何使用log4j来记录日志?
1. 在项目中加入log4j.jar所使用的jar文件
2. 创建log4j.properties文件
3. 编写log4j.properties文件,配置日志信息
4. 在程序中使用log4j记录日志信息
20. 写出五个运行时异常,并举例说明。
异 常 类 型 | 说 明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
21. List集合和Set集合有何异同?
Set(集合):
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。
Set介面主要实现了两个实现类:
HashSet : HashSet类按照哈希演算法来存取集合中的对象,存取速度比较快
TreeSet : TreeSet类实现了SortedSet介面,能够对集合中的对象进行排序。
List(列表):
List的特徵是其元素以线性方式存储,集合中可以存放重复对象。
List介面主要实现类包括:
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与
与删除元素的速度慢。
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。
对於List的随机访问来说,就是只随机来检索位於特定位置的元素。
List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从「0」 开始。
22. 静态成员和实例成员有什么区别?
实例成员时属于对象的,实例成员包括成员变量和实例成员方法。只有创建了对象之后,才能通过对象访问实例成员变量和调用实例成员方法。
类成员时属于类的,类成员需要用关键字static标示,也称为静态成员,类成员包括类成员变量和类成员方法。通过类名可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也能够引用类成员。类成员也可以通过对象引用。
23. 继承条件下,构造方法的调用规则是什么?
1. 如果子类的构造方法没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没有“super()”语句,效果都是一样的。
2. 如果子类的构造方法中通过super显式调用父类的有参构造方法,则执行父类相应的构造方法,而不执行父类的无参构造方法。
3. 如果子类的构造方法中通过this显式调用自身的其他构造方法。则在相应的构造方法中应用以上两条规则
4. 特别注意的是,如果存在多级继承关系,则在创建一个子类对象书,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object的无参构造方法为止。
24. 什么是多态?如何实现多态?
多态是具有表现多种形态的能力的特征更专业化的说法:同一个实现接口,使用不同的示例而执行不同的操作。
- 使用父类作为方法形参实现多态
- 使用父类作为方法返回值实现多态。
25. Java面向对象编程的三大特征是什么?并分别解释好处是什么?
封装:隐藏了类的内部实现细节,对外提供接口访问,提高了安全性
继承:提高了代码的重用性
多态:提高了代码的可维护性和可扩展性
26. Java中异常处理的关键词有哪些?作用是什么?
try:监听可能出现异常的代码
catch:用于捕获异常
finally: 有没有异常都会执行,一般用于释放资源
throw:用于抛出异常
throws: 用于声明方法可能抛出的异常
27. Java中的static关键字有哪些用法?
修饰属性:静态属性,也称为类属性,通过类名直接调用
修饰方法:静态方法,也称为类方法,通过类名直接调用,一般用于工具类中
修饰代码块:代码执行一次,比如加载驱动