1.is-a 是继承的一个明显特征。
2.关键字extends表明正在构造的新类派生于一个已存在的类。
3.子类比父类(超类)拥有的功能更加丰富。
4.在设计类的时候,应该将通用的方法放在超类中,而将有特殊用途的方法放在子类中。
5.在子类中可以增加域,增加方法,或者覆盖超类的方法,然而,绝对不能删除继承的任何域和方法。
6.super(n,s,year,month,day);是"调用超类Employee中含有n,s,year,month,day参数的构造器"的简写形式。
7.由于manager类的构造器不能访问Employee类的私有域,所以必须利用Employee类的构造器对这部分私有域进行初始化,我们可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句。
8super关键字的两个用途:
一是调用超类的方法,而是调用超类的构造器。
9.一个对象变量(例如,变量e)可以引用多种实际类型的现象被称为多态,在运行时能够自动的选择调用哪个方法的现象称为动态绑定
阻止继承
不允许扩展的类被称为final类,
一个类前面被final修饰,那这个类不允许继承。而类中的方法也可以被声明为final,表明子类就不能覆盖这个方法(final类中的所有方法自动成为final方法)。
域也可以被声明为final,对于final域来说,构造对象之后就不允许改变它们的值了。不过,如果将一个类声明为final,只有其中的方法自动成为final,而不包括域。
强制类型转换
强转的使用:只能再继承层次内进行类型转换。
在将超类转换成子类之前,应该使用instanceof进行检查。
抽象类:
包含一个或多个抽象方法的类本身必须被声明为抽象的。
抽象类中也可以包含具体数据和具体方法。
类即使不含抽象方法,也可以将类声明为抽象类。
抽象方法充当着占位 的角色,它们的具体是实现在子类中。扩展抽象类可以有两种选择。一种是在子类中定义部分抽象的方法或抽象方法也不定义,这样就必须将子类也标记橙抽象类;另一种是定义全部的抽象方法,这样一来,子类就不是抽象的了。
继承一个抽象类的时候,如果父类中有抽象方法,子类必须去实现。
package cn.itcast.demo;
import java.util.Random;
public class PersonTest {
public static void main(String[] args)
{
person[] people = new person[2];
people[0] = new Employee("jingli",50000);
people[1] = new Student("xiaoming","fujinyizhong");
for(person p:people)
{
System.out.println("name="+p.getName()+","+p.getDescription());
}
}
}
abstract class person
{
private String name;
public person(String n)
{
name = n;
}
public abstract String getDescription();
public String getName()
{
return name;
}
}
class Employee extends person
{
private double salary;
private int id ;
private static int nextId;
public Employee(String n,double s )
{
super(n);
salary = s;
}
public double getSalary()
{
return salary;
}
public int getId()
{
return id;
}
public String getDescription()
{
return String.format("an Employee with a salary of $%.2f", salary);
}
static
{
Random r = new Random();
nextId = r.nextInt(500);
}
{
id = nextId;
nextId++;
}
}
class Student extends person
{
private String major;
public Student(String n,String m)
{
super(n);
major = m;
}
public String getDescription()
{
return "a student major in "+major;
}
}