继承

继承的关系:“is a”(每个经理都是雇员)

子类中可以直接使用父类中的public 和protected变量,但是不能使用private变量。

super并不是一个对象的引用,不能赋给一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字

super构造器:super(name,id),super调用构造器语句必须是子类第一条语句。

如果子类构造器没有显式调用超类构造器,则将自动调用超类没有参数的构造器。如果超类没有,那么报错。

super的两个用途:1、调用超类的方法;2、调用超类的构造器

一个对象变量可以指示多种实际类型的现象被成为多态;在运行时你能够自动的选择调用那个方法的现象称为动态绑定

多态:

虽然可以将一个子类的对象赋给超类变量,但是编译器仍将这个对象看成超类对象,不能调用子类的方法。

子类数组可以转换成超类数组的引用:

Manager[] managers = new Manager[10];
Employee[] staf = managers;
staf[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);//编译器接纳,运行时报错: ArrayStoreException

方法签名=名字+参数;允许子类将覆盖方法的返回类型定义为原返回类型的子类型。

 静态绑定(private,static,final方法)和动态绑定(调用的方法依赖于参数实际类型)

 动态绑定重要特性:对现有程序扩展无需修改代码。

子类方法可见性不能低于父类。


final:

确保语义在子类中不会发生改变 

强制类型转化:

1、只能在继承层次内进行

2、将超类转换程子类前,instanceof检查

抽象类:

包含了一个或多个抽象方法的类本身必须声明为抽象的。

抽象类可以包含具体数据和具体方法。

类即使不含抽象方法,也可以将类声明为抽象类。

抽象类不能被实例化。但是可以定义一个抽象类的对象变量。

Person[] people = new Person[2];

// fill the people array with Student and Employee objects
people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
people[1] = new Student("Maria Morris", "computer science");

// print out names and descriptions of all Person objects
for (Person p : people)
System.out.println(p.getName() + ", " + p.getDescription());

如果抽象类Person中没有getDescription方法,则不能p.getDescription()。编译器只允许调用在类中声明的方法。

Object类:

只有基本类型不是对象,所有的数组类型都是对象(包括基本类型)。

equals方法:

public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Privilege other = (Privilege) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

hashcode方法:

String类的散列码是由内容到处的,所以只要字符串内容相同,则hash code相同。

而没有定义hashCode()方法的类,会使用object类默认的hashCode方法导出对象存储地址。

当重新定义equals方法时,必须重新定义hashCode方法,以便用户可以将对象插入到散列表中。

equals与hashcode的定义必须一致,如果a.equals(b)返回true,那么a.hashcode()就必须和b.hashcode()具有相同的值。

原文地址:https://www.cnblogs.com/ChuPengcheng/p/6084001.html