scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下

编程入门 行业动态 更新时间:2024-10-27 22:33:42

scala trait ,abstract class,case class,class 的一些<a href=https://www.elefans.com/category/jswz/34/1706235.html style=琐碎注意事项,仅针对3.0以下"/>

scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下

构造函数

  • 主构造函数如果不加val 和var ,只是构造传参而已,不属于类变量
class Demo(name: String)➜  sbt_demo javap -p Demo         
Compiled from "Demo.scala"
public class Demo {public Demo(java.lang.String);
}
  • 加了var 和val类型的主构造变量会升级为私有变量。同时生成一个公开的访问方法。而且val 的变量是final,var不是。
class Demo(name: String, var age: Int, val home: String)➜  sbt_demo javap -p Demo*
Compiled from "Demo.scala"
public class Demo {private int age;public int age();public void age_$eq(int);private final java.lang.String home;public java.lang.String home();public Demo(java.lang.String, int, java.lang.String);
}
  • 成员变量写在主构造方法里和类里面在可见性和可变性上没有区别,唯一的区别在于构造函数
class Demo(name: String) {var age: Int = 0val home: String = "ok"
}➜  sbt_demo javap -p  Demo*
Compiled from "Demo.scala"
public class Demo {private int age;public int age();public void age_$eq(int);private final java.lang.String home;public java.lang.String home();public Demo(java.lang.String);
}

trait

  • trait不能有构造函数
trait people(name:String)  // error
trait people(val name:String) // error
trait people(var name:String) // error
trait people{name:String} // error
trait people{val name:String} // right
trait people{var name:String} // right

trait的继承

  • 普通的类继承trait,主构造函数不能作为接口的实现.但是抽象类和样例类可以
  • var 类型的变量可以被 val类型的变量覆盖。反之不行
trait people {val name: Stringvar age: Int
}case class son(name: String, age: Int) extends people // right
abstract class son(name: String, age: Int) extends people // right
class son(name: String, age: Int) extends people // error
class son(val name: String, var age: Int) extends people // right
class son(val name: String, val age: Int) extends people // right
class son(var name: String, val age: Int) extends people // error

abstract class

  • 样例类,抽象类,普通类继承抽象类,抽象类的主构造函数可以被覆盖
abstract class people(home: String) {val name: Stringvar age: Int
}case class son(name: String, age: Int, home: String) extends people(home) // right
abstract class son(name: String, age: Int, home: String) extends people(home) // right
class son(val name: String, var age: Int, home: String) extends people(home) // right
  • 只有样例类覆盖后,才能对外可见.其他的可见性,继承者和被继承着保持一致
abstract class people(var home: String) {val name: Stringvar age: Int
}case class son(name: String, age: Int, override var home: String) extends people(home) // right
abstract class son(name: String, age: Int, home: String) extends people(home) // right
class son(val name: String, var age: Int, home: String) extends people(home) // right

更多推荐

scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下

本文发布于:2023-07-03 16:26:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1008935.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:琐碎   注意事项   abstract   trait   scala

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!