scala学习 组合与继承

1.总述

组合:一个类可以包含另一个类的引用,利用这个被引用的类来帮助他完成任务。

继承:子类与超类的关系

2.抽象类

修饰符abstract 表明该类可以拥有那些没有实现的抽象成员,因为不能直接实例化一个抽象类。

注:一个方法只要没实现,那么它就是抽象的

3.无参方法

无参方法,又可称为空圆括号方法,主要针对没有参数且只通过读取所在对象字段的方式访问可变状态的情况下。举例如下:

abstract class Element{
    def contents : Array[String]
    def height : Int = contents.length
    def width : Int = if (height == 0) 0 else contents(0).length
}

abstract class Element{
    def contents : Array[String]
    val height =    contents.length
    val width = if (height == 0) 0 else contents(0).length
}

从使用方来看,这两组定义基本等价。将二者进行对比:

1.字段访问可能比方法调用略快,字段预先计算,方法调用时重新计算

2.字段需要每个Element对象分配额外空间

符合统一访问原则 : 可以使用空括号重写无参方法,也可以在调用某个不需要入参的方法时省去空括号

4.拓展类

A extends B

继承主要特点:

超类的所有成员也是子类的成员,除以下两种情况外:

1.超类的私有成员并不会被子类继承

2.子类实现了相同名称和参数成员,那么该成员不会被继承

子类型的意思是子类的值可以被用在任何需要超类的值的场合

5.重写

Scala中字段和方法同属于一个命名空间。因此Scala禁止在同一个类中使用相同名称命名的字段和方法。

java的命名空间:

字段 方法 类型 包

Scala的命名空间

值(字段 方法 包 单例对象)

类型(类 特质名)

6.定义参数化字段(将参数与字段合并)

class ArrayElement (val contents:Array[String]) extends Element

举例而言:

class Cat { val dangerous = false}
class Tiger (
	override val dangerous:Boolean
   private var age:Int
) extends Cat

class Tiger(param1:Boolean, param2:Int) extends Cat{
   override val dangerous = param1
   private var age = param2
}

7.override "脆弱基类"

8.多态 动态绑定

实际被调用的方法实现是在运行时基于对象的类来决定的

9.final成员

在成员前加上fianl标识符,不会被子类继承

原文地址:https://www.cnblogs.com/ganshuoos/p/12738509.html