面试题-JavaSE 基础(一、Java 面向对象)

1、面向对象的基本特征

继承:同名不同参(个数 类型 顺序)编译时多态
重写:同名 同参 同返回值类型 运行时多态
封装:编写类、方法(行为细节)都是封装
抽象:类只关注类的属性和行为

2、.clone()方法

a、b两个相同的独立对象,可以通过clone()高效实现

3、new对象和clone的区别

new的本意是先开辟内存空间,然后将栈区的内存地址发布在外部的过程,然后通过操作这个地址值就可以达到操作对象的目的
clone第一步也是开辟内存空间,然后用原来对象域再次填充新的对象。

4、复制对象和复制引用的区别

Person p =   new Person(23,"zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);

当 Person p1 = p;执行之后, 是创建了一个新的对象吗? 首先看打印结果:

1.com.itheima.Person@2f9ee1ac 
2.com.itheima.Person@2f9ee1ac

地址值相同为同一对象,同一对象未必地址值相同;
下面的代码是真正的克隆

Person p = new Person(23,"zhang");
Person p1 = (Person) p.clone();
System.out.println(p);
System.out.println(p1);

从打印结果可以看出,两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个 新的引用变量

 1. com.itheima.Person@2f9ee1ac 
 2. com.itheima.Person@67f1fba0

5、深拷贝和浅拷贝

深:栈地址的复制(引用值)
浅:对象地址值不同

如何进行深拷贝:
实现Cloneable接口并重写clone方法
如果想要深拷贝一个对象,这个对象必须要实现 Cloneable 接口,实现 clone 方法,并且在 clone 方法内部,把该对象引用的其他对象也要 clone 一份,这就要求这个被引用的对象必须也要实现 Cloneable 接口并且实现 clone 方法。那么,按照上面的结论,实现以下代码 Body 类组合了 Head 类,要想深拷贝 Body 类,必须在 Body 类的 clone 方法中将 Head 类也要拷贝一份。代码如下:

static class Body implements Cloneable{
2.    public Head head;
3.    public Body body(){};
4.    public Body (Head head){this.head = head;}
5.    @Override
6.    protected Object clone() throws CloneNotSupportException{
7.    Body newBody = (Body) supper.clone();
8.    newBody.head = (Head) head.clone();
9.    return newBody;
10.    }
11.}
12.static class Head implements Cloneable{
13. public Face face;
14. public Head() {}
15. @Override
16. protected Object clone() throws CloneNotSupportedException {
17. return super.clone();
18. }}
19.public static void main(String[] args) throws CloneNotSupportedException {
20. Body body = new Body(new Head(new Face()));
21. Body body1 = (Body) body.clone();
22. System.out.println("body == body1 : " + (body == body1) );
23. System.out.println("body.head == body1.head : " + (body.head == body1.head));
24.} 
posted @ 2019-03-26 15:08  苏木力格  阅读(102)  评论(0编辑  收藏  举报