1、子类与父类(超类):
注意:JAVA不支持多重继承,即子类只能有一个父类。人们习惯地称子类与父类的关系是“is-a”关系。
(1)子类:
通过使用关键字extends来定义一个类的子类,举例:
class 子类名 extends 父类名{
......
}
(2)类的树形结构:
如果C是B的子类,B是A的子类,习惯上称C是A的子孙类。JAVA的类按照继承关系形成树形结构(将类看做树上的结点),在这个树形结构中,根结点是Object类(Object是java.lang包中的类),即Object是所有类的祖先类。任何类都是Object类的子孙类,每个类(除了Object类)有且仅有一个父类,一个类可以有多个或零个子类。如果一个类(除了Object类)的声明没有使用extends关键字,这个类被系统默认为是Object的子类,即类声明“class A”与“class A extends Object”是等同的。
2、子类的继承性:
类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明、定义的,另一部分是从它的父类继承的。所谓的子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作,也就是说,一个子类继承的成员应当是这个类的完全意义的成员;所谓子类继承父类的方法作为子类中的一个方法,就像它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。
(1)子类和父类在同一包中的继承性:
如果子类和父类在同一包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限不变。
(2)子类和父类不在同一包中的继承性:
当子类和父类不在同一包中时,父类中的private和友好访问权限的成员变量不会被给予子类继承,也就是说子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。
3、子类与对象:
举例:子类ChinaPeople的对象调用继承的方法操作未被子类继承缺分配了内存空间的变量。
package 子类与继承;
class People{
private int averHeight=166;
public int getAverHeight() {
return averHeight;
}
}
class ChinaPeople extends People{
int height;
public void setHeight(int h) {
//height=h+averHeight;非法,子类中没有继承averHeight
height=h;
}
public int getHeight() {
return height;
}
}
public class E5_2 {
public static void main(String[] args) {
ChinaPeople zhangsan=new ChinaPeople();
System.out.println("子类对象未继承的overageHeight的值是:"+zhangsan.getAverHeight());
zhangsan.setHeight(178);
System.out.println("子类对象的实例变量height的值是:"+zhangsan.getHeight());
}
}
(2)关于instanceof运算符:
instanceof是JAVA独有的双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时,instanceof运算的结果是true,否则是false;
4、成员变量的隐藏:
在编写子类时,我们任然可以声明成员变量,一种特殊的情况就是,所声明的成员变量的名字和从父类继承来的成员变量的名字相同(声明的类型可以不同),在这种情况下,子类就会隐藏所继承的成员变量。
(1)子类隐藏继承的成员变量的特点如下:
子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
子类对象任然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。
举例:
package 成员变量的隐藏;
public class Googs {
public double weight;
public void oldSetWeight(double w) {
weight=w;
System.out.println("double型的weight="+weight);
}
public double oldGetPrice() {
double price=weight*10;
return price;
}
}
package 成员变量的隐藏;
public class CheapGoods extends Googs{
public int weight;
public void newSetWeight(int w) {
weight=w;
System.out.println("int型的weight="+weight);
}
public double newGetPrice() {
double price=weight*100;
return price;
}
}
package 成员变量的隐藏;
public class E5_3 {
public static void main(String[] args) {
CheapGoods cheapgoods=new CheapGoods();
//cheapgoods.weight=198.98;是非法的,因为子类对象的weight变量已经是int型
cheapgoods.newSetWeight(198);
System.out.println("对象cheapGoods的weight的值是:"+cheapgoods.weight);
System.out.println("cheapGoods用子类新增的优惠方法计算价格:"+cheapgoods.newGetPrice());
cheapgoods.oldSetWeight(198.987);//子类对象调用继承的方法操作隐藏的double型变量weight
System.out.println("cheapGoods使用继承的方法计算价格:"+cheapgoods.oldGetPrice());
}
}
注意:子类继承的方法只能操作子类继承和隐藏的成员变量。子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量(需要使用super关键字操作子类隐藏的成员变量)