Java程序员面试题-面向对象技术
Java程序员面试题之面向对象技术
1 面向对象与面向过程有什么区别?
-
出发点不同,面向对象方法是用符合常规思维的方式来处理客观世界的问题,强调把问题领域的要领直接映射到对象及对象之间的接口上。面向过程方法强调的则是过程的抽象化与模块化,它是以过程为中心构造或处理客观世界问题的。
-
层次逻辑关系不同:面向对象方法是用类的层次结构来体现类之间的继承和发展。而面向过程用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。
-
数据处理方式与控制程序方式不同。面向对象的方法将数据与对应的代码封装成一个整体,原则上其它对象不能直接修改其数据,即对象的修改只能由其自身的成员函数完成,控制程序方式上是通过事件驱动来激活和运行程序。而面向过程方法是直接通过程序来处理数据,处理完毕后即可显示处理结果,在控制程序方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在控制与被控制、调用与被调用的关系。
-
分析设计与编码转换方式不同。
2 面向对象有哪些特征?
-
抽象。忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:一是过程抽象;一是数据抽象。
-
继承。
-
封装
-
多态
3 面向对象开发方式有什么优点?
-
较高的开发效率
-
保证软件的鲁棒性
-
保证软件的高可维护性
4 什么是继承
通过继承,子类可以使用父类中的一些成员变量和方法,从而提高代码的复用性,提高开发效率。
继承主要有以下几个特性:
-
Java语言不支持多重继承。
-
子类只能继承父类的非私有成员变量与方法。
-
当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖父类的成员变量,而不会继承。
-
当子类中的方法与父类中的方法有相同的函数签名时,子类将会覆盖父类的方法,而不会继承。
5 组合和继承有什么区别?
-
组合是指在新类里面创建原有类的对象。是显式的。
-
继承是根据其他类的实现来定义一个类的实现。是隐式的。
6 多态的实现机制是什么?
多态表示:当同一个 操作作用在不同对象时,会有不同的语义,从而产生不同的结果。多态主要有两种表现形式
-
方法的重载:编译时多态
-
方法的覆盖:运行时多态
7 重载和覆盖有什么区别?
重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。在使用重载时,需注意以下几点:
- 重载是通过不同的方法参数来区分的
- 不能通过方法的访问权限、返回值类型和抛出异常类型来进行重载 。
- 对于继承来说,如果基类方法的访问权限为private,那么就不能在派生类对其重载;如果派生类也定义了一个同名函数,这只是一个新方法,不会达到重载的效果。
覆盖是指派生类函数覆盖基类函数。覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时,需要注意以下几点:
- 派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数
- 派生类中的覆盖方法的返回值必须和基类中被覆盖的方法的返回值相同
- 派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致
- 基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖
重载和覆盖的区别:
-
覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
-
覆盖只能由一个方法或只能由一对方法产出关系;重载是多个方法之间的关系。
-
覆盖要求参数列表相同;重载要求参数列表不同。
-
覆盖关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。
8 抽象类(abstract class)和接口(interface)有什么区别?
如果一个类中包含抽象方法,那么这个类就是抽象类。(在Java中,可以使用abstract声明一个类是抽象类)
接口指一个方法的集合,接口中的所有方法都没有方法体。(在Java中,接口通过关键字interface来实现)
接口与抽象类的相同点:
- 都不能被实例化
- 接口的实现或抽象类的子类都只有实现了接口或抽象类的方法后才能被实例化
接口与抽象类的不同点:
-
Java8以前,接口只有只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
-
接口需要实现,但抽象类只能被继承。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此,使用接口可以间接实现多重继承。
-
接口强调特定功能的实现,而抽象类强调所属关系。
-
接口中定义的成员变量默认为public static final ,只能有静态的不能被修改的数据成员,而且必须给其赋初值。抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法。
-
接口被运用与实现比较常用的功能,便于日后维护或者添加删除方法;抽象类更倾向于充当公共类的角色,不适合用于日后重新对里面的代码进行修改。
9 内部类有哪些?
主要有4种:
-
静态内部类
-
成员内部类
-
局部内部类
-
匿名内部类
10 如何获取父类的类名?
- Java语言提供了获取类名的方法,getclass().getName(),开发人员可以调用这个方法来获取类名。如何在子类中获取父类的名字呢?
可以通过Java的反射机制,使用getClass().getSuperclass().getName()
11 this与super有什么区别?
- this用来指向当前实例对象,它的一个非常重要的作用就是用来区分对象的成员变量与方法的形参(当一个方法的形参与成员变量的名字相同时,就会覆盖成员变量)
- super可以用来访问父类的方法或成员变量,当子类的方法或成员变量与父类有相同名字时也会覆盖父类的方法或成员变量,要想访问父类的方法或成员只能通过super关键字来访问。