1、继承
关键字extends表示继承,表明正在构造的新类派生于一个存在的类。
class Manager extends Employee
{
....
}
Java中,所有的继承都是公有继承。而C++中还有私有继承,保护继承。
已存在的类称为超类、基类或父类;新类称为子类、派生类。
子类往往比父类拥有更加丰富的功能。
子类方法和父类方法同名时,称为方法的覆盖(override)。
使用超类中的方法使用super关键字:
super.getSalary(); //调用父类中方法
super在子类构造器中的应用:
class Manager extends Employee
{
public Manager(String n ,double s)
{
super(n, s); //实际上调用父类中的构造器
}
}
一个对象变量可以指示多种实际类型的现象被称为多态。
在运行时能够自动地选择调用哪个方法的现象被称为动态绑定。
2、继承层次
一个公共类派生出来的所有类的集合被称为继承层次。
继承链的概念:某个特定的类到其祖先的路径。
Java不支持多继承。
3、多态
置换法则:
例如:可以将一个子类的对象赋给超类变量:Employee e;
e = new Employee(...);
e = new Manager(...);以上都是合法的。
在Java中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象。
置换法则的优点:Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;编译器将staff[0]看成Employee对象。意味着可以这样调用:boss.setBonus(5000);//OK
staff[0].setBonus(5000);//不OK
4、动态绑定
如果是private 方法、static方法、final方法或者构造器,那么编译器可以准确的知道应该调用那个方法。此称之为“静态绑定”。
调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
动态绑定有个重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。
5、阻止继承:final类和方法
不允许扩展的类称为final类。声明格式如下:
6、强制类型转换
不允许扩展的类称为final类。声明格式如下:final class Executive extends manager
{
...
}类中的特定方法也可以声明为final。若果这样做,子类就不能覆盖这个方法了:class Employee
{
...
public final String getName()
{
return name;
}
...
}设成为final方法或类主要目的为:确保他们不会在子类中改变语义(阻止继承,不允许对子类对final方法或final类处理)。
转换实例:Manager boss = (Manager) staff[0];判断能否转换:if(staff[1] instancof Manager)
{
boss = (Manager)staff[1];
...
}
7、抽象类
使用abstract关键字,实例:abstract class Person
{
private String name;
public Person(String n)
{
name = n;
};
public abstract String getDescription(); //抽象方法
public getName()
{
return name;
};
}抽象类不能实例化!表达式 ***new Person("asasf");***是错误的。
可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。例如:Person p = new Student("ABC","CBA"); //子类student的对象变量。通过抽象类Person扩展一个具体的子类Student:class Student extends Person
{
private String major;
public Student(String n, String m)
{
super(n);
major = m;
}
public String getDescription()
{
return "a student majoring in" + major; //子类中定义了getDescription()方法,所以Student类中全部方法都是非抽象方法。
}
}
8、受保护访问
最好将类中的域标记为private,而方法标记为public。
有些时候,人们希望超类中某些方法允许子类访问,或允许子类的方法访问超类的某个域。为此要将方法或类声明为protected。
Java用于可见性的4个访问修饰符:
1)仅对本类可见————private。
2)对所有类可见————public。
3)对本包和所有子类可见————protected。
4)对本包可见————默认,即不需要修饰符。