java第五章 子类与继承
5.1子类与父类
1 java不支持多重继承,即一个子类不可以从多个父类中同时继承,而C++中可以。
人们习惯地称子类与父类的关系式“is—a”的关系
2 再类的声明过程中,通过关键字extends来定义一个类的子类
eg: class 子类名字 extends 父类名字{
}
3 java中的类按照继承关系可以形成树形结构,在这个树形结构中,根节点是Object类(Object类是java。lang包中的类),即Object类是所有类的祖先类,
每个类除了object类有且仅有一个父类,但是一个类可以有零个或多个子类,
如果一个类在声明的时候没有使用extend声明,那么这个类默认为objetc类的子类
eg: class a与class a extends Object 这两种声明是等价的
5.2 子类的·继承性
如果子类与父类在同一个包中,那么子类会继承父类中除了private属性外其他所有的变量和方法,
如果子类与父类不在同一个包中,那么子类会继承父类中除了private和default外其他属性的变量和方法;
对于protected属性的访问权限
比如·a是b的父类 b是c的父类 c是d的父类 在other类中使用d类创建的一个对象,如果使用这个对象调用的是d类中的protectde属性的变量或者方法,如果d类与other类在同一个包中,那么就可以访问,
如果使用对象调用的是d类的祖先类,如果追溯到祖先类,如果祖先类和other类在一个包中,那么便可以调用protectde属性的变量和方法
5.3子类与对象
1:在使用子类创建对象的时候,系统会为对象分配变量,并且为变量分配内存,所有子类中定义的变量与其父类的变量都会分配内存,但是这些变量并不都属于对象的,只有可以对象访问的变量才属于对象拥有的变量
eg: 比如在同一个包中,父类的private类型的变量也会分配内存,但是这些变量并不属于子类创建的对象所拥有,,同理,如果不在同一个包中,default属性的变量也同样2是这个道理
2:instanceof运算符instanceof运算符是一个双目运算符,左边的操作元氏对象,右边的操作元是类,如果左边的对象时右边的类创建的对象,或则是右边类的子创建的对象
那么返回的值是true,否则返回的值是false
5.4成员变量的隐藏和方法重写
成员变量的隐藏
只要子类新定义的变量和父类的变量重名,那么父类的变量便会被隐藏,即使类型不一样也可以
1子类继承的方法只能操作子类继承和隐含的成员变量吗,子类新定义的方法可以操作子类继承和子类新声明的成员变量,但是无法操作隐含的成员变量,(如果操作隐含的成员变量,需要使用super关键字来进行修饰,在后面还会介绍)
方法重写
1重写父类的方法的时候,不可以降低父类方法的访问权限,但是可以提高访问权限
2 JDK1.5对重写的更改,
子类重写方法的类型可以是父类方法类型的子类型,即不必完全一致,比如说,父类的方法类型是people类,子类的重写方法类型可以是student类,前提是student类是people类的子类
5.5super关键字
1.子类一旦隐藏了继承的成员变量,那么隐藏的成员变量便不再属于子类创建的对象拥有,该变量将属于super关键字拥有,被隐藏的·方法也是同样
eg: super.x或super.play()都是在调用隐藏的成员变量和成方法,都是被隐藏的
2. 由于子类不能继承父类的构造方法,因此,子类在其构造方法中对父类的构造方法进行调用的时候,super关键字所构成的语句必须是第一句,,如果在子类的构造方法中没有显示super关键字来调用父类的某个构造方法,那么默认会有 super();
super在调用父类的某个构造函数的时候,要注意根据调用的构造函数进行正常的传参问题
3如果在类中定义一个或多个构造方法的时候,类中不会提供默认的构造方法,就是不带参数的构造方法。所以,挡在父类定义多个构造方法的时候,应当包含一个不带参数的构造方法,以防止子类省略super关键字的时候,系统默认生成默认的super()已造成出现错误。
5.6 final关键字
final关键字可以修饰类,成员变量和方法中的局域变量,以及方法
1.
final修饰的类不允许继承,就是不可以有子类
2.final修饰方法不可以被隐藏,就是子类不可以对其进行更改重写,只能好好的继承
3.final修饰变量就是常量,常量在程序运行的过程中不可以被更改,所以在用final声明常量的必须直接进行初始化
5.7 对象的上转型对象
上转型对象的特点
上转型对象就是讲子类创建的对象的引用赋值给父类声明的对象
1. 上转型对象不可以操作子类新增的成员变量,也不可以操作子类新增的成员方法
2. 上转型对象可以调用子类继承的成员变量以及成员方法,可以调用被隐藏的成员变量和方法,,,,,但是如果子类重写了某个实例方法的话,那么上转型对像调用方法的时候调用的是重写之后的方法
1可以将对象的上转型对象强制转化为子类的对象,那么该对象再次具有了子类对象的功能。
2 不可以将父类创建的对象的引用赋值给子类声明的对象
3.如果子类重写了父类的静态方法,那么子类对象的上转型对象只能调用父类的静态方法,,不可以调用子类重写的静态方法
5.8继承与多态
什么是多态,当一个类有很多子类的时候,如果子类都重写了父类的某个方法的话,那么这些子类的对象的上转型对象调用重写的方法的时候就会产生多种行为,这就是继承与多态的关系
5.9 abstract类与abstract方法
1.对于abstract方法,只可以声明,不允许实现,其实就是没有方法体
而且记住两个不要 1:不可以使用final和abstract同时修饰一个方法和类,因为final方法和类不可以被子类继承,但是abstract类是可以被子类继承的,因为它需要被子类继承去实现
2:不可与使用static和abstract同时修饰一个方法,因为abstract方法是实例方法,而static方法是类方法,属于全局所拥有,是需要被类名才可以被调用的
2.abstract类中可以有abstract方法,也可以由非abstract方法,但是非abstract类中不可以有abstract方法
3.对于abstract类,我们不能使用new创建该类的对象,
具体原因我的理解是比如说人类是一个抽象类,由人类可以产生多个子类,比如中国人,美国人,英国人等等;由于人类是一个高度抽象的概念,至于具体的实现都是其子类具体分析实现的,所以,即使new创建了一个抽象类的对象,也无法调用其高度抽象的方法。
4.如果一个非抽象类是一个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不可以用final和abstract同事修饰一个方法的原因了
5我们虽然不可以用new创建一个abstract类的对象,但是我们可以声明一个abstract类的对象,该对象可以成为其子类对象的上转型对象,也就可以调用子类重写的方法了
6如果一个abstract类是一个abstract类的子类,那么他既可以继承父类的abstract方法,也可以重写父类的方法
下面总结一句话就是 抽象继承抽象双可(既可以继承抽象方法,也可以重写抽象方法)
非抽象继承抽象单可(不可以继承抽象方法,只可以重写)
5.10面向抽象编程
什么是面向抽象编程:是指当设计某种重要的类的时候,不让该类面向具体的类,而是面向抽象类,即设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象
ps:具体类,是指相对于抽象类而言说的,主要是指可以实现的类,可以直接生成实例的类,具有方法体,可以直接调用
额外
设计程序的时候应该注意满足开-闭原则
怎么可以操作子类新增的成员变量?
子类新增方法 或 子类重写方法
子类可以体现多态
java第五章 子类与继承的更多相关文章
- java 第五章
java 第五章 while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行. while 的执行步骤 (1) 声明 ...
- [Effective Java]第五章 泛型
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 自学Java第五章——《面向对象的基本特征》
面向对象的基本特征: 1.封装 2.继承 3.多态 6.1 封装 1.好处: (1)隐藏实现细节,方便使用者使用 (2)安全,可以控制可见范围 2.如何实现封装? 通过权限修饰符 面试题:请按照可见范 ...
- 疯狂JAVA——第五章 面向对象(上)
5.1类和对象 构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例.通过new关键字来调用构造器,从而返回该类的实例. 类名:每个单词首字母大写,其他字母小写,单词之间不要 ...
- 自学Java第五章——《面向对象基础》
5.1 类与对象 1.类:一类具有相同特性的事物的抽象描述. 对象:类的一个个体,实例,具体的存在. 类是对象的设计模板. 2.如何声明类? [修饰符] class 类名{ 成员列表:属性.方法 ...
- Java 第五章 循环结构1
循环结构 1 while 循环结构 ,do- while 循环结构 . 循环结构: 必须满足两个条件 . 1,循环条件 和 循环 操作 ! while 循环 特点:先判断,再执行 , 编码规范:缩进, ...
- java基础(五章)
一. 调试 步骤1:设置断点(不能在空白处设置断点) 步骤2:启动调试 步骤3:调试代码(F6单步跳过)笔记本Fn+F6(F5) 步骤4:结束调试 掌握调试的好处? l 很清晰的看到, ...
- java 第五章 方法定义及调用
1.方法的定义 什么是方法 方法是完成某个功能的一组语句,通常将常用的功能写成一个方法 方法的定义 [访问控制符] [修饰符] 返回值类型 方法名( (参数类型 形式参数, ,参数类型 形式参数, , ...
- “全栈2019”Java第四章:创建第一个Java程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- bootstrap警告框、进度条和列表组
警告框 <div class="container"> <div class="alert alert-success" rol ...
- 五、UML类图和六大原则-----《大话设计模式》
一.单一职责原则 就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力.这种耦合 ...
- MySql中查询语句实现分页功能
import java.util.*;import java.sql.*; public class FruitDao { private Connection conn; private ...
- LOJ#111. 后缀排序(二分 hash)
题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...
- Eclipse-运行符-数据类型转换-环境变量配置
1.能够使用Eclipse快捷键 ctrl + / 单行注释:再按一次则取消: ctrl + shift + / 多行注释: ctrl + shift + \ 取消多行注释: ctrl + ...
- linux各文件夹的作用(转)
转自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可 ...
- iOS Category 添加属性实现原理 - 关联对象
iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...
- 【数据库-Azure SQL Database】SQL Server 如何将数据库备份到 Azure Storage
打开本地的 SQL Server Management Studio.首先创建 Credentials.命令如下: IF NOT EXISTS (SELECT * FROM sys.credent ...
- Linux中配置系统参数
[root@localhost ~]# vim /etc/security/limits.conf root soft nofile 65535root hard nofile 65535* soft ...
- Netbeans使用笔记
Netbeans 新建项目 A brand new project 选择"文件">"新建项目"以打开新建项目向导. 在向导中,选择 "C/C++ ...