scala学习手记13 - 类继承

在scala里,类继承有两点限制:

  • 重写方法需要使用override关键字;
  • 只有主构造函数才能往父类构造函数中传参数。

在java1.5中引入了override注解,但不强制使用。不过在scala中要想重写方法必须使用override关键字。如果确实重写了父类的方法又不使用override关键字的话,则会在编译时报错,提示没有使用override修饰符。

scala的副构造函数必须调用主构造函数或是另一个副构造函数。只有在主构造函数中才能向父类的构造函数中传递数据。可以看出来主构造函数如同父类和子类中间的一道关卡:它既负责完成子类的初始化,也负责与父类的沟通。

下面的这段代码演示了下上述内容:

class Vehicle(val id: Int, val year: Int) {
  override def toString(): String = "ID: " + id + " Year: " + year
}

class Car(override val id: Int, override val year: Int, var fuelLevel: Int) extends Vehicle(id, year) {
  override def toString(): String = super.toString() + " Fuel Level: " + fuelLevel
}

val car = new Car(1, 2009, 100)
println (car)

在代码中定义了两个类:Vehicle和Car。Car继承了Vehicle。在继承的时候,因为要向父类传递参数,所以Car类主构造函数的一部分必须能匹配父类的构造函数。因为Car类构造函数中的id和year两个成员变量源自父类Vehicle,所以需要使用override关键字修饰。此外,因为这两个类都重写了java.lang.Object的toString方法,所以重写的方法前面需要使用override关键字修饰。

看一下执行结果:

就这样!

###########

时间: 2024-10-03 02:02:25

scala学习手记13 - 类继承的相关文章

scala学习手记11 - 类定义

这里会通过与Java比较的方式来说明scala是如何创建类的. 先来看一下Java中是如何定义一个类的: public class Car { private final int year; private int miles; public Car(int yearOfMake) { year = yearOfMake; } public int getYear() { return year; } public int getMiles() { return miles; } public

scala学习手记10 - 访问修饰符

scala的访问修饰符有如下几个特性: 如果不指定访问修饰符,scala默认为public: 较之Java,scala对protected的定义更加严格: scala可以对可见性进行细粒度的控制. scala的默认访问修饰符 如果没有修饰符,scala会默认把类.字段.方法的访问修饰符当做public.如果要将之调整为private或protected,只需在前面添加对应的修饰符关键字即可.就如下面的程序: class Microwave{ def start() = println("star

scala学习手记12 - 字段、方法和构造函数

在上一节创建了一个scala类,如果没有更多的方法,scala类的定义还可以更简单一些,看一下下面这个CreditCard类的定义: class CreditCard(val number: Int, var creditLimit: Int) 是的,只用一行就完成了类的定义,连大括号都不需要. 因为scala也是运行在JVM上,可以考虑以java的方式来看看编译后的类文件.查看的方式还是比较灵活的,可以使用JD-GUI,也可以使用javap –private CreditCard命令,还有一个

scala学习手记35 - 隐式类型转换

先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿不是代码的东西出来做什么! 非要强说是代码的话,那么执行起来肯定是要报错的--因为scala的Int和RichInt,以及Integer中都没有days这样的方法: 如果说不是代码的话,那么scala中的to或until本来看起来也不像代码: 2 to 6 2 until 7 现在剩下的就是怎么为整型值添加上

C++ 学习笔记之---类继承

参考自<C++ Primer Plus 6th Edition> 除了修改代码外,有两种方法能够用来扩展类的定义,一个是组合,另一个就是继承 组合:  使用类型为别类的成员变量 继承:  从已有的类派生出新类,在新类中加入新的成员 本文仅讨论继承中的公有继承 (class derivedClass : public baseClass) 分为三部分: 第一部分讲述多态,第二部分讲述派生类的方法,第三部分讲一些额外补充的知识,比较杂 第一部分 多态 概念:   多态是针对类中的成员函数而言的.设

scala学习手记18 - Any和Nothing

Any 前面已经有两次提到过:在scala中,Any类是所有类的超类. Any有两个子类:AnyVal和AnyRef.对应Java直接类型的scala封装类,如Int.Double等,AnyVal是它们的基类:对应引用类型,AnyRef是它们的基类. scala中,所有类的关系可以用下面这张图大致描述下: Any是一个抽象类,它有如下方法:!=().==().asInstanceOf().equals().hashCode().isInstanceOf()和toString().AnyVal没有

scala学习手记9 - =和==

= 赋值运算 scala的赋值运算和java的有着很大的不同.如a=b这样的赋值运算,在Java中返回值是a的值,在scala中返回的则是Unit.Unit是值类型,全局只存在唯一的值,即(),通常Unit只用来声明函数或方法的返回值,其他场景基本是没有意义的.这样就很容易导致一些错误地使用,比如a=b=c这样的赋值运算在java中是绝对可以的,但是在scala中运行就会报错.看一段代码: var a, b, c = 1 a = b=c println(a) 上面这段代码还没有执行就在IDE中报

scala学习手记40 - 使用case类

前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match可以是Any类型的所有类,为什么还需要使用case关键字来修饰呢?假定有这样一个场景:我们要接收和处理股票交易信息,买卖消息通常会带有一些信息,诸如股票名称.数量.把这些信息存到对象里会很方便,但是如何对他们进行模式匹配呢?这时我们就会用到case类了.case类是模式匹配器(pattern mat

scala学习手记4 - Java基本类型对应的scala类

在Java中变量类型分为两大类:基本类型和引用类型.虽然在JDK1.5以后引入了自动装箱和自动拆箱机制,大大减少了我们在直接类型和引用类型之间的纠结,但仍有一些我们不得不考虑的问题.比如我在工作遇到的基本类型和其包装类型的默认值的问题,比如泛型只能使用引用类型,比如默认情况下直接类型的值不能作为对象来操作(1.toString()就不能通过编译)等等. 在scala中一切都是对象. 在scala中1.toString()这样的写法是完全可以接受的.java中的每个基本类型在scala中都有对应的