继承(二)

在继承链上进行向下的转换的一些事项:

 超类转换为子类前要检查(为什么要将超类转换成子类?这通常意味着超类的设计存在问题)

 

抽象类

如果一个方法用abstract修饰,则在这个类里就不用实现这个方法了

抽象类的语法和注意事项

子类是否实现抽象的影响:

注意:

关于抽象超类引用的问题:

关于调用的问题

 

通常的权限访问:

 

protected关键字的设计初衷

protected对所有子类以及同一个包中的所有其他类都可见

另外,默认情况下,不加修饰符的时候只对本包可见

Object类:
哪些是对象,哪些不是对象:

所以:
Object obj = new Employee("Mike", 100);

obj = new int[10];

是正确的

 

equals方法:

关于equals的初始含义和实际运行过程中应该有的含义:

equals方法的使用示例:

import java.io.Console;
import java.time.*;
import java.util.*;

class Employee{
    private String name;
    private int age;
    public Employee(String a_name, int a_age) {
        name = a_name;
        age = a_age;
    }
    
    // 如果要比较Manager是否相等,则可以先:
    // super.equals(obj) ... 进行比较大小
    public boolean equals(Object o) {
        if(this == o)
            return true;
        
        if(o == null)
            return false;
        
        if(getClass() != o.getClass())
            return false;
//        if (!super.equals(o))
//            return false;
//        
        Employee oe = (Employee) o;
        // 如果name == null, 下面的写法就崩溃了,所以要下下种写法
        // return name.equals(oe.name) && age == oe.age;
        return Objects.equals(name, oe.name) && age == oe.age;
    }
}

class Manager extends Employee{
    public Manager(String n, int a) {
        super(n, a);
    }
}
public class Test{
    public static void main(String[] args) {
        Employee a = new Employee("Mike", 100);
        Employee b = new Employee("Jack", 20);
        Manager m = new Manager("Ec", 21);
        System.out.println(a.equals(b));
        System.out.println(a.getClass() == m.getClass());
    }
}

问题:

getClass 与 instanceof 有什么区别呢?

equals的替换性

。。。完美的equals方法

posted @ 2018-11-28 17:38  geeklove  阅读(101)  评论(0编辑  收藏  举报