Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2248106
  • 博文数量: 292
  • 博客积分: 10016
  • 博客等级: 中将
  • 技术积分: 3381
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-06 11:26
文章分类

全部博文(292)

文章存档

2011年(1)

2010年(4)

2009年(3)

2008年(6)

2007年(47)

2006年(63)

2005年(168)

分类: LINUX

2005-12-27 15:16:16

[JLS- 继承]

    学习OOP时,一般从概念级、语法级和机制级三方面研读。在继承问题上,三者并不很协调,这里按照JLS3e的观点归纳Java在继承上的语法。


1.类的成员与继承

    JLS中定义了什么是类的成员,这是一个前提,子类仅仅继承父类/父接口的成员。

  • 类体中可以声明类的成员,即内部类型方法。[8.1.6]
  • 类体中还可以包含实例初始化块[instance initializers]、静态初始化块[static initializers]和构造器声明。它们不是类的成员,因此谈不上继承问题。 并通过例子说明构造器不被继承。
  • 类的成员包括继承于直接父类/父接口的成员和类体中声明的成员。这是递归的。
  • [Class Members有时指static member]

2、访问修饰符对继承的影响   

    类的成员中,以访问权限来限定:

  • private成员不被继承,and
  • 包外声明的子类只继承父类的protected or public成员。

    8.2.1 Examples of Inheritance介绍了几个例程解释Default和其他修饰符对继承的影响。这种限定在语法级上非常容易接受。所谓继承即虽然没有,但相当于子类中那些代码。
    static和实例成员,这里没有差别。

    子类与父类/父接口出现的各种同名问题,对继承造成影响,这是非常精细的地方。

3、域的隐藏hidden域不被继承 [8.3.3.1/8.3.3.2]

    父类F中的[静态或实例]域x将被子类的同名域x隐藏[Hiding],不论两个x的数据类型如何和静态与否。父类的同名域不被继承。在子类体中使用简单名时,相当于this.x 。这种隐藏不会造成父类域访问上的困难,静态域使用F.x或super.x访问,实例域通过super.x访问。[BTW:局部变量可以shadows域]

    在子类体外,被隐藏的父类域仍然可以访问。

class AAAA{
    public static void main(String[] args){
        Q qq = new Q();
        qq.log();
        System.out.println(qq.x); //
        System.out.println(P.x);
        System.out.println(Q.y);// 或qq.y
        System.out.println(((P)qq).y);//
    }
}
class Q extends P{
    /*static*/ double x = 2.222;
    static double y = 3.333;
    void log() {
        System.out.println(x + " " + super.x);
        System.out.println(y + " " + super.y);
    }
}
class P{
    static int x = 2;//int
    String y = "hi";
}

4、关于方法的一些要点

  • 方法修饰符有public protected private abstract static final synchronized native strictfp,其中abstract方法不能是:private, static, final, native, strictfp, or synchronized.
    另外,native 与 strictfp互斥
  • 方法签名[The signature of a method]由方法名、方法形参的数目和类型[顺序没有提]组成。
  • abstract method :可以用抽象方法override父类的抽象方法和普通方法;不可调用抽象方法;
  • static Methods Vs instance method [this and super]
  • final Methods :不能overriding or hiding it。private方法和final类中所有方法都是implicitly final[反之不然]。
  • native Methods:由C, C++, FORTRAN, or assembly language编写的platform-dependent code。和abstract一样必须以分号表示方法体,而不是{}。
  • void方法的return[if any]不得有表达式;有返回类型的方法的return[if any]必须有表达式[在使用throw时,可能没有return语句]。

5、

    子类继承直接父类/接口的所有accessible、non-private方法,排除overridden和 hidden方法

  • Instance Methods可以被子类的实例方法改写
  • Class Methods 可以被子类的静态方法隐藏

6、死亡钻石 参考here

7、Member Type 参考here

阅读(1396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~