分类: LINUX
2005-12-27 15:16:16
学习OOP时,一般从概念级、语法级和机制级三方面研读。在继承问题上,三者并不很协调,这里按照JLS3e的观点归纳Java在继承上的语法。
1.类的成员与继承
JLS中定义了什么是类的成员,这是一个前提,子类仅仅继承父类/父接口的成员。
2、访问修饰符对继承的影响
类的成员中,以访问权限来限定:
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、关于方法的一些要点
this
and super
] 5、
子类继承直接父类/接口的所有accessible、non-private方法,排除overridden和 hidden方法。
6、死亡钻石 参考here
7、Member Type 参考here