文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>JLS- 继承

JLS- 继承

时间:2005-12-27  来源:blueday

[JLS- 继承]

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

1.类的成员与继承

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

  • 类体中可以声明类的成员,即域、内部类型、方法。[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、Inheritance, Overriding, and Hiding

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

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

6、死亡钻石 参考here

7、Member Type 参考here

相关阅读 更多 +
排行榜 更多 +
马里奥赛车世界游戏手机版下载

马里奥赛车世界游戏手机版下载

赛车竞速 下载
无畏契约皮肤开箱器手游下载

无畏契约皮肤开箱器手游下载

休闲益智 下载
旭日之城官方正版下载

旭日之城官方正版下载

策略塔防 下载