首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当子类使用val实现它时,Scala抽象方法在超类中为null?

当子类使用val实现它时,Scala抽象方法在超类中为null。

在Scala中,val是一个只读的变量,它在定义时必须被初始化,并且在整个生命周期中其值不会改变。如果在抽象类中定义了一个抽象方法,并且在子类中使用val来实现它,那么在超类中调用这个抽象方法时,它将返回null。这是因为在子类中,val是在构造函数中被初始化的,而在超类的构造函数中,子类的成员变量还没有被初始化,因此抽象方法返回null。

为了避免这个问题,可以使用lazy val来替代val,这样在第一次使用时才会被初始化,从而避免了在超类构造函数中调用抽象方法时返回null的问题。

以下是一个示例代码:

代码语言:scala
复制
abstract class SuperClass {
  def method: String

  def testMethod: String = {
    method // 这里会返回null,因为子类的成员变量还没有被初始化
  }
}

class SubClass extends SuperClass {
  val method = "Hello, world!"
}

val subClass = new SubClass
println(subClass.testMethod) // 输出null

如果使用lazy val替代val,则不会出现这个问题:

代码语言:scala
复制
abstract class SuperClass {
  def method: String

  def testMethod: String = {
    method // 这里不会返回null,因为lazy val会在第一次使用时被初始化
  }
}

class SubClass extends SuperClass {
  lazy val method = "Hello, world!"
}

val subClass = new SubClass
println(subClass.testMethod) // 输出"Hello, world!"
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大数据利器--Scala语言学习(基础)

Null null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型 Nothing Nothing类型Scala层级的最低端;它是任何其他类型的子类型。...2) 方法访问权限为默认,默认为 public 访问权限。 3) private 私有权限,只的内部和伴生对象可用。...5) 如果一个继承了抽象,则必须实现抽象的所有抽象方法抽象属性,除非它自己也声明为 abstract。...7) 抽象可以有实现方法. 8) 子类重写抽象方法不需要 override,写上也不会错. scala abstract class person { var name:String } class...[如何理解] 5) 抽象中有 抽象方法,如何动态混入特质->可以,创建实例实现抽象方法即可 scala package cn.buildworld.scala.day2 object demo2

1K10

Scala专题系列(六) : Scala特质

Scala和Java一样不允许从多个继承,Java只能扩展 自一个,它可以实现多个接口,但接口中只能包含抽象方法,不能包含字段 Scala提供的"特质"类似于java的接口, 但又有所不同...(msg:String) // 这是一个抽象方法 } scala特质,不需要将方法声明为abstract ,特质未被实现方法默认就是抽象的,同时子类实现如下: class consoleLogger...Serializable Scala只能有一个,但可以有任意数量的特质 特质里面也是可以有具体实现 scala,特质方法并不需要一定是抽象的,举例来说 trait consoleLogger...() 特质重写抽象方法 前面我们提到,实现某个特质的方法,是不需要加override的,但是特质,如果要重写父特质的方法,需要加上override的 比如: triait Logger...,编译器能够确保所有混入该特质的都认这个,Scala还有另一套机制可以保证这一点:自身类型(self type) 特质以如下代码开始定义: this:类型 => 便能够被混入指定类型的子类

67320

3小Scala入门

