继承:基于已存在的类构造新类(其实也就是复用代码)

public class Manager extends Employee{private double bonus;public void setBonus(double bonus){this.bonus = bonus;}}//通用放在基本类,特殊用途放在子类

覆盖方法(override):

public double getSalary(){double baseSalary = super.getSalary();return baseSalary + bonus;}//覆盖基类中的getSalary()方法。注意super关键字!!!

子类构造器:子类不可以直接访问父类的私有域,使用super调用父类构造器语句必须是子类构造器的第一句。如果不写,则默认加上无参数的父类构造器,如果父类中没有无参数的父类构造器,则编译出错。

//子类构造器public Manager(String name,double salary,int year,int month, int day){super(name,salary,year,month,day);bonus = 0;}

尽管将 e 声明为 Employee 类型, 但实际上 e 既可以引用 Employee 类型的对象,也可以引用 Manager 类型的对象。

当 e 引用 Employee 对象时, e.getSalary( ) 调用的是 Employee 类中的 getSalary 方法;当 e 引用 Manager 对象时,e.getSalary( ) 调用的是 Manager 类中的 getSalary 方法。

虚拟机知道 e 实际引用的对象类型,因此能够正确地调用相应的方法。 一个对象变量(例如, 变量 e ) 可以指示多种实际类型的现象被称为多态( polymorphism)。 在运行时能够自动地选择调用哪个方法的现象称为动态绑定( dynamic binding。)

继承层次

继承层次:由一个类派生出的所有类的集合

继承连:某个类到其祖先的路径




java 定义抽象方法子类不实现_java 定义抽象方法子类不实现


判断是否应该设计为继承(is-a 规则)比如:经理是雇员,经理就继承雇员;

(个人理解,也可以用“包含”来判断继承,比如子类拥有父类的一切行为和属性)

抽象类型会限制实际类型的方法访问。比如Employee e = new Manager(xxx); e.setBonus()编译就会出错,因为setBonus()是Manager的特殊方法。

不能将父类引用赋值给子类变量:

Manager m = new Employee(XXX);

也就是无法直接向下转型,可以这样理解,因为包含的关系,如果父类型的对象引用子类型的特殊方法,因为父类不存在这样的方法,所以就会报错。

阻止继承:final 类和方法

有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。

public final class Executive extends Manager{...} //禁止再定义Executive的子类

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

public class Employee{public final String getName(){return name;}}

强制类型转换

类型描述了这个变量所引用的以及能够引用的对象类型。

// 强制类型转换double x = 3.405;int nx = (int) x;if(staff[1] instanceof Manager){boss = (Manager) staff[1];}//在进行类型转换之前,先查看一下是否能够成功地转换。这个过程简单地使用 instanceof 操作符就可以实现。

如果这个类型转换不可能成功, 编译器就不会进行这个转换。例如,下面这个类型转换: String c = (String) staff[1];

将会产生编译错误, 这是因为 String 不是 Employee 的子类。 综上所述:

•只能在继承层次内进行类型转换。

•在将超类转换成子类之前,应该使用 instanceof进行检查。

(大多数情况不需要强制转型,因为多态性的动态机制能够自动找到相应方法,只有使用子类特殊方法才需要进行类型装换,尽量少用转型和instanceof)

抽象类

上层类更具通用性,更抽象,只将其作为其他类基类而不像作为实例类。

用abstract关键字就不用实现抽象方法;

public abstract String getDescription();

包含抽象方法的类本身必须被声明为抽象

public abstract class Person{public abstract String getDescription();}

抽象类可以包含更具体的数据和具体的方法,

//建议尽量将通用的域和方法放在父类中public abstract class Person{private String name;public Person(String name){this.name = name;}public abstract String getDescription();public String getName(){return name;}}

抽象类不能实例化,但是可以定义一个抽象类型的变量,不过它只能引用非抽象子类的对象。