Java继承与隐藏机制详解
立即解锁
发布时间: 2025-08-18 02:21:29 阅读量: 2 订阅数: 12 

### Java继承与隐藏机制详解
#### 1. 基础概念
在Java编程中,一些概念虽然在官方规范里未被明确提及,但在实际开发和技术交流中却十分常用。
- **基类(Baseclass)**:在单继承的面向对象编程语言(如Java)中,基类被定义为`Object`类的直接子类。类层次结构通常以基类来命名,例如某个类层次结构可能被称为“Computer类层次结构”。在一些设计模式(如策略设计模式)中,基类往往是抽象的。不过要注意,有些程序员会把基类和超类(superclass)混为一谈,但实际上它们是不同的概念。
- **相关类(Related Classes)**:如果一个类是另一个类的扩展,那么这两个类就是相关的。不同类层次结构中的类显然不相关,而且同一类层次结构中的类也可能不相关。这个概念在讨论类型转换时非常重要,因为只有相关类之间才能进行类型转换。
|标准术语|替代术语|
| ---- | ---- |
|超类(superclass)|父类(parent)、祖先类(ancestor)、基类(base class)|
|子类(subclass)|子类(child)、后代类(descendant)、派生类(derived class)|
|超接口(superinterface)| - |
|子接口(subinterface)| - |
|超类型(supertype)| - |
|子类型(subtype)| - |
#### 2. 继承层次中的泛化
类层次结构和接口层次结构都意味着继承层次,继承层次用于表示超类型和子类型之间的关系。虽然Java语言规范(JLS)中使用“超类”“超接口”“子类”“子接口”等术语,但在很多面向对象编程的书籍中,“超类型”和“子类型”更为常用。
当从整体上考虑类型层次时,类层次结构顶部的类型更为通用。UML将泛化定义为更通用元素和更具体元素之间的分类关系,更具体的元素与更通用的元素完全一致,并包含额外信息。除了“更通用”和“更具体”,泛化还有一些替代术语,如抽象(abstraction)、派生(derivation)、特化(specialization)和限制(restriction)。
```mermaid
graph LR
A[超类型] --> B[子类型1]
A --> C[子类型2]
B --> D[子子类型1]
C --> E[子子类型2]
```
#### 3. 继承机制
Java中的继承分为接口继承和实现继承。
- **接口继承**:类声明中的`implements`子句列出了直接超接口。由于接口层次结构中存在多继承,以及类可以实现任意数量的接口,确定一个类实现了哪些超接口可能会比较复杂。不过,子类会继承超类类型(包括`Object`类型)中公共方法隐式定义的接口。例如:
```java
class Test {
public static void main(String[] args){
Subclass sub = new Subclass();
if (sub instanceof Object &&
sub instanceof Superclass &&
sub instanceof Subclass &&
sub instanceof Multiple &&
sub instanceof Inheritiance &&
sub instanceof Superinterface &&
sub instanceof Subinterface)
System.out.println("this is an example of " +
"interface inheritiance");
}
}
interface Multiple {}
interface Inheritiance {}
interface Superinterface extends Multiple, Inheritiance {}
interface Subinterface extends Superinterface {}
class Superclass implements Subinterface {}
class Subclass extends Superclass {}
```
在这个例子中,`Subclass`类没有`implements`子句,但由于接口继承,它实现了至少七种不同的超类型。需要注意的是,类不能实现同一类主体中声明的嵌套接口,否则会导致编译错误。
- **实现继承**:子类会继承超类和超接口的成员,但以下成员除外:
- 不可访问的成员;
- 隐藏的字段(或接口常量)、类方法和嵌套类型;
- 被重写的实例方法。
如果成员既没有被隐藏也没有被重写,那么成员的继承规则如下:
- 声明为`private`的成员永远不会被继承;
- 声明为`public`或`protected`的成员总是会被继承;
- 默认访问权限的成员只有在子类属于同一包时才会被继承。
下面是一个实现继承的示例:
```java
class Test {
public static void main(String[] args) {
Subclass sub = new Subclass();
Subclass.Top top = new Subclass.Top();
Subclass.Inner inner = sub.new Inner();
System.out.println(sub.a);
System.out.println(sub.b);
System.out.println(sub.c());
System.out.println(sub.d());
System.out.println(sub.e);
System.out.println(top.getS());
System.out.println(inner.getS());
}
}
class Superclass {
static String a = "Subclasses inherit class variables";
String b = "Subclasses inherit instance variables";
static String c() {
return "Subclasses inherit class methods";
}
String d() {
return "Subclasses inherit instance methods";
}
class Inner {
private String s = "Subclasses inherit inner member classes";
public String getS() {
return s;
}
}
static class Top {
private String s = "Subclasses inherit nested top-level" +
" classes";
public String getS() {
return s;
}
}
}
interface Interface {
String e = "Subclasses inherit interface constants";
}
class Subclass extends Superclass implements Interface { }
```
这个示例表明,即使`Subclass`类的定义为空,它也有七个成员。
#### 4. 方法调
0
0
复制全文
相关推荐










