面试题-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.}
出处:https://www.cnblogs.com/willem-xin/
版权所有,欢迎转载,转载请注明原文作者及出处。