以及 Unit(表示无值与C语言void等同,用作无返回值的方法的返回类型), Null(AnyRef的子类null的唯一对象), Nothing(所有类型的子类没有对象), Any(所有其他...注意使用第(3)种方法scalac把代码编译,脚本必须要定义object单例对象。并且object对象实现main方法作为程序入口。 ?...Scala有3定义的风格,java风格,简写风格,和case风格。 简写风格可以声明的参数前加上val即表示的属性,省去属性的绑定。...二十四,继承和特征 Scala可以通过extends关键字指定从某个(父)进行继承。 只有子类的主构造器可以调用的主构造器。 子类可以使用super引用的某个属性和方法。...子类如果要重写的某个属性和方法,需要使用override关键字。 除非的该属性和该方法抽象方法,只有声明没有定义。

1.6K30

3小Scala入门

以及 Unit(表示无值与C语言void等同,用作无返回值的方法的返回类型), Null(AnyRef的子类null的唯一对象), Nothing(所有类型的子类没有对象), Any(所有其他...注意使用第(3)种方法scalac把代码编译,脚本必须要定义object单例对象。并且object对象实现main方法作为程序入口。 ?...Scala有3定义的风格,java风格,简写风格,和case风格。 简写风格可以声明的参数前加上val即表示的属性,省去属性的绑定。...二十四,继承和特征 Scala可以通过extends关键字指定从某个(父)进行继承。 只有子类的主构造器可以调用的主构造器。 子类可以使用super引用的某个属性和方法。...子类如果要重写的某个属性和方法,需要使用override关键字。 除非的该属性和该方法抽象方法,只有声明没有定义。

3.5K20

3小Scala入门

以及 Unit(表示无值与C语言void等同,用作无返回值的方法的返回类型), Null(AnyRef的子类null的唯一对象), Nothing(所有类型的子类没有对象), Any(所有其他...注意使用第(3)种方法scalac把代码编译,脚本必须要定义object单例对象。并且object对象实现main方法作为程序入口。 ?...Scala有3定义的风格,java风格,简写风格,和case风格。 简写风格可以声明的参数前加上val即表示的属性,省去属性的绑定。...二十四,继承和特征 Scala可以通过extends关键字指定从某个(父)进行继承。 只有子类的主构造器可以调用的主构造器。 子类可以使用super引用的某个属性和方法。...子类如果要重写的某个属性和方法,需要使用override关键字。 除非的该属性和该方法抽象方法,只有声明没有定义。

1.6K30

大数据技术之_16_Scala学习_05_面向对象编程-中级

说明:scala 明确规定,重写一个非抽象方法需要用 override 修饰符,调用方法使用 super 关键字。... 明确规定,重写一个非抽象方法需要用 override 修饰符,调用方法使用 super 关键字。... 明确规定,重写一个非抽象方法需要用 override 修饰符,调用方法使用 super 关键字。... age: Int = 10 // val修饰,底层只生成 public int age() } // 1、我们子类重写父抽象属性,本质上是实现抽象方法,生成了两个 public 方法 //...但是有一种情况:动态实现抽象的所有抽象方法抽象也就被实例化了。本质是该抽象的匿名子类实现了该抽象

1.3K30

scala 语法深析

特有类型 Null :Trait,唯一实例null,是anyRef的子类 Nothing :Trait,anyRef和anyVal的共同子类 None :Option的两个子类有some和None Unit...:无返回值的函数类型,和void相对应 Nil :长度0 的list Any所有类型的,任何实例都属于Any类型 AnyRef所有引用类型的 AnyVal所有值类型的 Nothing所有其他类型的子类...object: 修饰的称为伴生对象;定义object的属性(字段、方法)都是静 态的,main函数写在里面;scala 的object是单例对象,可以看成是定义静态的方法.object不可以传参数...使用方法,可以main函数不通过new来创建一个对象,加载创建对象的这个的时候,会自动调用apply这个方法。...2》与接口不同的是,它还可以定义属性和方法实现抽象和接口的结合。 3》一般情况下Scala可以继承多个Trait,从结果来看就是实现了多重继承。

62810

深圳大数据培训学习:继承--【千锋】

扩展 Scala扩展的方式和Java一样都是使用extends关键字 可以把声明为final,使之不能扩张 也可以把单个方法或者字段声明为final,以确保它不能被重写,注意和Java的不同,...重写方法 Scala重写一个非抽象方法必须使用override修饰符 子类调用方法使用super,和Java一致。...的构造 下面代码定义了一个子类和一个调用构造器的主构造器 class Employ(name: String, age: Int, val Salary:Double) extends Person...val t1,t2,(a, b, c) = { println("ABC")       (1,2,3)     } println(a) println(t1._1) //Scala重写一个非抽象方法必须用...def byScala(): String={ "coding by Scala"     } //子类重写抽象方法,不需要使用override关键字,写了也可以 def run()

50420

Scala教程之:静态类型

、一致的方式使用抽象,我们通过下面几个特征来一一说明: 泛类型 型变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 多态方法 类型推断 通过这些特性,安全可重用的编程抽象以及类型安全的扩展提供了强大的基础...类型系统中使用型变允许我们复杂类型之间建立直观的连接,而缺乏型变则会限制抽象的重用性。...res = new Node nodes = res :: nodes res } } Scala 抽象类型 抽象类型通常用T来表示,用在特质和抽象,表示实际类型可以由具体的实现来确认...Cloneable = { //... } Scala 自类型 自类型的意思是一个trait可以使用另外一个trait定义的属性而不必去继承。...调用 多态方法 或实例化 泛型 ,也不必明确指定类型参数。Scala 编译器将从上下文和实际方法的类型/构造函数参数的类型推断出缺失的类型参数。

1.3K20

大数据--scala学习第一章:基础第二章:控制结构和函数第三章:数组第四章:字典和元组第五章:第六章:对象第七章:包和引入第八章:继承第九章文件和正则表达式第十章特质:接口第十一章操作符第十二章函

3、测试某个对象属于哪个使用isInstanceOf方法对象是该类或者子类的对象返回True. 4、Scala也有protected修饰符,与java的一样 5、子类的辅助构造器不能调用父的构造器只能通过子类的主构造器进行调用形式如下...第十章特质:接口 1、特质定义:使用关键字trait定义特质,其中的方法抽象方法需要实现,不需要限定符abstract,重写也不需要给出override关键字。...3、特质可以有具体实现方法,java的接口Scala可以当做特质来使用,也可以new对象继承特质:val acct=new Peolpe with Logger。...4、特质的字段可以是具体的也可以是抽象的。如果你给出了初始值那么字段就是具体的,实现该特质的不是继承了该字段,而是类似于定义定义了字段。抽象字段必须在实现写出该字段。...比如map的get方法java可能返回null而导致出现NullPointerException异常,而Scala返回的是一个Option[T]类型当值不存在None,存在返回Some(T

4.4K20

大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

2、特质没有实现方法就是抽象方法通过 extends 继承特质,通过 with 可以继承多个特质。   3、所有的 java 接口都可以当做 Scala 特质使用。...演示一个继承多个特质的语法: ? 8.4.4 带有具体实现的特质   说明:和 Java 的接口不太一样的是特质方法并不一定是抽象的,也可以有非抽象方法(即:实现了的方法)。...实现了的方法的术语: 默认实现。提示: jdk1.8 接口也可以有默认实现,就是 scala 的 trait 的带来的特性。...4、定义一个抽象 Shape,一个抽象方法 centerPoint,以及该抽象子类 Rectangle 和 Circle。子类提供合适的构造器,并重写 centerPoint 方法。...2、对象调用所在不存在的方法或成员,编译器会自动将对象进行隐式转换(根据类型)。 3、即:对象调用所在存在的方法或成员,编译器不会将对象进行隐式转换。

1.4K20

Scala

,也就是说构建的时候会自动生成一些语法糖,具有以下几个特点:   1、自动添加与名一致的构造函数(也就是伴生对象,通过apply方法实现),也就是说构造对象的时候不需要使用new关键字   2、样本类的参数默认是...特质未被实现的⽅方法默认就是抽象的⼦子类实现或继承统一使⽤用的事extends关键字,如果需要实现或继承多个使⽤用with关键字特质可以有构造器特质可以继承普通的,并且这个称为所有继承trait...还有一个lazy val(惰性val)声明,意思是需要计算使用,避免重复计算 11、 trait(特质)和abstract class(抽象)的区别?   ...Javanull是一个关键字,不是⼀个对象,开发者希望返回一个空对象,却返回了了⼀个关键字,为了解决这个问题,Scala建议开发者返回值是空值,使⽤Option类型,Scalanull是...(深⼊了解请参考问题Q14) 20、解释隐示参数的优先权   Scalaimplicit的功能很强大。编译器寻找implicits,如果不注意隐式参数的优先权,可能会引起意外的错误。

18030

Scala语言快速了解一下?

Nullnull引用对象的类型,它是每个引用(继承自AnyRef的)的子类Null不兼容值类型。变量 Scala 使用关键词 "var" 声明变量,使用关键词 "val" 声明常量。...因为只允许保护成员定义了该成员的的子类(继承)中被访问。而在java,用 protected关键字修饰的成员,除了定义了该成员的子类可以访问,同一个包里的其他也可以进行访问。...子类重写抽象方法,你不需要使用override关键字。Scala 使用 extends 关键字来继承一个,继承会继承父的所有属性和方法Scala 只允许继承一个父。...Point 称为父(基),Location 称为子类。override val xc 为重写了父的字段。Scala重写一个非抽象方法,必须用override修饰符。...子类继承特征可以实现未被实现方法。所以其实 Scala Trait(特征)更像 Java 的抽象

3K102

Scala变量和常用数据类型

由于String需要能隐式转换为StringOps,因此不需要任何额外的转换,String就可以使用这些方法。...三、Scala类型层次结构 java的除了原始类型的所有都有一个默认的父Object,那么scala的统一父是什么呢? Scala,所有的值都有类型,包括数值和函数。...1、Any、AnyVal、AnyFloat Any是所有类型的类型,也称为顶级 型。定义了一些通用的方法如equals、hashCode和toString。...Null是所有引用类型的子类型(即AnyRef的任意子类型)。它有一个单例值由关键字null所定义。Null主要是使得Scala满足和其他JVM语言的互操作性,但是几乎不应该在Scala代码中使用。...几乎可以用任何符号来方法命名。 Scala没有++、–操作符,需要通过+=、-=来实现同样的效果。

37110

Scala 【 8 面向对象编程 - 继承 】

override 和 super Scala ,如果子类要覆盖一个父中非抽象方法,则必须使用 override 关键字。 override 关键字可以帮助我们尽早地发现代码里的错误。...如果是父接收的参数,比如 name 和 age,子类接受,就不要用任何 val 或者 var 来修饰了,否则认为是子类要覆盖父的 field 。...如果在父的一些方法无法立即实现,需要依赖不同的子类来覆盖,重写实现自己不同的方法实现,此时可以将父的这些方法不给出具体的实现,只有方法签名,这种方法就是抽象方法。...如果有一个抽象方法,那么就必须用abstract 来声明为抽象,此时抽象是不可以实例化的。 子类覆盖抽象抽象方法,不需要使用 override 关键字。...抽象 field 意味着,scala 会根据自己的规则, var 或 val 类型的 field 生成对应的 getter 和 setter 方法,但是父是没有该 field 的。

36940

Scala trait特质 深入理解

均定义了相同签名的方法f,这里编译不通过,建议我们Bottom实现f方法。...换言之,混入的多个特质,分别定义了同名的方法,那么Scala会编译报错。...---- 继续Scala特质的讨论 上面的关于同名方法的报错曾提示我们,底层重写实现Bottom的f方法。这是办法之一。但是,我们还有另一种方式。...,而语法上我们无法向同一个添加连个签名完全一样的方法,故报错;解决方法就是我们的子类override这个f方法,重写覆盖,消除二选一。...还是上面那段带有AbTop的代码,这一次我们添加一个新的抽象AbNewTop,但是其中包含一个抽象方法其名称依然f,然我们修改Bottom的定义: abstract class AbNewTop

28120

大数据分析工程师面试集锦2-Scala

具有以下特性: (1)构造对象,不需要new; (2)的参数默认添加val关键字,即参数不能修改,如果需要的话也可以使用var; (3)默认实现了toString,equals,hashcode...Scala工程抽象和特质是很有用的工具,这个问题需要先回答什么是抽象以及什么是特质。...抽象普通的基础上增加了abstract关键字,无法对其进行实例化,它是用来被子类继承的,抽象可以只定义字段和方法,具体的值和实现在其子类实现子类也可以进行重写。...Scala的扩展只支持一个父,要想实现多重继承有两种方法: 1)多次扩展,假设4个A、B、C、D——D继承于C,C继承于B、B继承于A,那么D实例化后就可以使用A、B、C的变量和方法了,曲线实现了多重继承...调用该函数或方法,如果没有传该参数的值,Scala会尝试变量作用域中找到一个与指定类型相匹配的使用implicit修饰的对象,即隐式值,注入到函数参数函数体使用

2.1K20

Scala 基础 (六):面向对象(下篇)

如果父抽象,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象 重写非抽象方法需要用 override 修饰,重写抽象方法则可以不加 override 子类调用父方法使用 super...关键字 子类抽象属性进行实现,父抽象属性可以用 var 修饰; 子类对非抽象属性重写,父抽象属性只支持 val 类型,而不支持 var。...因为var修饰可变量,子类继承后可以直接使用修改,没有必要重写。...Scala底层对于伴生对象的apply方法进行了优化,调用时可以省略方法名,直接使用单例对象的名称+调用apply方法的参数 使用 new 关键字构建对象,调用的其实是的构造方法直接使用名构建对象...一个或者特征指定了自身类型的话,的对象和子类对象就会拥有这个自身类型的所有属性和方法。 是将一个或者特征插入到另一个或者特征,属性和方法都就像直接复制插入过来一样,能直接使用

47310

Scala教程之:面向对象的scala

Unified Types Scala,是没有java里面那些基础类型的,所有的Scala类型我们都可以称之为type,下面是一个类型层次结构的子集: ?...Null是所有引用类型的子类型,Null主要是用来跟JVM交互使用的,通常不需要在Scala使用。...Classes Classes就是,和java相似,里面可以包含方法、常量、变量、类型、对象、特质、等。 一个最简的的定义就是关键字class+标识符,名首字母应大写。...= new Point(2, 3) point1.x // 2 println(point1) // prints (2, 3) 和其他的编程语言不同的是,Scala构造器定义的签名:(...然后使用 override 关键字来实现trait里面的任何抽象成员: trait Iterator[A] { def hasNext: Boolean def next(): A } class

55120

02.Scala:面向对象、Object、抽象、内部类、特质Trait

1.1 创建和对象 用法 使用class来定义一个 使用new来创建对象 示例 创建一个Person,并创建的对象 步骤 创建一个scala项目,并创建一个Object 添加main方法 创建和对象...用法 定义var类型的成员变量,可以使用_来初始化成员变量 String => null Int => 0 Boolean => false Double => 0.0 … val类型的成员变量...10.1 定义语法 scala和Java一样,使用extends关键字来实现继承 可以子类定义父没有的字段和方法,或者重写父方法 和单例对象都可以从某个父继承 语法 class/object...override需要来重写父的成员,可以使用super来引用父 用法 子类要覆盖父的一个方法,必须要使用override关键字 使用override来重写一个val字段 使用super关键字来访问父的成员方法...一个继承另一个、以及多个trait,创建该类的实例的构造顺序如下: 执行父的构造器 从左到右依次执行trait的构造器 如果trait有父trait,先构造父trait,如果多个trait

1.1K10
领券