我想拿到Offer(四)
内部类:
什么是内部类?
在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内 部类本身就是类的一个
属性,与其他属性定义方式一致。
内部类的分类有哪些?
内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。
静态内部类:
定义在类内部的静态类,就是静态内部类,静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量; 静态内部类的创建方式,new 外部类.静态内部类()。
成员内部类:
定义在类内部,成员位置上的非静态类,就是成员内部类,成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例,它的创建方式外部类实例.new 内部类()。
局部内部类:
定义在方法中的内部类,就是局部内部类,定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法 中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new内部类()。
匿名内部类:
匿名内部类就是没有名字的内部类,日常开发中使用的比较多
除了没有名字,匿名内部类还有以下特点:
- 匿名内部类必须继承一个抽象类或者实现一个接口。
- 匿名内部类不能定义任何静态成员和静态方法。
- 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
匿名内部类创建方式:
new 类/接口{
//匿名内部类实现部分
}
内部类的优点:
- 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据。
- 内部类不为同一包的其他类所见,具有很好的封装性。
- 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
- 匿名内部类可以很方便的定义回调。
内部类有哪些应用场景?
- 一些多算法场合。
- 解决一些非面向对象的语句块。
- 适当使用内部类,使得代码更加灵活和富有扩展性。
-
当某个类除了它的外部类,不再被其他的类使用时。
局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?
是因为生命周期不一致, 局部变量直接存储在 栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变 量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。
重写与重载:
构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载
重载(Overload)和重写(Override)的区别。重载的方法能 否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态 性,而后者实现的是运行
时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不 同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回 类型进行区分。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等父类,访问修饰符大于等于父类(里氏代换原则),如果父类 方法访问修饰符为private则子类中就不是重写。
对象相等判断:
== 和 equals 的区别是什么?
== :它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。(基本数据类型== 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆equals() 方法。则通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象 的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
hashCode 与 equals (重要)
例题:
- HashSet如何检查重复
- 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
- hashCode和equals方法的关系
- 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时 必须重写hashCode方 法?
hashCode()介绍:
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整 数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义 在JDK的Object.java中,这就意味着Java中的何类都包含有hashCode()函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出 对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)
hashCode()与equals()的相关规定:
如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个对象分别调用equals方法都返回true 两个对象有相同的hashcode值,它们也不一定是相等的。
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指 向相同的数据)。
对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的 内存地址是否相等。
JDK 中常用的包有哪些?
- java.lang:这个是系统的基础类;
- java.io:这里面是所有输入输出有关的类,比如文件操作等;
- java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
- java.net:这里面是与网络有关的类;
- java.util:这个是系统辅助类,特别是集合类;
- java.sql:这个是数据库操作的类。
最后,小应学长祝大家新年快乐!!! 祝大家在2022年工作顺利,学业有成,大家一起努力,为了自己的目标前进!加油!!