Scala 面向对象(六):面向对象的特征二:继承 (一)
1 Scala继承的基本语法
class 子类名 extends 父类名 { 类体 }
- class Person {
- var name : String = _
- var age : Int = _
- def showInfo(): Unit = {
- println("学生信息如下:")
- println("名字:" + this.name)
- }
- }
- class Student extends Person {
- def studying(): Unit = {
- println(this.name + "学习 scala中....")
- }
- }
Scala继承给编程带来的便利
1)代码的复用性提高了
2)代码的扩展性和维护性提高了
scala子类继承了什么,怎么继承了?
子类继承了所有的属性,只是私有的属性不能直接访问,需要通过公共的方法去访问
- object Extends02 {
- def main(args: Array[String]): Unit = {
- val sub = new Sub()
- sub.sayOk()
- }}
- class Base {
- var n1: Int = 1
- protected var n2: Int = 2
- private var n3: Int = 3
- def test100(): Unit = {
- println("base 100")
- }
- protected def test200(): Unit = {
- println("base 200")
- }
- private def test300(): Unit = {
- println("base 300")
- }
- }
- class Sub extends Base {
- def sayOk(): Unit = {
- this.n1 = 20
- this.n2 = 40
- println("范围" + this.n1 + this.n2)
- }}
2 重写方法
说明: scala明确规定,重写一个非抽象方法需要用override修饰符,调用超类的方法使用super关键字
- class Person {
- var name : String = "tom"
- def printName() {
- println("Person printName() " + name)
- }
- }
- class Emp extends Person {
- //这里需要显式的使用override
- override def printName() {
- println("Emp printName() " + name)
- super.printName()
- }
- }
3 Scala中类型检查和转换
要测试某个对象是否属于某个给定的类,可以用isInstanceOf方法。用asInstanceOf方法将引用转换为子类的引用。classOf获取对象的类名。
1)classOf[String]就如同Java的 String.class 。
2)obj.isInstanceOf[T]就如同Java的obj instanceof T 判断obj是不是T类型。
3) obj.asInstanceOf[T]就如同Java的(T)obj 将obj强转成T类型。
类型检查和转换的最大价值在于:可以判断传入对象的类型,然后转成对应的子类对象,进行相关操作,这里也体现出多态的特点。
4 Scala中超类的构造
Scala超类的构造说明
1) 类有一个主构器和任意数量的辅助构造器,而每个辅助构造器都必须先调用主构造器(也可以是间接调用.),这点在前面我们说过了。
- class Person {
- var name = "zhangsan"
- println("Person...")}
- class Emp extends Person {
- println("Emp ....")
- def this(name : String) {
- this // 必须调用主构造器
- this.name = name
- println("Emp 辅助构造器~")
- }}
2) 只有主构造器可以调用父类的构造器。辅助构造器不能直接调用父类的构造器。在Scala的构造器中,你不能调用super(params)
- class Person(name: String) { //父类的构造器
- }
- class Emp (name: String) extends Person(name) {// 将子类参数传递给父类构造器,这种写法√
- // super(name) (×) 没有这种语法
- def this() {
- super("abc") // (×)不能在辅助构造器中调用父类的构造器
- }
- }
5 覆写字段
基本介绍
在Scala中,子类改写父类的字段,我们称为覆写/重写字段。覆写字段需使用 override修饰。
Scala覆写字段快速入门
覆写字段的注意事项和细节
1) def只能重写另一个def(即:方法只能重写另一个方法)
2) val只能重写另一个val 属性 或 重写不带参数的def
3) var只能重写另一个抽象的var属性
抽象属性:声明未初始化的变量就是抽象的属性,抽象属性在抽象类
var重写抽象的var属性小结
1) 一个属性没有初始化,那么这个属性就是抽象属性
2) 抽象属性在编译成字节码文件时,属性并不会声明,但是会自动生成抽象方法,所以类必须声明为抽象类
3) 如果是覆写一个父类的抽象属性,那么override 关键字可省略 [原因:父类的抽象属性,生成的是抽象方法,因此就不涉及到方法重写的概念,因此override可省略]
6 抽象类
在Scala中,通过abstract关键字标记不能被实例化的类。方法不用标记abstract,只要省掉方法体即可。抽象类可以拥有抽象字段,抽象字段/属性就是没有初始值的字段
快速入门案例
抽象类基本语法
说明:抽象类的价值更多是在于设计,是设计者设计好后,让子类继承并实现抽象类(即:实现抽象类的抽象方法)
Scala抽象类使用的注意事项和细节讨论
1)抽象类不能被实例
2)抽象类不一定要包含abstract方法。
3)也就是说,抽象类可以没有abstract方法 一旦类包含了抽象方法或者抽象属性,则这个类必须声明为abstract
4)抽象方法不能有主体,不允许使用abstract修饰。
5) 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法和抽象属性,除非它自己也声明为abstract类。
6)抽象方法和抽象属性不能使用private、final 来修饰,因为这些关键字都是和重写/实现相违背的。
7) 抽象类中可以有实现的方法.
8) 子类重写抽象方法不需要override,写上也不会错.
7 匿名子类
和Java一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类.
8 继承层级
subtype : 子类型
implicit Conversion 隐式转换
class hierarchy : 类层次
继承层级图小结
1) 在scala中,所有其他类都是AnyRef的子类,类似Java的Object。
2)AnyVal和AnyRef都扩展自Any类。Any类是根节点
3)Any中定义了isInstanceOf、asInstanceOf方法,以及哈希方法等。
4)Null类型的唯一实例就是null对象。可以将null赋值给任何引用,但不能赋值给值类型的变量
5)Nothing类型没有实例。它对于泛型结构是有用处的,举例:空列表Nil的类型是List[Nothing],它是List[T]的子类型,T可以是任何类。
Scala 面向对象(六):面向对象的特征二:继承 (一)的更多相关文章
- 面向对象(OPP)的三大特征之 继承
OPP(面向对象编程的缩写)的三大优势: 1.继承 2.封装 3.多态 一.继承 1.继承:是两个对象之间的一种关系 a继承b 例如王思聪继承王健林 在OPP中继承是描述类与类之间的一种关系 2.继承 ...
- java面向对象编程(六)--四大特征之继承
本文将介绍继承.方法重载和方法覆盖.其中方法重载和方法覆盖是在讲多态时必须要清楚的一个知识点. 一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变 ...
- 【java基础】面向对象的三大基本特征之-------继承
面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类 ...
- 包(package)以及面向对象三个基本特征(继承)的介绍
1.包(package) 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包也可以看成一个目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维 ...
- 面向对象的三大特性之二——继承(含super的使用)
1.继承的语法:class 子类 extends 父类 例1: class Person { int age; String name; public void print1() { System.o ...
- Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)
一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- Python面向对象初始(三大特征,多态,继承,封装)
Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...
- Java——面向对象的特征二:继承性
2.1面向对象的特征二:继承性 ①引入类继承最基本的作用是:代码重用. ②语法 [修饰符列表] class 子类名 extends 父类名{ 类体; } ③子类继承父类以后,父类中声明的属性.方法,子 ...
随机推荐
- ServiceStack.Redis 5.8 版本去掉每小时 6000 次访问限制
ServiceStack.Redis这个官方 Redis 访问组件从4.0版本后开始商业化了,在使用的时候会有很多限制: 1.类型限制 类型限制是20,这个组件自带序列化功能,使得我们可以直接把对象保 ...
- Spark GraphX企业运用
========== Spark GraphX 概述 ==========1.Spark GraphX是什么? (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...
- 【大厂面试08期】谈一谈你对HashMap的理解?
摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...
- 能被 K 整除的最大连续子串长度
[来源]网上流传的2017美团秋招笔试题 [问题描述] 两个测试样例输出都是5 [算法思路] 暴力解法时间会超限,使用一种很巧妙的数学方法.用在读取数组arr时用数组sum记录其前 i 项的和,即 s ...
- C++_继承
C++支持单继承和多继承,并提供3类继承:public.private及protected.在public继承中,每个派生类对象都是基类对象,反之基类对象却不是派生类对象.派生类成员无法直接访问基本的 ...
- 图解leetcode5-10 | 和233酱一起刷leetcode系列(2)
本周我们继续来看5道磨人的小妖精,图解leetcode6-10- 多说一句,leetcode10 杀死了233酱不少脑细胞... 另: 沉迷算法,无法自拔.快来加入我们吧! 别忘了233酱的一条龙服务 ...
- JavaWeb网上图书商城完整项目--day02-15.登录功能流程分析
当用户点击登录界面的登录按钮的时候,将登录的用户名.密码和验证码上传到后台,后台的业务流程如下面所示:
- TestNG学习笔记新的
1.参考官方文档https://www.yiibai.com/html/testng/2013/0915300.html package com.cib.testng; import org.test ...
- 尚硅谷maven视频教程笔记
07.尚硅谷_Maven_部署Maven核心程序.avi 第一步先安装jdk 第二步下载maven 特别需要注意的是maven不能存储在有中文和空格的目录下面 3.调试是否安装成功,在cmd中输入 m ...
- SpringMVC 学习笔记(三)数据的校验
34. 尚硅谷_佟刚_SpringMVC_数据绑定流程分析.avi 例如:在jsp中输入一个String字符串类型,需要转换成Date类型的流程如下 convertservice对传入的数据进行转换 ...