[javase学习笔记]-9.2 单继承与多重继承
这一节我们来看java中的单继承和多重继承。
在java语言中,支持的是单继承,不直接支持多继承,可是对C++中的多继承进行了改良。
那么什么是单继承和多继承呢?
单继承:一个子类仅仅能有一个直接父类。
多继承:一个子类能够有多个直接父类。
这个在java中是不同意的。
为什么不同意呢?我们看一个样例:
class A
{
void method()
{
System.out.println("a");
}
}
class B
{
void method()
{
System.out.println("b");
}
}
class C extends A,B
{
}
对于上面的情况。假设当我们调用C对象的method方法时,就会出现不确定性错误了。java也是以这个问题进行改良,从而不直接支持多继承。
所以我们能够看到,java中不直接支持多继承的原因就是:当多个类中有同样成员时会产生调用的不确定性。
java语言中还支持多重继承。
比方以下的样例就是一个多重继承:
class A
{
}
class B extends A
{
}
class C extends B
{
}
这就是多重继承的形式,对于上面的继承,就出现了继承体系。而在这个继承体系中,A是最顶层类,C是对子类。
通过上面的继承体系我们不难看出。A实现的是最基本最基础的功能。
那么我们在实际开发中应该怎样使用这个继承体系呢?
第一步:查看该体系中的顶层类(这里是A),了解该体系的基本功能。
第二步:创建体系中的最子类对象(这里是C),完毕功能的使用。
通过上面的两步。我们就能够按需使用一个继承体系了。
这两节我们一直在说继承。在9.1中我们也说到继承能够提高代码的复用性,可是我们一定要注意:千万不要为了提高代码复用性去定义继承。
这是为什么呢?我们看以下样例:
class A
{
void method1(){}
void method2(){}
}
class B
{
void method1(){}
void method3(){}
}
我们发现两个类中都有method1方法。那么我们为了提高复用性而去继承:
class A
{
void method1(){}
void method2(){}
}
class B extends A
{
void method3(){}
}
B类中确实有了method1方法,能够也同一时候继承了method2方法,但method2方法事实上并非B中的方法。这就出现了问题。
这就让我们必须明白什么时候定义继承:当类与类之间存着所属关系时。就定义继承。
那么什么是所属关系呢?比方X是Y中的一种,就是说X属于Y。就是一种所属关系。
我们这样表示所属关系:is a 关系。就是所属关系。
所以当我们发现两个类是一种is a 关系时,我们就能够定义继承。
[javase学习笔记]-9.2 单继承与多重继承的更多相关文章
- JavaSE学习笔记(12)---线程
JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- javaSE学习笔记(17)---锁
javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...
- javaSE学习笔记(15) ---缓冲流、转换流、序列化流
javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- JavaSE学习笔记(13)---线程池、Lambda表达式
JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...
- javaSE学习笔记(10)---List、Set
javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...
- JavaSE学习笔记(9)---集合类和泛型
JavaSE学习笔记(9)---集合类和泛型 1.Collection集合 集合概述 在前面我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合:集合是jav ...
- JavaSE学习笔记(8)---常用类
JavaSE学习笔记(8)---常用类 1.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类 ...
- JavaSE学习笔记(6)---异常
JavaSE学习笔记(6)---异常 软件程序在运行过程中,非常可能遇到问题,我们称之为异常,英文是:Exception,意思是例外.遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理 ...
随机推荐
- vue 异步请求数据后,用v-if,显示组件,这样初始化的值就在开始的时候传进去了
请求到数据才会有的一个组件,并把数据传进组件中 https://www.cnblogs.com/LuckyWinty/p/6246698.html
- python关于入参中,传入的是指针还是引用
偶然看到别人的代码,发现有的会传入参数之后,做一次copy,试验一下,关于入参中,传入的是指针还是引用先说自己的结论:1.如果传入的是简单的类型,那么传入应该是引用的数值,2.假如传入的是df这种类型 ...
- SQL比较两表字段和字段类型
一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...
- vue 点击按钮弹窗,点击关闭按钮关闭弹窗。
<div @click="btnfc()">点击弹窗按钮</div> <div v-show="show"> <div ...
- cc.Component
组件入口函数1: onLoad: 组件加载的时候调用, 保证了你可以获取到场景中的其他节点,以及节点关联的资源数据;2: start: 也就是第一次执行 update 之前触发;3: update(d ...
- ABAQUS学习记录1——用户子程序综述
概述 ABAQUS提供了相当丰富的单元类型,材料属性等数据库可供用户选择,但是工程问题是千变万化的,为了满足用户的特殊工程要求,ABAQUS为用户提供了强大而又灵活的用户子程序接口(USER SUBR ...
- luogu P3353 在你窗外闪耀的星星
问题:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置Xi和自身的亮度Bi.而窗户所能看到的范围是一个给出的参数W,我们看到的星星也包括窗户边缘的星星.现在,要你求出调整 ...
- Shell函数和正则表达式
1. shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式: func() { #指定 ...
- scrollLeft属性设置无效的一个记录
首先应该明确scrollLeft这个属性,只有当div中的内容长度大于当前div的长度是才能working,根据这个我我找到了一个很神奇的地方,而且我注意到这个${}连注释里面都能替换过来! 以下是正 ...
- Tomcat启动慢(运行shutdown.sh的时候报错)
Using CATALINA_BASE: /usr/local/tomcatUsing CATALINA_HOME: /usr/local/tomcatUsing CATALINA_TMPDIR: / ...