J2SE学习笔记1.7继承

本文深入探讨了Java中继承的概念、基本实现以及限制,通过示例代码解释了如何使用继承来扩展类的功能并实例化子类对象的过程。重点强调了单继承局限、显式与隐式继承的区别以及构造方法调用的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java特性概念(继承)

     接下来,我来讲一下其中第二个特性:继承。

一、继承问题的引出

继承性是面向对象的第二大主要特征。 
下面首先编写两个程序:Person类、Student类。

以上两个程序通过代码的比较可以清楚的发现:代码之中存在了重复,而按照之前所学,这种重复是不可能消除的。

在所有的代码之中,最具有重复意义的就是链表类,针对于每一个简单Java类或者是说其他的任何类,都编写一个链表程序,代码量庞大,而且不方便维护。

 

二、继承的概念

继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

Java的继承通过extends关键字来实现,实现继承的类被成为子类,被继承的类被称为父类。

具体声明格式如下:class 子类 extends 父类 {}

注意:子类又被称为派生类; 父类又被称为超类(Super Class)。

观察继承的基本实现:

运行结果:

上述例子中子类(Student)并没有定义任何的操作,而在主类中所使用的全部操作都是由Person类定义的,得出一个结论:

子类即使不扩充父类,也能维持父类的操作。

在子类之中扩充父类的功能:

运行结果:

上述修改代码段中,子类对于父类的功能进行了扩充(扩充了一个属性和两个方法)。子类从外表看是扩充了父类的功能,但是对于以上的代码,子类还有一个特点:

子类实际上是将父类定义的更加的具体化的一种手段。父类表示的范围大,而子类表示的范围小

 

三、继承的限制

虽然继承可以进行类功能的扩充,但是其在定义的时候也是会存在若干种限制的。

限制一:一个子类只能够继承一个父类,存在单继承局限。 
错误的写法:

class A {  }

class B {  }

class C extends A,B {  } // 一个子类继承了两个父类

以上操作称为多重继承,实际上以上的做法就是希望一个子类,可以同时继承多个类的功能,但是以上的语法不支持而已,但是可以换种方式完成同样的操作。

正确的写法:

class A {  }

class B extends A {  }

class C extends B {  }

C实际上是属于(孙)子类,这样一来就相当于B类继承了A类的全部方法,而C类又继承了A和B类的方法,这种操作称为多层继承。

结论:Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。

限制二:在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。

此时对于A类之中的msg这个私有属性发现无法直接进行访问,但是却发现可以通过setter、getter方法间接的进行操作。

限制三:在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。

运行结果:

这个时候虽然实例化的是子类对象,但是发现它会默认先执行父类构造,调用父类构造的方法体执行,而后再实例化子类对象,调用子类的构造方法。而这个时候,对于子类的构造而言,就相当于隐含了一个super()的形式:

现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法:

运行结果:

在任何的情况下,子类都逃不出父类构造的调用,很明显,super调用父类构造,这个语法和this()很相似:super调用父类构造时,一定要放在构造方法的首行上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值