1、如果继承A类来定义B类,这里使用关键字extends表示继承

public class B extends A
{
    //...
}

2、超类中的方法对于子类并不一定都适用,为此我们需要提供一个新的方法来覆盖(override)超类中的这个方法

3、在重写过程中,如果想在子类方法中调用超类的(同名)方法,那么我们需要用super关键字

public double getSalary()
{
	double base = super.getSalary();
	return base + bonus;
}

4、子类构造器:关键字super的含义是调用父类中带有name、salary参数的构造器

public Employee(String name, int salary)
{
	super(name, salary);
	bonus = 0;
}

5、如果子类的构造器没有显式地调用超类的构造器,将自动地调用超类的无参构造器,如果此时超类没有无参构造器将会引发错误

6、多态和动态绑定(另参考博客java多态)

7、有时我们可能希望阻止人们利用某个类定义子类(确保它们不会在子类中改变语义),这种不允许扩展的类被称为final类

public final class B extends A
{
    //...
}

类中的某个特定方法也可以被声明为final,这样子类就不能覆盖这个方法(final类中所有方法自动成为final方法)

public final String getName()
{
	return name;
}

8、进行强制类型转换的唯一原因:要在暂时忽视对象的实际类型之后使用对象的全部功能。如果将一个子类的引用赋给超类变量,编译器是允许的,但是如果将一个超类的引用赋给一个子类变量时,就必须用到强制类型转化了

Manager boss = (Manager) staff[0];

9、如果试图在继承链上进行向下的强制类型转化(超类转子类),并且“谎报”对象内容,会产生异常,如果没有捕捉这个异常,程序会终止。因此我们可以用instanceof操作符来判断类的类型

if(staff[1] instanceof Manager)
{
    //...
}

10、我们可以使用abstract关键字实现抽象类,包含一个或多个抽象方法的类必须被声明为抽象的

public abstract class Employee
{
	//...
	public abstract String getName();
}

抽象方法充当着占位方法的角色,他们在子类中具体实现,扩展抽象类可以有两种选择:在子类中保留(部分或全部)抽象方法,子类仍是抽象的;定义全部方法,这样子类就不是抽象的

11、可以将字段设置为protected对本包和所有子类可见、如果没有标识符则是对本包可见