博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Scala谜题】成员声明的位置
阅读量:6579 次
发布时间:2019-06-24

本文共 880 字,大约阅读时间需要 2 分钟。

笔记来源:

在许多面向对象的语言中,常常在类构造器中接受参数,目的是将参数赋值给类成员。

执行下面的代码会是什么结果呢?

trait A {  val audience: String  println("Hello " + audience)}class BMember(a: String = "World") extends A {  val audience = a  println("I repeat: Hello " + audience)}class BConstructor(val audience: String = "World") extends A {  println("I repeat: Hello " + audience)}new BMember("Readers")new BConstructor("Readers")

答案是:

Hello nullI repeat:Hello ReadersHello ReadersI repeat:Hello Readers

通常,BConstructor 中的模式是首选的,因为它的行为更少可能会引起意外。这时,超类中声明的 val 绝不会存在于非初始化的状态。

其实,超类和超特质初始化代码的执行是在参数评估和早期字段定义之后,实例化类和特质的初始化语句之前。直接超类和混进特质是当它们出现在 classtraitobject 定义中时按从左到右的顺序初始化。

因此,考虑以下初始化方式:

class BMember2(a: String = "World") extends {  val audience = a} with A {  println("I repeat: Hello " + audience)}new BMember2("Readers")

它的输出结果则为:

Hello ReadersI repeat:Hello Readers
实际生产中,最好考虑在类或对象体的括号后(这是主构造器)按照从左到右的声明顺序插入超类构造器和超特质初始化程序。

转载地址:http://jsino.baihongyu.com/

你可能感兴趣的文章
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
查看>>
SpringBoot实战总汇--详解
查看>>
2018年7月1日笔记
查看>>
尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
查看>>
动态规划:金矿模型
查看>>
子元素应该margin-top为何会影响父元素【转】
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>
BZOJ3668:[NOI2014]起床困难综合症(贪心)
查看>>
LightOJ 1245(Harmonic Number (II))
查看>>
小知识记录
查看>>
css3 animate 和关键帧 @-webkit-keyframes
查看>>
文字链接颜色设置
查看>>
图片转流
查看>>
ubunto应用软件
查看>>
HTML 标签说明
查看>>
锋利的jQuery-2--判断jQuery获取到的对象是否存在$().length
查看>>