java就业--------03
一、内部类
-
什么是内部类?
- 在类的内部即为内部类
-
内部类的格式?
public class Outer{
public class Inner{
}
}
-
内部类成员的访问特点是什么?
- 内部类访问外部类:直接使用即可,包括被private修饰的
- 外部类访问内部类:先创建对象 -> 通过对象调用内部类方法
-
内部类分为哪两种?
- 成员内部类
- 局部内部类
-
成员内部类在类中的什么位置?
- 类中方法外
-
外界使用成员内部类的格式?
- Outer .Innter oi = new Outer().new Inter();
- 内部类为了隐藏,不让外界直接访问,间接访问
- 在外部类的方法中 --> 创建内部类对象(可以直接访问)
- 在外部类方法中 – > 使用创建好的内部类对象调用内部类的方法
- 内部类为了隐藏,不让外界直接访问,间接访问
- Outer .Innter oi = new Outer().new Inter();
-
局部内部类
- 局部内部类定义在类中什么位置?
- 外部类的成员方法中的位置
- 局部内部类定义在类中什么位置?
-
外界如何使用局部内部类?
- 在定义的方法中创建内部类对象
- 通过内部类对象调用内部类的方法
- 创建外部类对象,通过外部类调用方法
-
匿名内部类
-
匿名内部类的使用前提是什么?
- 有具体类/抽象类
-
格式?
-
new 类名/接口名(){
//重写方法;
}
-
-
-
匿名内部类的本质是什么? 匿名内部类不是接口,抽象类实例化了
- 抽象类 --> 子类的匿名对象
- 接口 --> 实现类的匿名对象
-
什么情况下我们推荐使用匿名内部类?
- 单次使用
- 当接口/抽象类的需要重写的方法只有一个的时候
二、Object类
2.1toString()方法
-
Object类是什么类?
- Object为什么有个参方法呢? - > 所有类直接或者间接集成Object类,所以说每个类的无参构造都会more调用Object父类的无参构造方法
-
我们直接打印对象,打印出来的是对象的全限定类名+@+地址值,执行流程是什么?
Student s = new Student(); -> Student类默认没有重写toString()方法. System.out.println(s); public void println(Object x) { //Object x -> Student对象s. String s = String.valueOf(s); //s = 全限定类名+@+虚拟机根据情况生成一段代码. print(s); } public static String valueOf(Student s) { //判断Student对象s是不是为null,如果不是调用了s对象的toString方法. return (s == null) ? "null" : s.toString(); } Student没有重写toString()吧 -> 所以说默认调用父类Object类的toString方法. public String toString() { //全限定类名+@+虚拟机根据情况生成一段代码. return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
我们为什么要重写toString方法
- 重写toString方法,可以让我们直接打印对象之后,获取到对象的属性值。
- 推荐每个类都去重写toString方法
- 重写toString方法,可以让我们直接打印对象之后,获取到对象的属性值。
2.2equals()方法
-
我们对比两个引用类型的值是否相同为什么不用==来比较?
- ==比较引用类型的时候 ==> 比较的是地址值
-
String类可以使用equals进行值的比较,为什么我们自己写的类,创建完对象之后,可以调用equals方法,但是即便属性值相同,比较出来的也是false?
- 自己写的类,没有重写equals()方法,默认调用了是Object;类的equals() Object类的equals方法默认还是比较的是地址值
- String重写了equals方法可以比较内容。
-
重写equals方法完成后,equals方法的执行流程是什么?
@Override public boolean equals(Object o) { //1.比地址值 -> 如果不同,向下比较,如果相同,返回true. if (this == o) return true; //2.比较是不是一个类并且判断参数o是不是为null -> 如果以上两种满足任意一种,则返回false. if (o == null || getClass() != o.getClass()) return false; //3.向下转型 -> 转成什么型? 谁调用就转为谁. Student student = (Student) o; //4.比较各个属性是否一样. if (age != student.age) return false; if (name != null ? !name.equals(student.name) : student.name != null) return false; return school != null ? school.equals(student.school) : student.school == null; }
-
为什么同时要重写hashCode方法?不重写是否可以?–> 可以更高效
-
equals方法的等价关系了解 --> 面试题
-
- 自反性
- x.equals(x) -> true.
- 对称性
- x.equals(y) y.equals(x) -> 结果需要一样.
- 传递性
- x.equals(z) y.equals(z) -> 结果如果都为true,x.equals(y) -> 也为true.
- 一致性
- x.equals(y) -> 在不改变二者的属性的前提下,调动多少次这个方法结果都一样.
- 非空型
- x.equals(null) -> false
- 自反性
- 推荐每个类都重写equals和hashCode.
-