提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Java:子类与继承(1)
一、子类与父类
1.继承的基本格式
在类的声明中通常使用关键字extends来定义一个类的子类
格式如下:
class 子类名 extends 父类名{
...
}
例如:
class Student extends People{
...
}
把Student类定义成People的子类,People类是Student类的父类(超类)。
2.类的树形结构
如果C是B的子类,B又是A的子类,习惯上称C是A的子孙类。Java的类按继承关系形成树形结构(将类看作树上的结点),在这个树形结构中,根结点是Obgect 类(Object 是java.lang 包中的类),即 Object是所有类的祖先类。任何类都是 Object 类的子孙类,每个类(除了 Object类)有且仅有一个父类,一个类可以有多个或零个子类。如果一个类(除了Object类)的声明中没有使用 extends 关键字,这个类被系统默认为 Object的子类,即类声明“class A”与“class A extends Object”是等同的。
二、子类的继承性
子类的继承性与父类中的访问权限修饰符有关
访问权限修饰符
修饰符 | 访问权限 |
---|---|
public / 公共的 | 整个项目下 |
private / 私有的 | 仅当前类中 |
protected / 受保护的 | 同包以及子类中 |
缺省不写 / 友好的 | 同包下 |
根据访问权限修饰符的不同,子类的继承性可分为两种情形:
1.子类与父类在同一包中的继承性
子类继承了父类中所有非private的成员作为自己的成员
class A {
int x;
private int y;
}
class B extends A {
void f() {
x = 10;
y = 10;//非法,子类没有继承 y
}
}
在这段程序中 y = 10;会报错,即友好变量x被子类所继承,而私有变量y没有被继承。
2.子类与父类在不同一包中的继承性
子类只会继承父类中的protected和public访问权限的成员变量作为子类的成员变量,而private和友好访问权限的成员变量则不会被子类继承。
三、子类与对象
当创建子类的对象时,不仅子类中声明的成员变量被分配了内存空间,而且父类的成员变量也都分配了内存空间,其中父类中的private成员变量也分配了内存空间,却不会作为子类对象的变量。同样,若子类和父类不在同一包中,子类不继承父类的友好成员变量。
为了利用这些内存空间,子类对象可以调用继承的方法,操作没有继承的成员变量
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;
height = h;
}
public int getHeight() {
return height;
}
}
public class test {
public static void main(String[] args) {
ChinaPeople zhangsan = new ChinaPeople();
System.out.print("子类对象未继承的averHeight的值是:"+zhangsan.getAverHeight());
zhangsan.setHeight(188);
System.out.print("子类对象的实列变量height的值是:"+zhangsan.getHeight());
}
}
注: 子类继承的方法只能操作子类继承的成员变量或未继承的成员变量,不可能操作子类新声明的变量。
四、方法重写
1.重写的语法规则
如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法。方法重写是指,子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型(所谓子类型是指,如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。
2.重写的目的
子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。
class A{
int x;
void f(){
x=100;
}
}
class B extends A{
int y;
void f(){
x=100;
y=100;//重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法
}
}