Object类 内部类 数组

Object类 老祖宗类

  1. toString方法
    源代码:
		public String toString() {
   
				return this.getClass().getName() + "@" + Integer.toHexString(hashCode());
			}

原有方法不够用 只能输出对象内存地址
2. equals方法
源代码:

public boolean equals(Object obj) {
   
				return (this == obj);
			}
  • 在Object类中的equals方法当中,默认采用的是 “== ” 判断两个java对象是否相等。而 “ == ” 判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。
public boolean equals(Object obj){
   
		return obj == this;
}//不够用需重写

public boolean equals(Object obj){
   //重写方法要求修饰符、名称、返回值类型、形式参数列表一致
	if(obj == null||!(obj instanceof Student)) return false;
	if(obj == this) return ture;
	
	Student s = (Student) obj;//向下转型 判断具体内容一致不一致
	return name == s.name &&  school.equals(s.student);
		

}
  • 判断基本数据类型是否相等使用 “== ”就行,引用数据类型必须使用equals方法(需要重写)
  1. finalize 方法 (已过时)
    该方法 由 protected修饰 该方法没有方法体
protected void finalize() throws Throwable { }

JVM垃圾回收器调用
finalize()方法实际上为程序员准备了一个时机,垃圾销毁时机,如果想在这个时机执行一些代码,可以写进finalize() 方法体中。

  1. clone()
    深克隆和浅克隆

内部类

  1. 在类的内部又定义了一个新的类,被称为内部类。
    内部类包括:
  • 静态内部类
  • 动态内部类
  • 局部内部类 包括匿名内部类(通过接口直接new个对象 只能调用一次)

数组

  • 是一种引用数据类型

  • 数组可以储存基本数据类型和引用数据类型
    其中引用数据类型是吧内存地址储存在数组当中

  • 一旦创建完成,数组的长度不可以变

  • 数组中元素类型统一,苹果类型数组只能装苹果
    在这里插入图片描述

  • 数组中元素在数组中储存的内存地址是连续的(这是数组储存元素的一个特点 (优势)),因此整个数组的内存地址以第一个元素的内存地址作为地址是讲得通的。

  • 优点:数组元素检索效率高 原因如下:

    1. 每一个元素的内存地址在空间存储上是连续的。
    2. 每一个元素类型相同,所以占用空间大小一样。
    3. 知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以
      通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。
  • 缺点:不能储存大量数据,内存中很难找到一块大的连续的内存空间。

  1. 初始化的方式:

    • 静态初始化:int[] array = {1,2,3,4,5};
    • 动态初始化:int[] array = new int[5];
      五个元素的默认值为0;若为引用数据类型则元素默认值为null。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果要监听数组内部元素的变化,需要使用Vue提供的$set方法或者Vue.set方法,这两种方法本质上是一样的。它们的作用是给数组添加一个新元素并触发视图更新。 假设我们有一个数组items,它的每个元素都是一个对象,我们想要监听每个对象的变化,可以使用以下代码: ``` <template> <div> <ul> <li v-for="(item, index) in items" :key="index"> <input v-model="item.name"> <button @click="deleteItem(index)">删除</button> </li> </ul> <button @click="addItem">添加</button> </div> </template> <script> export default { data() { return { items: [ { name: 'apple' }, { name: 'banana' }, { name: 'orange' }, ], }; }, methods: { addItem() { this.items.push({ name: 'pear' }); }, deleteItem(index) { this.items.splice(index, 1); }, }, watch: { // 监听items数组的变化 items: { handler(newVal, oldVal) { console.log('数组变化了', newVal, oldVal); }, deep: true, }, }, mounted() { // 监听每个对象的变化 this.items.forEach((item, index) => { this.$set(item, 'watcher', () => { console.log(`第 ${index} 个元素的 name 属性变化了`); }); Object.defineProperty(item, 'name', { get: function () { return item._name; }, set: function (newVal) { item._name = newVal; item.watcher(); }, }); }); }, }; </script> ``` 在上面的代码中,我们为每个对象添加了一个叫做watcher的属性,并将它设置为一个函数,这个函数会在每个对象的name属性变化时被触发。在mounted生命周期钩子函数中,我们遍历items数组,为每个对象添加了watcher属性,并通过Object.defineProperty方法监听了每个对象的name属性的变化。当name属性发生变化时,会触发watcher函数并输出相应的信息。 需要注意的是,使用这种方法监听数组元素的变化需要手动实现,比较麻烦,不过可以通过封装一个watchArray函数来简化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值