继承(inheritance)
和字面上的理解一样,人们可以基于一个已存在的类构造一个新的类,新的类可以继承已存在类的功能。
超类和子类
关键字exends表明正在构造的新类派生于一个已存在的类。已存在的类被称为超类(superclass)、父类(parent class)或基类(base class);新类被称为子类(subclass)、派生类(derived class)或孩子类(child class)。超类和子类是Java程序员最常用的两个术语。
接着来看关键字exends的使用,这里直接就引用书中的例子来说明了。
假设有一个已存在的Employee类(员工类),里面包含了姓名,入职时间和工作等一些员工的基本属性和方法。现在可以构造一个Manager类(经理类)来继承Employee类。
class Manager extends Employee
这样,Manager类中就包含了Employee类中的基本方法和属性了。
这里利用之前日志中的一段代码来说明超类和子类加载的先后顺序
class StaticCode
{
private String name;
public StaticCode(String name){this.name=name;}
public StaticCode(){}
static
{
System.out.println("A");
}
public String getName()
{
return name;
}
}
class StaticCodeDemo
{
static
{
System.out.println("B");
StaticCode a = new StaticCode("Jake");
System.out.println(a.getName());
}
public static void main(String[] args)
{
extendsDemo e=new extendsDemo();
e.show();
e.show(e.x);
e.show(e.z);
e.print();
new StaticCode();
new StaticCode();
System.out.println("down");
}
static
{
System.out.println("b");
}
}
class extendsDemo extends fu
{
String x = super.name;
String name="子";
static{System.out.println("f");}
void show(){System.out.println(name);}
void show(String x){System.out.println(x);}
void show(int x){System.out.println(z);}
void print(){super.show();}
}
class fu
{
int z = 5;
String name="父";
static{System.out.println("ff");}
void show(){System.out.println(name);}
}
运行结果是:
B
A
Jake
b
ff
f
子
父
5
父
Down
由结果可知道,子类继承超类后,继承了父类中的属性和方法。在创建子类实例时,需要先加载超类。在子类中,如果子类重新给已经在超类中赋值的变量赋值,变量为子类新赋的值。超类中已经有的方法,但在子类中功能一致,但内容不同时,子类可以对这个方法进行覆盖。(注:子类覆盖超类方法,必须保证子类权限大等于超类权限,才可以覆盖,否则将编译失败。)
关键字super
代码中出现了新的关键字super,super用来调用超类中的数据。
super的用法于this用法很接近,但需要区分的是super是引用超类,而this是引用对象。
继承关系
Java不支持多继承。但是继承可以有多个层次,如一个animal类,可以被多个如哺乳动物,两栖动物等继承,而哺乳动物又可以被灵长类或猫科类继承。
多态
有一个用来判断是否应该设计为继承关系的简单规则,这就是“is-a”规则,它表明子类的每个对象也是超类的对象。例如,每只猫都是动物,因此,可以将猫设计为动物的子类,反之则不行,任意的动物可以是鱼、狗或者鸟,并不一定是猫。
“is-a”规则的另一种表述法是转换法则。它表明程序中出现超类对象的任何地方都可以用子类对象置换。例如,可以将一个子类的对象赋给超类变量。
Cat c = new Cat();
Animal[] a = new Animal[3];
a[0] = c;
这个例子中,变量a[0]与c引用的是同一个对象。但编译器将a[0]看成是Animal对象。
阻止继承:final类和方法
有的时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为final类。如果在定义类的时候使用了final修饰符就表明这个类是final类,不允许被继承。
final关键字:
在Java中,利用关键字final声明常量。如:final int NUM=3;关键字final表示这个变量只能被赋值一次。一但被赋值以后,就不能够更改了。习惯上,常量名使用大写。需要注意,类常量的定义们于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。且,若一个常量被声明为public,那么其他类的方法也可以使用这个常量。将方法和类声明为final主要鉴于它们会不会在子类中改变语义。