7.JAVA-类继承、覆写、final关键字
1.JAVA继承-extends
在java中,要想实现继承则使用extends关键字.
一般子类被称为派生类,父类称为基类(super)
extends需要注意的地方:
- java不允许多重继承(一个类只能继承一个父类,不能继承多个父类)、
- 派生类会继承基类所有属性和方法,但不能直接访问基类的private私有属性
- 实例化派生类时,会先去调用父类的构造方法构造基类,再实例化自身的属性类对象,最后才是调用自身类构造方法.
- 在派生类中,有个隐藏的super,表示为基类,所以我们可以通过它指定如何构造基类
1.1 示例1-super使用
注意:super必须放在构造方法首行使用,如果用户不使用super,则编译器默认调用super()来初始化父类
代码如下:
class Parent
{
public Parent()
{
System.out.println("Parent()");
}
public Parent(String str)
{
System.out.println("Parent(String str):"+str);
}
}
class Derived extends Parent
{
public Derived()
{
super("123"); //调用Parent(String str)初始化父类
System.out.println("Derived()");
}
}
public class Test{
public static void main(String args[]){
Derived d = new Derived();
}
}
打印如下:
2.JAVA继承之方法覆写
当派生类覆写基类的方法时候,要遵守方法的权限,返回值以及参数都一致.
如果派生类覆写的基类方法是private的,则不能实现覆写功能,因为基类的private方法是不可见的(参考2.2示例)
派生类覆写方法,一般用于基类的方法不满足当前派生类功能实现时,才会去覆写.
2.1 示例1-覆写
代码如下:
class Parent
{
public void func(int i)
{
System.out.println("Parent::func()");
}
}
class Derived extends Parent
{
public void func(int i) //覆写父类的func方法
{
System.out.println("Derived::func()");
}
}
public class Test{
public static void main(String args[]){
Derived d = new Derived();
d.func(1);
}
}
2.2示例2-派生类private无法实现覆写
先来个正常覆写的代码:
class Parent
{
public void func()
{
System.out.println("Parent::func()");
}
public void print()
{
func();
}
}
class Derived extends Parent
{
public void func() //覆写父类的func方法
{
System.out.println("Derived::func()");
}
}
public class Test{
public static void main(String args[]){
Derived d = new Derived();
d.print();
}
}
如下图所示,打印派生类的func():
然后将Parent的func()改为private:
private void func()
{
System.out.println("Parent::func()");
}
如下图所示,则打印基类的func():
2.3JAVA继承之如何通过派生类调用基类被覆盖的方法
在上面第1节,我们讲过派生类中有个隐藏的super,表示为基类.所以当基类被覆写的方法时,我们可以通过super来调用基类的方法.
示例-super调用基类方法
class Parent
{
public void func()
{
System.out.println("Parent::func()");
}
}
class Derived extends Parent
{
public void func() //覆写父类的func方法
{
super.func(); //调用父类的func,如果不加super,则会出现一直递归
System.out.println("Derived::func()");
}
}
public class Test{
public static void main(String args[]){
Derived d = new Derived();
d.func();
}
}
打印如下:
3.final关键字
在java中,final被称为终结器, final可以修饰变量,方法和类.
3.1 final修饰类
当final修饰类时,则表示该类为最终的,也就是说该类不能再有子类了,示例如下:
final class A { // 修饰该类不能有子类
}
class B extends A { // 错误的继承
}
3.2 final修饰方法
当在某个类的方法前面定义final时,则表示该方法不允许在子类里进行方法覆写(可以实现方法重载)
示例如下:
class A {
public final void fun() {} //此方法不允许子类覆写
public void fun(int i) {} //可以实现方法重载
}
class B extends A {
public void fun() {} // 错误:此处不允许覆写
}
3.3 final修饰变量
当final修饰变量时,则表示该变量为常量(类似C++中const).示例如下:
public static final String LICENSE = "GPL"; //修饰全局常量,定义常量时,名称需大写
下章学习: 8.JAVA-向上转型、向下转型
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- 手把手教你 MongoDB 的安装与详细使用(二)
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
- Android调用手机中的应用市场,去评分的功能实现
- ANR 原理与实战技巧
- Android将应用程序的崩溃信息如何保存到本地文件,并上传至服务器
- android native内存检测方案(二)
- 测试数据集与验证数据集之间有什么区别呢?
- 深度学习的未来
- SDL系列讲解(二) 环境搭建
- SDL系列讲解(四) demo讲解
- 具有张量流的混合密度网络
- SDL系列讲解(七) SDL_image教程
- SDL系列讲解(八) SDL_ttf教程
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 个人总结的部分数据验证规则
- 一句话实现php日期转中文汉字
- .Net Core微服务入门全纪录(八)——Docker Compose与容器网络
- PHP中少用但是很好用的方法
- 使用一维数据构造简单卷积神经网络
- .Net Core微服务入门全纪录(完结)——Ocelot与Swagger
- PHP使用GD库生成文件
- 反向传播算法从原理到实现
- 基于EntityFramework 6 Code First实现多租户的一种思路
- PHP使用GD库生成柱状图
- PHP生成Mysql数据字典
- .Net Core in Docker极简入门(上篇)
- PHP一个比较完善的树形结构代码
- .Net Core in Docker极简入门(下篇)
- snoopy(强大的PHP采集类) 详细介绍