竹笋

首页 » 问答 » 常识 » 为什么局部内部类和匿名内部类只能访问局部
TUhjnbcbe - 2025/4/29 18:42:00

为什么局部内部类和匿名内部类只能访问局部final变量

编译后会生成2个class文件Test.Class,Test1.class

内部类和外部类处于同一级别,内部类不会因为定义在方法中就会随方法的执行完毕就销毁,这就会产生问题

当外部类的方法执行结束,局部变量就会被销毁(垃圾回收机制),但内部对象可能还存在,内部类访问一个不存在的变量,解决问题:就将这局部变量复制一份作为内部类的成员变量,这样当局部变量死亡后,内部类扔可以访问他,实际访问的是局部变量的“copy”,这样好像延长局部变量的生命周期

将局部变量复制到内部类的成员变量时,必须保证两个变量是一样的,若内部类修改成员变量方法中的局部变量也跟着改变,如何解决?

(一种妥协)将局部变量设置final,对他初始化,不让修改这个变量,就保证内部类的成员变量和外部类的方法变量一致,使局部变量和内部类建立的拷贝一致

List和set区别

List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用迭代器iterator取出所有元素,在逐一遍历,还可以使用get(intindex)获取指定下标元素

Set:无序,不可重复,最多只允许1个null元素对象,只能使用迭代器iterator取出所有元素

hashcode和equals

Hashcode():获取哈希码,也称散列码,(2个不同的值可能计算相同的hashcode)实际上返回一个int整数,Hashcode()定义在JDK的object.Java中(是个本地方法),java中任何类都包含Hashcode()函数,这个哈希码作用确定改对象在哈希表中的索引位置(对象在堆中的位置),散列表存储的是键值对(key-value),特点:根据“键”快速检索”值“

equals:java提供程序员定义对比两个对象什么时候是相等的,用什么规则来定义,就是equals方法,重写equals方法,来定义两个对象的对比规则,如果不重写,采用object中的equals,就是==,对比的是对象在栈中的引用地址,如果是基本类型变量,对比栈中的值

为何要有hashcode?Q:“hashset如何检查重复

Hashset集合,不可以放重复元素,当对象加入hashset时,hashset首先会计算对象的hashcode值,看这个位置上是否有值,如果没有,hashset会假设对象没有重复出现,如果有值(hashcode冲突),这时会调用equals()方法来检查两个对象是否相等,如果相同,hashset就不会让他加入,如果不同(hashset同,equals不同),就重新散列到其他位置,这样就减少equals使用,提高执行速度(equals耗性能,对比内存地址)

如果2个对象相等,则hashcode一定相同

2个对象相等,调用equals方法返回true

2个对象有相同hashcode值,她们不一定同

equals方法被覆盖,则hashcode方法也会被覆盖

hashcode()默认行为是对堆上的对象产生独特值(索引值)

1
查看完整版本: 为什么局部内部类和匿名内部类只能访问局部