1、类的覆盖与访问(override 和 super 关键字)在类 A 继承类 B 的过程当中呢,有的时候还会遇到一种情况。就是 A 确实需要 B 的方法,但是呢它又不完全是,它需要对这个方法进行一定的修饰。比如,有一个类当中有一个方法叫 sayHi,是使用英语问好说 “hello”,当我们继承这个类的时候我还是想sayHi,但是呢我想使用法语来问好。就是说用同样的方法,但相应的内容却要发生变化。这个时候呢就要使用关键字 override,也就是覆盖。接下来我们看一下简单的例子,也就是刚才我们描述的。首先我们要定义一下类 A 和类 B。那么类 B 是原型的类,注意这里面其实是没有构造函数的,也就是
2、这个类在实例化的时候是不会执行构造函数里边的内容,因为它根本没有。同时呢,定义了一个 public 公共访问的函数叫 sayHi。我们可以试着来实例化 B,这个时候我们输出不会有任何的结果,因为它的构造函数是空的。我们也可以直接来运行一下 B 里面的公共函数 sayHi。大家可以看到在输出面板里面会输出“hello ”,这个就是我们实例化 B 后的一个结果。相应的我们还要去定义类 A, A 还是要去继承类 B。类 A 里面有要执行的代码,也就是 A 里面还是有 sayHi 这样一个函数方法,那么它里面的实际执行代码已经发生了变化。我们保存一下类 A。我们来生成一个 A 的实例,A 在执行 sa
3、yHi 的情况会怎样呢?大家注意,上面这个“hello”还是 b 实例去执行 sayHi 的结果,下面这个“Bonjour”本身也是sayHi 的一个执行结果。这就是 A 和 B 都执行同样的方法,输出结果却不一样。我们也可以看到在继承和覆盖当中求得了一定的平衡。需要注意的是,并不是所有的任何一项都可以被 override 来覆盖,有一项属性和方法是没办法覆盖掉的。第一是变量,变量是没办法被覆盖的,还有常量。另外就是我们前边所说的静态方法,还有就是没有被继承的方法。另外还有一些就是实时接口的方法,还有超类当中被标记为 final 的方法。实际上它还是有一定的限制。另外就是在子类继承父类的同时实际上也是可以访问父类的方法。比如说我们用 super关键字,super 呢实际上是去访问它的父类。我们来执行一下 super 当中的 sayHi。这样一来呢,实际上 A 会输出 2 个结果,第一呢是它自己定义的法语的 sayHi,第二呢它会输出父类的 sayHi 方法。这就是在覆盖当中我们仍然可以引用父类的一些方法。