基本要点
1、在 Java 中使用 extends 表示继承。所有的继承都是公有继承。
2、在子类中可以通过 super 关键字调用超类(父类、基类)的成员函数或构造函数,格式分别是 super.menberFunction(...) 和 super(...)。
3、如果不希望某个类被继承,则应该标注为 final,同时类的成员方法也会被自动当作是 final(此时类不再支持动态绑定,可以被内联化);
如果不希望类里的某个方法被子类覆盖,则应该标注为 final;
4、与 C# 相同,Java 也不支持多继承。
5、上行转换时安全的,在 Java 里不需要强制类型转换,
下行转换常常是不安全的,如果是显示地将超类转换为子类,会抛出 java.lang.ClassCastException 异常。
Base[] b = new Base[10];
Derive[] d = (Derive[]) b;
如果是间接地用超类覆盖子类数组中的某一个,会抛出 java.lang.ArrayStoreException 异常。
Derive[] d = new Derive[10];
Base[] b = d;
b[0] = new Base();
6、子类方法覆盖基类方法时,子类方法的访问权限不得比基类方法的访问权限高。
7、obj instanceof Class 关键字可以用于判断 类对象 obj 是否是 类 Class 或其子类的实例。
如果不是,则返回 null。
8、使用 Abstract 声明一个类为抽象类。也可以声明某个方法为抽象方法(纯虚函数)。抽象类不能有实例。
9、如果超类的某个成员需要让子类访问,那么该成员可以声明为 protected。与其他语言有所差别的是,protected 成员对所有子类都可见。
Object 类的 clone 函数就是 protected 属性。
基本上所有使用到 protected 属性成员的类都是类层次关系不良设计的结果。
10、getClass() 方法可以获取存储类信息的 Class 变量,用于判断两个实例的类类型是否相同。
Class 是 Java 用于存储运行时类型(包括接口名)信息的类,最常用的成员方法时 getName,获得类型名称。
还可以使用 forName(String) 通过字符串获得对应的 Class 变量,其中 string 为对应类型的名称或含包路径的名称:
String className = "java.util.Data";
Class cl = Class.forName(className);
也可以使用 Type.Class 获取 类型 Type 的 Class 变量。
Class 中还提供了成员函数 newInstance 用于创建类实例。
事实上,这部分是反射里的内容,暂时不讲了。
11、接口:Java 里使用 implements 关键字来表示实现了某个接口,比如 Comparable、Cloneable等。
12、Java 里的模板不需要使用关键字,直接在 <> 里说明即可。
关于 Java 的内部类和反射以后再说。
本文深入探讨了Java中的继承机制,包括如何使用extends关键字实现继承,子类如何调用超类成员,以及final关键字的使用。文章还详细解释了Java不支持多继承的特点,上行与下行转换的安全性,以及抽象类与接口的应用。此外,文章阐述了如何通过getClass()方法获取类信息,并介绍了Java中类与接口之间的关系。

被折叠的 条评论
为什么被折叠?



