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

本文介绍了面向对象的四大特性:继承、重写、封装和抽象,并对比了new对象与克隆的区别,阐述了深拷贝与浅拷贝的概念及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、深拷贝和浅拷贝

深:栈地址的复制(引用值)
浅:对象地址值不同
1523295-20190326181540420-1093740477.png

如何进行深拷贝:
实现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/articles/10600244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值