黑马程序员_Java面向对象2_继承
4.面向对象_继承
4.1继承的概述
- 提高了代码的复用性。
- 让类与类之间产生了关系,有了这个关系,才有多态的特性。
注意:千万不要为了获取其他类的功能而去继承,简化代码而继承。必须是类与类之间有所属关系才可以继承,所属关系 is a 。
Java语言中:Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患。但多个父类定义了相同的功能时,当功能内容不同时,子类对象不确定实现哪一个。
但是Java保留这种机制,并用类一种体现形式来完成表现,多实现。Java支持多层继承。也就是一个继承体系。
如何使用一个体系中的功能呢?想要使用体系,先查阅体系父类的描述,因为父类中定义的是体系中最共性的功能,通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经基本可以使用了。
那么在具体调用时,要创建最子类的对象,为什么呢?一是因为有可能父类不能创建对象,二是因为创建子类对象可以获取更多功能,包括基本的也包括特有的。
简单一句话:查阅父类功能,创建子类对象,使用功能。
4.2继承的特点
子父类出现后:类成员的特点
- 变量
- 函数
- 构造函数
4.3super关键字
1、子父类中的变量:如果子父类中出现非私有的同名成员变量时,子类要访问本类的变量,用this;子类要访问父类中的同名变量时,用super。
super的使用和this的使用几乎一致。this代表的是本类对象的引用,super代表的是父类的引用。
4.4函数覆盖
2、子父类中的函数:当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。如同父类的函数被覆盖和一样。这种情况是函数的另一个特性:重写(覆盖)
当子类继承父类,沿袭了父类的功能到子类中,但是子类虽然具备该功能,但是功能内部的内容却不一致,这是没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能的内容。
覆盖:1、子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。2、静态只能覆盖静态。
注意:重载:只看同名函数的参数列表。重写:子父类方法要一模一样。包括返回值类型。
4.5子类的实例化过程
3、子父类中的构造函数:在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();
super();会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类中的构造函数?因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类中对这些数据是如何进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
注意:super 语句一定定义在子类构造函数的第一行。
结论:子类中所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内都有一条隐式的语句super();,当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中最少有一个构造函数会访问父类中的构造函数,在子类构造函数中this语句和super语句只能存在一个
4.6final关键字
- final可以修饰类、方法、变量
- final修饰的类不可以被继承(限制全部),为了避免被继承,被子类复写功能。
- final修饰的方法不可以被覆盖(限制局部),既可以修饰成员变量也可以修饰局部变量。
- final修饰的变量是一个常量,只能被赋值一次。(当描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便于阅读,而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有的字母都要大写,如果由多个单词组成,单词间通过下划线_连接。)
- 内部类只能访问被final修饰的局部变量
4.7 抽象类
当多个类中出现相同功能,但是功能主体不同,可以进行向上抽取。这时只抽取功能定义,而不抽取功能主体。抽象:看不懂。
抽象类的特点:
- 抽象方法一定在抽象类中;
- 抽象方法和抽象类都必须被abstract关键字修饰;
- 抽象类不可以用new创建对象,因为调用抽象方法没意义。
- 抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物。只不过该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,也需明确出现。但是无法定义功能主体。通过抽象方法来体现。
抽象类比一般类多了抽象方法。抽象不可以实例化。特殊:抽象类可以不定义抽象方法(目的:不让该类建立对象)。
模板方法模式:在定义功能时,功能的一部分是确定的(不想被子类复写用final修饰),但是有一部分是不确定的(当事物有默认的实现时,不一定用abstract修饰)。而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。
4.8 接口
4.8.1接口的表现形式与类的关系
- 格式:interface{}
- 接口中的成员修饰符是固定的。
- 成员变量:public static final
- 成员函数:public abstract
- 接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化。否则子类也是一个抽象类。接口可以被类多实现,也是对多继承不支持的转换形式。Java支持多实现。
一个类继承了另一个类的同时还能实现多个接口。接口与接口之间存在多继承,类与类之间只支持单继承,类与接口之间存在多实现。
4.8.2接口的特点
- 接口是对外暴露的规则
- 接口是程序的功能扩展
- 接口可以用来多实现
- 接口于类之间是实现关系,而且类可以继承一个类的同时还能实现多个接口
- 接口与接口之间可以有继承关系
黑马程序员_Java面向对象2_继承的更多相关文章
- 黑马程序员_Java面向对象_异常
6.异常 1.异常: 就是程序在运行时出现不正常的情况.问题也是现实生活中一个具体的事物,也可以通过Java的类进行描述,并封装成对象.Exception和Error的子类名都是以父类名作为后缀名. ...
- 黑马程序员_Java面向对象3_多态
5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...
- 黑马程序员_Java面向对象1_封装
3.面向对象_封装 3.1面向对象概念 3.1.1理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为(执行者) 面向对象:将功能封装进对象,强调具备了 ...
- 黑马程序员_Java面向对象_内部类
6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...
- 黑马程序员_Java面向对象_包
7.包 7.1包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称是:包名.类名. 包也是一种封装形式. 利用命令行自动生成文件夹格式:D:\jav ...
- 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
\day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...
- 黑马程序员_Java基础视频-深入浅出精华版--视频列表
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
随机推荐
- MemSQL 3.1 发布,元方,你怎么看? - V2EX
MemSQL 3.1 发布,元方,你怎么看? - V2EX MemSQL 3.1 发布,元方,你怎么看?
- powerdesigner 字段大小写转换\id 自增
转换:tools --> model options-->naming convention name code 自增: 在你所要设为自增型的键上(比如你的id)双击 ,弹出一个Colu ...
- 解决Qt5.7.0 cannot find -lGL
很久没用Qt了,这次要做一个协议编辑器,在ubuntu 14.04上安装了最新版本的Qt 5.7.0.界面改用扁平化风格,第一感觉还不错.按默认步骤创建了一个gui程序,编译运行,报了一个错:cann ...
- springBoot学习
http://blog.csdn.net/xiaoyu411502/article/details/47864969 博客: http://blog.csdn.net/xiaoyu411502/art ...
- MySQL删除外键定义的方法
MySQL外键在定以后,如果我们不再需要这个外键,可以进行删除操作,下面就为您介绍MySQL删除外键定义的方法,供您参考. 不知道大家有没有发现,在定义外键的时候articles.member_id外 ...
- 运行第一个Hadoop程序,WordCount
系统: Ubuntu14.04 Hadoop版本: 2.7.2 参照http://www.cnblogs.com/taichu/p/5264185.html中的分享,来学习运行第一个hadoop程序. ...
- C#。5 函数 类
函数:能够独立完成某个功能的模块. 好处:1.结构更清析(编写.维护方便 ).2.代码重用.3.分工开发. 四要素:名称,输入(参数),输出(返回的类型),加工(函 ...
- Canvas--2
Canvas2(关键词:setLineDash .rect .strokeRect .clearRect .arc.sin .strokeText ) 绘制其他样式: lineCap 结束端点的设 ...
- C/C++中虚函数的调用
代码: #include <iostream> using namespace std; class A{ public: virtual void print(){ cout<&l ...
- [转]XML中必须进行转义的字符
转自:http://jaenson.iteye.com/blog/945469 编写XML代码经常遗漏的常识: XML实体中不允许出现"&","<" ...