目录
面试题一:解释下什么是面向对象?面向对象和面向过程的区别?
面向对象是⼀种基于面向过程的编程思想,是向现实世界模型的自然延伸,这是⼀种“万物皆对象”的编程思想。
由执行者变为指挥者,在现实生活中的任何物体都可以归为⼀类事物,而每⼀个个体都是⼀类事物的实例。面向对象的编程是以对象为中心,以消息为驱动。
- 面向过程更注重事情的每一个步骤及顺序;
- 面向对象更注重事情有哪些参与者(对象)、及各自需要什么;
举个栗子 :比如洗衣机洗衣服。
面向过程:会将任务拆解成一系列的步骤:打开洗衣机----->放衣服----->放洗衣粉----->清洗----->烘干;
面向对象:会拆出人和洗衣机两个对象:
- 人:打开洗衣机,放衣服,放洗衣粉;
- 洗衣机:清洗,烘干。
追问一:面向对象的三大特性?分别解释下?
- 封装:通常认为封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类/基类)得到继承信息的被称为子类(派生类)。 它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”
- 多态:分为编译时多态(方法重载)和运行时多态(方法重写)。要实现多态需要做两件事:⼀是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。
几点补充:
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有⽅法),但是父类中的私有属性和方法子类是无法访问,只是拥有。因为在⼀个子类被创建的时候,首先会在内存中创建⼀个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成⼀个子类的对象;
- 子类可以拥有自己的属性和方法;
- 子类可以用自己的方式实现父类的方法。(重写)
追问二:封装的目的是什么,为什么要有封装?
封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接操作和修改。对一个类或对象实现良好的封装,可以实现以下目的:
- 隐藏类的实现细节;
- 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;
- 可进行数据检查,从而有利于保证对象信息的完整性;
- 便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑:
1、将对象的成员变量和实现细节隐藏起来,不允许外部直接访问;
2、把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。
封装实际上有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。这两个方面都需要通过使用Java提供的访问控制符来实现。
面试题二:说一说你对Java访问权限的了解。
Java 语言为我们提供了三种访问修饰符,即「private」、「protected」、「public」,在使用这些修饰符修饰目标时,一共可以形成四种访问权限,即 「private」、「defalut」、「protected」、「public」,注意在不加任何修饰符时(默认)为 defalut 访问权限。
在修饰成员变量/成员方法时,该成员的四种访问权限的含义如下:
- private:该成员可以被该类内部成员访问;
- defalut:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问;
- protected:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问,还可以被它的子访问;
- public:该成员可以被任意包下,任意类的成员进行访问。
在修饰类时,该类只有两种访问权限,对应的访问权限的含义如下:
- defalut:该类可以被同一包下其他的类访问;
- public:该类可以被任意包下,任意的类所访问。
面试题三:一个Java文件里可以有多个类吗(不含内部类)?
一个 Java 文件里可以有多个类,但最多只能有一个被 public 修饰的类;
如果这个 Java 文件中包含 public 修饰的类,则这个类的名称必须和 Java 文件名一致。