Java 继承初探
Java继承的基础
Java中,被继承的类叫做超类,继承超类的类叫子类。(一个子类亦可以是另一个类的超类)
继承一个类,只需要用关键字 extends 把一个类的定义合并到另一个类中就可以了。
例子中创建了一个超类A和一个名为B的子类。
class A { int i,j ; void showij() { System.out.println( "i and j : " + i + " " + j ) ; } }
class B extends A { // B类继承了A类 由此B类可以直接使用A类的所有内容
int k ;
void showk() { System.out.println("K: " + k ) ; } void sum() { // 因为B继承了A所以可以获得A类中的变量i,j System.out.println("i+j+k: " + (i+j+k)) ; } }
public class SimpleInheritance { public static void main(String args[]) { A superOb = new A() ; B subOb = new B() ;
superOb.i = 10 ; superOb.j = 20 ; System.out.println("Contents of superOb: ") ; superOb.showij() ; System.out.println() ;
subOb.i = 7 ; subOb.j = 8 ; subOb.k = 9 ; System.out.println("Contents of subOb: ") ; subOb.showij() ; // 因为继承A类,所以B类的实例对象可以调用A类的方法
subOb.showk() ; System.out.println() ;
System.out.println("Sum of i,j and k in subOb: ") ; subOb.sum() ;
} } |
虽然子类包括超类的所有成员,但是子类不能访问超类中被声明为private的成员。
class Box { double width ; double height ; double depth ;
Box(Box ob) { width = ob.width ; height = ob.height ; depth = ob.depth ; }
Box() { width = -1 ; height = -1 ; depth = -1 ; }
Box(double len) { width = height = depth = len ; }
double volume() { return width * height * depth ; } }
class BoxWeight extends Box { // BoxWeight 继承了Box的所有特征(功能) // 在继承Box类后,子类BoxWeight也可以在不改变Box类的情况下独立完成成员的添加
double weight ; //为自己添加了一个变量成员
BoxWeight (double w , double h , double d , double m ) { width = w ; height = h ; depth = d ; weight = m ; } }
public class DemoBoxWeight { public static void main(String args[]) { BoxWeight mybox1 = new BoxWeight(10,20,15,34.3) ; BoxWeight mybox2 = new BoxWeight(2,3,4,0.076) ; double vol ;
vol = mybox1.volume() ;
System.out.println("Volume of mybox1 is " + vol) ; System.out.println("Weight of mybox1 is " + mybox1.weight) ; System.out.println() ;
vol = mybox2.volume() ; System.out.println("Volume of mybox2 is " + vol) ; System.out.println("Weight of mybox2 is " + mybox2.weight) ; System.out.println(); } } |
超类的一个引用变量可以被任何从该超类派生的子类的引用赋值。
理解是引用变量的类型,而不是引用对象的类型;决定了什么成员可以被访问。
也就是说,当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分。这就是下例中为什么plainbox不能范文weight的原因,甚至是他引用了一个BoxWeight对象也不行。
因为超类不知道子类增加的属性(反之则知道)。
下例中,Box的引用访问weight域是不可能的,因为Box类没有定义。
class RefDemo { public static void main(String args[]) { // weightbox 是 BoxWeight对象的一个引用, BoxWeight weightbox = new BoxWeight(3,5,7,8.37) ; // plainbox是Box对象的一个引用, Box plainbox = new Box() ; double vol ;
vol = weightbox.volume() ; System.out.println("Volume of weightbox is " + vol ) ; System.out.println("Weight of weightbox is " + weightbox.weight) ; System.out.println() ;
plainbox = weightbox ; // weightbox的对象引用给plainbox赋值*
vol = plainbox.volume() ; System.out.println("Volume of plainbox is " + vol) ; //System.out.println("Weight of plainbox is " + plainbox.weight) ; // 不可以访问 weight,因为在超类中没有赋予Box.plainbox访问的权利 } } |