4.8 类的继承

继承是一种由已有的类创建新类的机制。
  • 子类、父类(超类)。 
  • Java不支持多重继承(子类只能有一个父类) 

1.子类 

使用关键字 extends来声明一个类的子类:
class 子类名 extends 父类名
{  …
}
如果一个类的声明中没有使用extends关键字,这个类被 默认为是Object的直接子类,Object是java.lang包中的类。

2 .子类的继承性 

    1)子类和父类在同一包中的继承性 
    继承父类中 不是private的成员变量作为自己的成员变量,和 不是private的方法为自己的方法, 继承的成员变量或方法的访问权限不变
   
    2)子类和父类不在同一包中的继承性 
    继承父类中 public和protected的成员变量作为自己的成员变量,和 public和protected的方法为自己的方法,继承的成员变量或方法的 访问权限不变
    父类和子类 不在同一个包里,子类 不能继承父类的友好变量和友好方法

    3)protected的进一步说明 
    例:A是B的子类,C是B的子类,D是C的子类,那么B、C、D都继承了A的protected成员变量和方法。
    a)如果D类在 D本身中创建了一个对象,那么该对象总是可以通过“.”运算符访问继承的或自己定义的protected变量和protected方法。 
    b)但是,如果在另外一个类中,比如Other类, 用D类创建了一个对象object,该对象通过“.”运算符访问protected变量和protected方法的权限如下: 
        i)子类D中亲自声明的protected成员变量和方法(即不是从别的类继承来的),对象object访问这些非继承的protected成员变量和方法时,只要Other类和D类在同一个包中就可以了。 
        ii)如果子类D的对象的protected成员变量和方法 是从父类继承来的,那么要 一直追溯到protected成员变量和方法的“祖先”类,即A类如果Other类和A类在同一个包中,object对象能访问继承的protected成员变量和方法。 (即 需要申明该变量和方法的类与子类在同一包中 。)   

3.成员变量的隐藏和方法的重写 

只要子类中定义的成员变量和父类中的成员变量 同名时, 子类就隐藏了继承的成员变量。 
子类通过方法重写来隐藏继承的方法。(方法重写指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型,与从父类继承的方法完全相同)。 如果子类想使用被隐藏的方法,必须使用关键字super。 
例:
class Chengji {        
    float f(float x,float y) {
        return x*y; 
    } 
} 
class Xiangjia extends Chengji {
    float f(float x,float y) {        
        return x+y; 
    } 
} 
public class ExtendsExample {        
    public static void main(String args[]) {        
        Xiangjia sum = new Xiangjia(); 
        float c = sum.f(4,6); 
        System.out.println(c); 
    } 
} 
在重写父类方法时, 不可以降低访问权限。例: 
class Chengji {        
    protected float f(float x,float y) {        
        return x*y; 
    } 
} 
class Xiangjia extends Chengji {        
    float f(float x,float y){  //非法,因为降低了访问级别         
        return x+y; 
    } 
} 
class Xiangjie extends Chengji {        
    public float f(float x,float y){  //合法,没有降低了访问级别 
        return x+y; 
    } 
}

4.final关键字 

final关键字可以修饰 类、成员变量和方法中的参数。 
final类不能被继承。 
例:
final class A 
{  … 
} 

如果一个方法被修饰为final方法,则这个 方法不能被重写
如果一个成员变量被修饰为final的,就是常量 ,必须赋给初值,而且不能变
如果方法的参数被修饰为final,该参数的 值不能被改变
class A {        
    //final double PI;  //非法,因为没有赋给初值 
    final double PI=3.1415926; 
    public double getArea(final double r) {           
        //r=89;   //非法,因为r的值不允许再改变 
        return PI*r*r; 
    } 
} 

你可能感兴趣的:(java,继承)