Java学习——面向对象之继承
来源:互联网 发布:mac拷贝文件到ntfs 编辑:程序博客网 时间:2024/06/14 10:38
前言
前面给小伙伴的分享了面向的对象的封装,这里我给大家分享的是面向对象的继承,继承是我们在开发当中很经常用到的。什么是继承呢?
继承
继承是面向对象的第二特征,它的定义是从已有的类派生出新的类,新的类能吸收已有的类属性和行为,并能拓展新的能力。
继承是Java面向对象技术的一块基石,因为它允许创建分等级层次的类。继承可以理解为一个对象从另一个对象获取属性的过程。
继承的实现
在Java语言中继承使用extends关键字来建立联系。
//从形状类派生出矩形类public class Rect extends Shape{}//从矩形类中派生正方形类public class Square extends Rect{}
继承的特点
- Java只支持单一继承,但是可以多层继承。
- 不能继承父类private的属性和方法。
- 子类不能继承父类的构造方法,但是可以通过super关键字去访问。
什么情况使用继承
发现两个类关系是IS-A,一个对象是另外一个对象的一个分类。
使用继承的好处
- 继承简化了人们对事物的认知和描述,能清晰体现类与类之间的层次结构关系。
- 继承提供了原件复用功能。若类B继承类A,那么建立类B时只需要在描述与基类(A类)不同的少量特征(数据类型和成员方法)即可。这种做法能减少代码和数据的冗余度,大大增加程序的重用性。
- 继承通过增强一致性类减少模块间的接口和界面,大大增加了程序的已维护性。
继承中的初始化
从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类的属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,有具体分为类的初始化和对象的初始化。
类的初始化
在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。
对象的初始化
在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。
需要注意的是
在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,但构造器另当别论。
类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。
继承中的隐藏
隐藏含义:实际上存在,但是对外不可见。
Java类具有三种访问控制符:private、protected和public,同时当不写这三个访问控制符时,表现为一种默认的访问控制状态。因此,一共具有四种访问控制级别。
具体访问控制表现如下:
private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;public修饰的属性或方法外部类中都可以直接访问。
当子类继承父类,子类可以继承父类中具有访问控制权限的属性和方法(一般来说是非private修饰的),对于private修饰的父类所特有的属性和方法,子类是不继承过来的。
当子类需要改变继承过来的方法时,也就是常说的重写父类的方法。一旦重写后,父类的此方法对子类来说表现为隐藏。以后子类的对象调用此方法时,都是调用子类重写后的方法,但子类对象中想调用父类原来的此方法时,可以通过如下两种方式:
1.将子类对象类型强制转化为父类类型,进行调用;
2.通过super调用。
同样的,如果在子类中定义父类中相同名称的属性时,父类属性在子类中表现为隐藏。
Super关键字
super代表父类的一个标识,且当作父类对象一个引用,可以使用该关键字调用父类非私有的属性和非私有方法。
如果父类有无参构造方法,那么子类的每一个构造方法可以不显式调用super();
如果父类没有无参构造方法,那么子类的每一个构造方法都必须显式调用父类的有参构造方法。
super()调用父类的构造方法,必须放在第一行。
Object类
Object类是所有Java类的祖先类。每个类的Object作为超类。所有对象(包括数组)都实现这个类的方法。
在不明确的情况下,Java会自动把Object作为定义类的超类。
可以使用Object的变量指向任意类型的对象。(多态)
Object中包含所有类都有的方法,比如比较常用的equals和toString方法。
重写
在Java中,子类可以继承父类的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动的继承父类的方法,而是想做一定的修改,这就是采用方法的重写。方法重写又称方法的覆盖。
若子类中的方法与父类中的某一方法具有相同方法名、返回值类型和参数列表,则新的方法覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用当前类的父类。
注意:子类方法的访问修饰权限不能严于父类;
重载和重写的区别
前面我们有提起Java中的方法重载,这里我们有提到了方法的重写,那么我们来看一下他们的区别。
- 重写需要方法名、返回值、参数列表完全相同。重载需要方法名相同,参数列表不同,可以有不同的返回值。
- 重写访问权限必须大于父类,而重载没有这个要求。
- 重写发生在父类和子类当中,而重载发生在本类当中。
- Java学习——面向对象之继承
- java学习笔记《java面向对象编程》——继承
- 黑马程序员学习笔记四——Java 面向对象 特点之 继承
- 黑马程序员——学习日记6 java面向对象之继承
- 黑马程序员——面向对象之继承学习笔记
- IOS学习之OC面向对象—继承
- Scala学习—面向对象编程之继承
- 黑马程序员笔记——Java面向对象之继承
- java之面向对象——继承、封装、多态
- 笔记——Java面向对象之继承
- JAVA-面向对象之继承
- Java面向对象之继承
- java面向对象之继承
- Java面向对象之继承
- Java面向对象之继承
- Java面向对象之继承
- Java面向对象之继承
- java面向对象之继承
- Spring boot结合Mysql
- 等差数列和等比数列的公式、法则、定理
- 自觉java
- Android之ndk编译出现这个错误error: unused variable 'a' [-Werror=unused-variable]
- android_GreenDao简单使用
- Java学习——面向对象之继承
- ArcGIS矢量数据模型
- js动态添加input按钮并给按钮增加onclick的函数事件(带参数)
- 使用时间序列分解模型预测商品销量
- Spring Boot使用FastDFS结合Dropzone.js Bootstrap上传图片
- FTP读取文件目录问题
- 条款20:宁以pass-by-reference-to-const替换pass-by-value
- Spring---JDBC
- 8个非常实用的Linux系统监控shell脚本