本人瞬间记忆综合症实在过于严重,经常头一天看懂记住的东西第二天就忘记,忘记后又重复头一天的学习过程,着实浪费时间。比如Java子类父类这种简单的东西,我已经记住、忘记、记住、忘记的循环了不知几个轮回了,为了节省时间,我觉得还是总结一下,加以记录比较好,去掉那些混淆我记忆的汤汤水水,只留干货。
继承的概念就不啰嗦了,直接说应用。
1、如果父类拥有自定义constructor,但并没有定义不带参constructor,那么子类也一定要自定义constructor,否则子类会报 Implicit super constructor SuperClass() is undefined for default constructor. Must define an explicit constructor(因为子类会自动调用父类的无参构造函数,但此函数又不存在,所以报错)。自定义构造函数的参数可与父类不同。
2、子类自定义构造函数的首行要显式的调用父类的某一构造函数进行初始化,如果不显式的调用,那么子类构造函数就会调用父类默认构造函数(即无参构造函数),此时如果父类没有无参构造函数,那么就会报 Implicit super constructor SuperClass() is undefined. Must explicitly invoke another constructor。
3、子类不能直接使用和读取父类的private数据,要通过父类提供的public access方法,即getter和setter。
4、如果子类重写了父类的某个method,那么此时子类要调用父类的方法就需要用super.someMethod()的形式调用,否则系统会报运行时错误 java.lang.StackOverflowError(因为系统反复调用的都是子类的重写方法,造成死循环)。
5、重写的意思是:返回值类型,方法名,参数类型和个数都要相同(返回值类型在SE5.0时也可以不同)。
6、子类重写父类的方法,子类方法不可降低父类方法的作用域,如:父类某方法的作用域是protected,那复写方法不可以是friendly和private,只能是protected或public。
7、可以将子类对象赋给父类型变量,即 SuperClass e = new SubClass(), 反之不可; 但编译器仍只认为e属于SuperClass类型,因此不能调用SubClass的特有成员和方法(即新增的方法,而不是重写的方法),但可以调用被重写了的方法,并且由于动态绑定,e所调用的方法将按照子类中的方法逻辑执行。
8、子类无法覆写父类的private方法,虽然编译可通过,但实际上覆写并未成功,而只是产生了一个新方法而已。见下面的代码:
class BaseClass {
private void g() {
System.out.println("BaseClass.g()");
}
}
class DeriveClass extends BaseClass {
public void g() {
System.out.println("DeriveClass.g()");
}
}
public class Test {
public static void main(String[] args) {
BaseClass p = new DeriveClass();
//p.g(); you can't call the method, because g() is not overriden but new added method.
}
}
9、如果想禁止某类被继承,那么可以将此类定义为final class,此时类中所有的方法都被自动置为final型;如果仅要禁止某方法被重写,可以只将方法定义为final。我们平时用到烂的String类就是final型的,所以为我们无法继承该类。
10、Java编程中,某类型的对象可以转化为另一种类型,这个转化过程叫转型(Casting)。这种转型可以发生在primitive型数据中,也可发生在对象中,当发生在对象上时就有一定的要求了:首先,互相转型的对象应该要有继承关系。因此像如下这种转型在编译时就是错误的:
Employee e = new Employee(); // Employee与Date没有任何关系
Date c = (Date) e;
转型有两种:向上转型和向下转型。
向上转型(Upcasting):先看下面的代码
class Instrument {
public void play() {}
public static void tune(Instrument i) {
i.play();
}
}
class Wind extends Instrument {
public static void main(String[] args) {
Wind flute = new Wind();
Instrument.tune(flute); //upcasting
}
}
这段代码中,Instrument类中的tune方法本来接受一个Instrument类型的引用,但是Wind.main()函数调用tune时,传入的却是Wind类型引用,编译器依旧可以接受,这中间显然发生了一种转换,即“将子类引用转换为父类引用”的转换,这种转换就叫“向上转型”。因为当我们在做向上转型时,是将一种特殊型别转换为通用型别,对class接口产生的唯一效应是“减少”而不是“新增”方法,因此我们认为“向上转型”是安全的,无需特殊声明就可进行。举个例子,一个富豪想自愿变成一个普通人显然“安全”,但反之,一个普通人想一下子拥有富豪的特权,那没那么容易,要经过资格审核了……。
上面那个需要审核的就是“向下转型”(downcasting),即父类到子类的转换。还是先看代码:
Instrument gitar = new Instrument();
Instrument flute = new Wind();
Instrument i = flute; // compiling error, Type mismatch: cannot convert from SuperClass to SubClass
Instrument i = (Wind)flute; // pass
Instrument i = (Wind)gitar ; // runtime error, ClassCastException
由上面这个例子,我们可以看出,Java编译器和虚拟机对于“向下转型”的审核还是很严格的,不光要增加"(SubClassName)"的标记,还要保证被转型的父类引用确实“有资格”转型。也就是说只有被指定指向了子类的父类引用才可以被转型成子类,像上例中的flute引用,而gitar引用显然不符合。也可以用"instanceof"来判断一个对象引用是否克被转型成目标类型。
我们在实际项目应用中,“向上转型”和“向下转型”应用都很广泛,以Collection到List的转型居多。
11、抽象类不能实例化,但可以用来定义一个变量,但是变量要指向继承它的一个非抽象子类实例。
分享到:
相关推荐
通过以上对Java中继承特性的详细解析,我们可以看出,继承不仅是Java语言的一个重要特性,也是构建复杂应用程序的基础。正确理解和应用继承,能够帮助我们设计出更加灵活、可扩展和易于维护的软件系统。
这篇小结将深入探讨这两个关键概念,以及它们在实际编程中的应用。 首先,类是Java中的蓝图,它定义了一组特性和行为,这些特性和行为共同构成一个特定实体。类可以包含字段(或称为属性),它们代表对象的状态,...
### Java个人学习小结 #### Java发展史及重要里程碑 - **起源与发展**: Java 的起源可以追溯到 1992 年,当时的 Sun Microsystems 公司开发了一种名为 Oak 的编程语言,最初是为了家用电器的智能化而设计的。然而...
通过阅读“JAVA程序:接口小结”文档,你将能深入理解以上知识点,并通过提供的代码示例加深对接口实际应用的理解。实践是检验真理的唯一标准,尝试编写实现接口的类并运行,将会使你的学习更上一层楼。
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
在Java RMI应用开发中,有几个关键点需要注意: 1. **远程服务接口定义**: - 接口是RMI的核心,它定义了可供远程调用的方法。这些接口需要继承`java.rmi.Remote`接口,并声明可能抛出`RemoteException`的异常。...
### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...
《Java基础小结》 Java,作为一种广泛应用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。这篇博文和随附的PDF笔记旨在总结Java的基础知识,帮助初学者巩固理解,同时也为有经验的开发者提供回顾参考。 1...
这个“java课程小结.rar_北京理工大学JAVA课程”压缩包中包含的“课程小结”文件,很可能是教授精心编写的教学精华,旨在帮助学生巩固所学知识并为后续学习打下坚实基础。 在Java课程中,有几个核心概念和技术是必...
另外,Java还可以被用来编写容量很小的应用程序模块或者applet,做为网页的一部分使用。applet可使网页使用者和网页之间进行交互式操作。 Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了全面理解Java基础知识,本小结将按照给定的文件名,逐一解析关键知识点。 1. **Java基础知识** 这一部分通常包括Java语言的基础...
Java中的多态特性是面向对象编程的强大工具之一,它允许我们在编写代码时,不必关注具体的实现细节,而专注于更高层次的逻辑处理。通过理解多态的工作原理,我们可以更灵活地设计和实现复杂系统,提高代码的复用性和...
在IT领域,Java和C#是两种非常重要的编程语言,广泛应用于软件开发、Web应用程序以及移动应用开发。本文将深入探讨这两个语言的核心概念,以及它们在实际开发中的应用,同时也会涉及Spring框架,一个在Java生态系统...
Java面向对象编程是Java语言的核心特性,它基于三个主要原则:封装、继承和多态。在Java中,面向对象的设计允许我们模拟现实世界中的对象和...通过合理的类设计、继承和多态的应用,可以构建出灵活、可扩展的软件系统。
面向对象编程是Java语言的核心特性之一,而继承作为面向对象的三大特性(封装、继承、多态)之一,是实现代码复用和扩展性的重要手段。在本章中,我们将深入探讨Java中的继承概念,以及它如何帮助我们构建更加灵活...
#### 小结 - **继承与多态是Java面向对象编程的核心概念**。正确理解并运用这些概念可以帮助开发者写出更高质量、更易于维护的代码。 - **注意**:虽然继承和多态非常有用,但在实际项目中应当适度使用,过度依赖...
本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1. Java GUI基础 Java提供了丰富的类库用于创建GUI,主要在java.awt和javax.swing包下。在这个项目中,我们可能会使用`JFrame`作为主...