JLS- 继承
时间:2005-12-27 来源:blueday
学习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