(java08)多态的应用、内部类、hashCode()、Class getClass()、String toString()、boolean equals(Object obj)
多态的应用(精通)
一 直接只用多态(父类引用指向子类对象)
Student s = new PrimaryStudent();
二 使用父类作为形参实现多态
当形参是普通类时:此时方法的本质是希望传入的是该类的对象/匿名对象/匿名内部类;
当形参是抽象类时:此时方法的本质是希望传入的是该类的子类对象/匿名内部类;
当形参是接口时,此时方法的本质是希望传入的是该接口的实现类对象/匿名内部类。
三 使用父类作为返回值实现多态
当一个方法的返回值是一个普通类时:此时方法的本质是希望返回的是该类的对象/匿名对象/匿名内部类,必须使用返回值类型或该类的父类接收;
当一个方法的返回值是一个抽象类时:此时方法的本质是希望返回的是该类的子类对象/子类匿名对象/匿名内部类,必须使用返回值类型或该类的父类接收;
当一个方法的返回值是一个接口时:此时方法的本质是希望返回的是该接口的实现类对象/实现类匿名对象/匿名内部类,必须使用返回值类型或该类的父类接收。
匿名内部类格式:
new 类名() {重写方法或者自定义方法;};
new Animal() {
@Override
public void bark() {
System.out.println("动物的子类叫");
}
@Override
public void show() {
System.out.println("动物的子类show");
}
};// 这个东西它是一个对象,它是一个继承了Animal类的子类匿名对象
内部类
为什么需要学习内部类 --> 提高了类的安全性
内部类的分类:
1.成员内部类: 定义在成员位置
2.局部内部类: 定义在局部位置
3.静态内部类: 使用static修饰内部类
4.匿名内部类: 该类本质是一个继承或者实现了某个类或者抽象类或者接口的子类匿名对象
内部类的特点:
1.如果外部类想要访问内部类成员,需要创建内部类对象
2.如果内部类想要访问外部类成员,可以直接访问,包括私有
3.内部类编译生成的字节码文件格式:
成员内部类: 外部类类名数字内部类类名
静态内部类: 外部类类名数字
成员内部类访问格式:
外部类类名.内部类类名 对象名 = new 外部类类名().new 内部类类名();
当内部类成员和外部类成员重名的时候访问外部类成员格式: 外部类类名.this.成员
当内部类成员和外部类成员重名,并且和父类成员重名的时候访问父类成员格式: 外部类类名.super.成员
静态内部类访问格式:
外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名();
1.静态内部类中即可以有静态成员,也可以有非静态成员
2.访问静态内部类中的非静态成员可以通过创建静态内部类对象访问
3.访问静态内部类中的静态成员可以直接通过类名访问
访问格式: 外部类类名.内部类类名.成员
哈希码值 hashCode()
Student s1 = new Student(“隔壁老王”, 30);
int s1HashCode = s1.hashCode();
System.out.println(s1HashCode); // (2018699554) 返回该对象的哈希码值。
由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
1.该方法会针对不同对象返回不同整数。
2.该数不是地址值,是地址的一个转换值,所以如果两个对象的hashCode值相同,不能够完全保证两个对象是同一个对象。
4.该方法和哈希表数据结构有关,此方法的设计是为了提高哈希表的性能。
Class getClass()
什么是Class?
Java当中使用 class来描述现实世界的所有事物,那么用Class来描述class
Java文件编译生成的字节码文件就是 Class
String toString()
返回该对象的字符串表示。快捷键: alt + shift + s 再按 S
@Override
public String toString() {
return "Employee [name=" + name + ", id=" + id + ", salary=" + salary + "]";
}
boolean equals(Object obj) (重点掌握)
自动生成equals方法 alt + shift + s 再按H
==和equals的区别:
== 比较:
基本数据类型: 比的是数值是否相等
引用数据类型: 比的是地址
equals比较:
基本数据类型: 不能比较
引用数据类型:默认比较的是地址(该比较没有意义,例如父类Object的equals方法不能够满足子类Student的需求,所以需要方法重写)
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
下一篇: 关于初始化