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对本包和所有子类可见、如果没有标识符则是对本包可见