Java面试——JavaSE基础:基本语法、面向对象、异常处理、常用API…
文章目录
1 面向对象
1.1 面向对象的特性
- 继承:从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类(超类、基类);得到继承信息的类称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时也是封装程序中可变因素的重要手段。
- 封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。在类中编写的方法就是对实现细节的一种封装,即编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
- 多态:允许不同子类型的对象对同一消息作出不同的响应,即用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式, 但一切对A系统来说都是透明的。方法重载(Overload)实现的是编译时的多态性(也称为前绑定),而方法重写 (Override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:① 方法重写(子类继承父类并重写父类中已有的或抽象的方法);② 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
默认情况下面向对象有3大特性——封装、继承、多态,有时也称抽象为第4大特性:
- 抽象:将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对 象有哪些属性和行为,并不关注这些行为的细节是什么。
- 注意String类是final类,不可被继承。
- Java 中实现多态的机制是什么?
【答】靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变 量的类型中定义的方法。
1.2 访问权限修饰符
不同的权限修饰符的区别见下表(不写表示默认default):
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | × |
default | ✓ | ✓ | × | × |
private | ✓ | × | × | × |
1.3 对象克隆
在实际编程过程中,常会遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()
方法是其中最简单,也是最高效的手段。
1.3.1 new和clone()的过程
- new操作符的本意是分配内存。程序执行到new操作符时,首先去看new操作符后的类型(因为只有知道类型后, 才能知道要分配多大的内存空间)。分配完内存后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。构造方法返回后,一个对象创建完毕,可以将其引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。
clone()
方法在第一步与new相似,都是分配内存,但调用方法时,分配的内存和原对象(即调用方法的对象)相同。然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
1.3.2 复制引用和复制对象
以下代码执行后打印的地址值是相同的,说明p
和p1
只是引用而已,他们都指向了一个相同的对象。这种现象称为复制引用。
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);
以下代码才是真真正正的克隆对象,所打印的两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个 新的引用变量。
Person p = new Person(23, "zhang");
Person p1 = (Person) p.clone();
System.out.println(p);
System.out.println(p1);
1.3.3 深拷贝和浅拷贝
以下示例代码的Person类中有两个成员变量,分别是age和result,age是int型,result是Result类。要想使用clone,需实现Cloneable接口并实现clone()
方法。如下所示:
public class Person implements Clonable {