Object对象你真理解了吗?(二)

简介: 笔记

三、toString方法


接下来我们看看toString方法,也十分简单:

68.jpg

toString方法主要是用来标识该对象的:

69.jpg


从上面的结果我们都可以看出来:得出的结果我们并不能看到什么东西~

于是我们一般都重写toString(),那么打印出的结果就很方便我们调试了

@Override
    public String toString() {
        return "Address{" +
                "provinceNo=" + provinceNo +
                ", cityNo=" + cityNo +
                ", streetNo=" + streetNo +
                '}';
    }

下面的结果看起来就好多了:

0.jpg


四、clone方法


我们也来看看它的顶部注释:

70.jpg

看了上面的注释我们可以总结以下的要点

  • clone方法用于对象的克隆,一般想要克隆出的对象是独立的(与原有的对象是分开的)
  • 深拷贝指的是该对象的成员变量(如果是可变引用)都应该克隆一份,浅拷贝指的是成员变量没有被克隆一份

下面我们来看一下浅拷贝:拷贝了Employee对象,但是其成员变量hireday没有被克隆出去,所以指向的还是同一个Date对象

71.jpg


4.1clone用法


那么我们如何克隆对象呢?无论是浅拷贝还是深拷贝都是这两步:

  1. 克隆的对象要实现Cloneable接口
  2. 重写clone方法,最好修饰成public

浅拷贝:仅仅拷贝了Person对象,而date没有拷贝!

public class Person implements Cloneable {
    // 可变的成员变量
    private Date date;
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

深拷贝:不仅拷贝了Person对象,也拷贝了date成员变量

public class Person implements Cloneable {
    // 可变的成员变量
    public  Date date;
    @Override
    public Object clone() throws CloneNotSupportedException {
        // 拷贝Person对象
        Person person = (Person) super.clone();
        // 将可变的成员变量也拷贝
        person.date = (Date) date.clone();
        // 返回拷贝的对象
        return person;
    }
}


4.2clone疑问进一步学习protected


不知道有没有人跟我有相同的疑问

  • 我只想要浅拷贝,能不能直接调用该对象.clone()来实现

比如我现在有个Address对象:

public class Address  {
    private int provinceNo;
    private int cityNo;
    private int streetNo;
    public Address() {
    }
    public Address(int provinceNo, int cityNo, int streetNo) {
        this.provinceNo = provinceNo;
        this.cityNo = cityNo;
        this.streetNo = streetNo;
    }
}

下面的代码你们认为如何

Address address = new Address(1, 2, 3);
    address.clone();

我们都知道:

  • protected修饰的类和属性,对于自己、本包和其子类可见

可能会想clone()方法是定义在Object类上的(以protected来修饰),而我们自定义的Address对象隐式继承着Object(所有的对象都是Object的子类),那么子类调用Object以protected来修饰clone()是完全没问题的

  • 但是,IDE现实告诉我,这编译就不通过了

72.png

出现错误的原因我立马就想到:是不是我对protected修饰符出现了偏差?

protected修饰的类和属性,对于自己、本包和其子类可见,这句话本身是没有错的。但是还需要补充:对于protected的成员或方法,要分子类和超类是否在同一个包中。与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员

  • 上面的代码就错在:Address与Object不是在同一个包下的,而Address直接访问了Object的clone方法。这是不行的。

下面我截两张图再来给你们看看(看完图再看上面的描述,就能理解了):

73.png74.jpg

图片来源和更多的展开阅读

https://blog.csdn.net/wangyanguiyiyang/article/details/49800493


五、wait和notify方法


wait和notify方法其实就是Java给我们提供让线程之间通信的API。

按照惯例我们还是来看注释怎么说吧:

wait方法:

75.jpg

目录
相关文章
|
1月前
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
29 1
ES6中map对象的使用,确实比Object好使哈
|
19天前
|
Python
通过 type 和 object 之间的关联,进一步分析类型对象
通过 type 和 object 之间的关联,进一步分析类型对象
41 3
|
5天前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
6 0
|
2月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
2月前
|
SQL 存储 数据库
|
2月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
|
2月前
|
JavaScript
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
|
5月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
50 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
|
4月前
|
Java 编译器 数据处理
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
54 0