说明:其中内容摘自:《Java程序员面试宝典》,这里仅供学习使用。
1. 面向对象和面向过程有什么区别?
2. 面向对象有哪些特征?
主要特征包含抽象,继承,封装,多态:
抽象:
3. 面向对象的开发方式有什么优点?
- 较高的开发效率。由于面向对象的思想比较符合人类的思维过程,这种思想可以帮助开发人员刚好的理解软件的功能需求,并有一系列的相关工具帮助开发,因此可以提高开发效率。
- 软件鲁棒性的保证。由于面向对象的开发方法有很好的可重用性,在开发过程中可以重用已经经过长期测试的代码,因此对软件的鲁棒性具有一定的促进。
- 保证软件的高可维护性。面向对象的设计和实现的工具和方法使得软件的可读性较好,并且使用成熟的设计模式,可以在后期需求变更时,只需要修改部分的模块,方面维护。
4. Java中的继承有什么特性?
Java中的继承是面向对象思想中的一个重要概念,通过继承,子类可以从父类中复用一些成员变量和方法,提高代码的重用性。Java中的继承有如下特性:
- Java支持单继承。一个子类只能有一个父类,但可以通过实现接口的方式实现多继承的功能。
- 子类只能继承父类中的非private方法和变量(public和protected)。
- 当子类中的方法与父类中的方法有相同的函数签名时(相同的方法名,相同的参数个数和类型),子类会覆盖父类的方法而不再继承。
5. 组合继承的区别?
组合继承都是Java中的两种代码复用的方式:
继承是一种is a的关系,组合是一种has a的方式。并且谨慎使用继承关系。
6. 多态的实现机制是什么?
多态也是面向对象实现代码重用的一个重要机制,它表示当同一个方法作用在不同的对象时,会有不同的语义,从而会产生不同的结果。例如2+3和“2”+“3”中,同样的+号,但它们的语义和实现的功能都不同。
在Java中,多态主要有如下两种表现方式:
方法的重载(overload)。重载是指同一个类中的多个同名的方法,但这些方法有着不同的参数,因此在编译时可以确定到底调用的哪个方法,这是一种编译时多态。并且发生在同一个类中。
方法的覆盖(override)。子类可以覆盖父类的方法,因此同样的方法在子类和父类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向基类的对象,也可以指向子类的对象,同样,interface的引用变量也可以指向他的实现类的对象。
而程序调用的方法在运行期才会动态绑定(绑定是指将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,是内存中正在运行的那个对象的方法而不是引用变量的类型中定义的方法。由于只用在运行时才能确定调用那个方法,因此这种方法覆盖实现的多态也成为运行时多态。发生在不同类和接口之间。
7. 重载和覆盖之间的区别?
重载发生在同一个类中的不同方法中,属于编译时多态:
- 重载通过不同的方法参数来区别,参数个数的不同,类型的不同,或不同的参数顺序。
- 不能通过方法的不同返回值进行重载。
覆盖是指派生类函数覆盖其基类的方法,覆盖一个方法并对其进行重写。他发生在不同类或接口之间,属于运行时多态:
- 派生类中覆盖的方法必须和基类中的方法有相同的函数名和参数
- 返回值必须相同
- 抛出的异常必须相同
- 基类中private修饰的方便不能被继承和覆盖。
8. 抽象类与接口的区别?
- 抽象类:如果一个类中包含抽象函数,那么这个类就是抽象类。Java中可以将类和方法声明为abstract,来表明一个抽象类或方法。
- 接口是一个方法声明的集合,所有的方法都没有实现方法体,接口通过interface进行声明。
抽象类和接口都是支持抽象类定义的两个方式。
- 抽象类中的抽象方法可以声明而不去实现它,被声明的抽象方法没有方法体。抽象类在使用时不能被实例化,但可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中所有的抽象方法提供具体的实现,否则他们也是抽象类。
- 接口可以看做一个抽象方法的集合,可以通过interface实现多重继承,接口中的成员变量都是public static final类型。接口中的方法只能用关键字public和abstract修饰。
抽象类和接口具有如下区别:
比较 | 抽象类 | 接口 |
默认方法 | 抽象类可以有默认的方法实现 | java8之前不存在方法的实现 |
实现方式 | extends继承,如果子类不是抽象类则需要实现父类中的抽象方法 | 子类使用implements实现,需要实现接口中定义的全部方法 |
构造器 | 抽象类中可以有构造器 | 不能有 |
和正常类的区别 | 抽象类不能被实例化 | 另一个概念 |
访问修饰符 | 可以有public protected default等 | 默认为public,不能使用其他修饰符 |
多继承 | 一个类只能继承一个父类 | 可以实现多个接口 |
添加新方法 | 向抽象类中添加新方法可以提供默认的实现,不用修改子类的的代码 | 向接口中添加新方法,子类中必须要实现 |
9. 内部类有哪些?
4种内部类:
- 静态内部类
- 成员内部类
- 局部内部类
- 匿名内部类
10. 如何在子类中获取父类的类名?
获取实例本身的类名,可以使用getClass().getName()方法。但无法使用这个方法在子类中获取父类的类名。因为Object中对getClass的释义为:返回此Object的运行时类。
可以通过Java的反射机制,使用getClass.getSuperClass().getName()方法,在子类中获取父类的类名。
11. this和super有什么区别?
- this用来指向当前的实例对象,特别是用来区分对象的成员变量和方法的形参(如果一样的时候)
- super用来访问父类的方法或成员变量,当子类的方法或成员变量和父类中的有相同名字时会覆覆盖父类的方法或成员变量,访问父类的方法或成员变量时只能通过super关键字。