class A(id:String,name:String){
val _id:String = id
val _name:String = name
override def toString = s"A(_id=${_id},_name=${_name})"
def printAB():Unit = {
println("这是A的方法")
}
}
//B继承A
//在scala中,继承的时候就需要给定A的参数,参数值是B的参数列表里面的参数值
class B(id:String,name:String,age:Int) extends A(id,name){
val _age:Int = age
override def toString = s"A(_id=${_id},_name=${_name},_age=${_age})"
override def printAB():Unit = {
println("这是B的方法")
}
}
object demo4{
def main(args: Array[String]): Unit = {
val stu1:A = new A("001", "zhang")
val stu2:B = new B("002", "chen", 12)
println(stu1)
println(stu2)
stu1.printAB()
stu2.printAB()
}
}
scala中同样有多态的体现,即父类引用指向子类对象
class A(id:String,name:String){
val _id:String = id
val _name:String = name
override def toString = s"A(_id=${_id},_name=${_name})"
}
//B继承A
class B(id:String,name:String,age:Int) extends A(id,name){
val _age:Int = age
override def toString = s"A(_id=${_id},_name=${_name},_age=${_age})"
}
object demo4{
//方法里面定义的是参数是父类的对象,调用时传入父类对象或其子类对象都可以
//这是多态的一种体现,父类引用指向了子类对象
def printTest(a:A):Unit = {
println("父类对象或者其子类对象")
a.printAB()
}
def main(args: Array[String]): Unit = {
val stu1:A = new A("001", "zhang")
val stu2:B = new B("002", "chen", 12)
printTest(stu1)
printTest(stu2)
}
}
样例类
虽然上面说了一大堆,但是实际使用的时候,还是使用样例类比较多 新建一个 case Class 文件,如果idea没有这个选项,直接创建一个 .scala 文件也行,下面就是 .scala文件的代码
//样例类,通过这种方式定义一个类,然后根据这个类来创建对象
//一般都使用样例类来创建对象,不会使用继承,重写之类的
case class demo5case(id:String
,name:String
,age:Int
,gender:String
,clazz:String)
然后在main方法 new 出来这个类的对象
import java.io.{BufferedReader, FileWriter}
import scala.io.{BufferedSource, Source}
object demo6 {
def main(args: Array[String]): Unit = {
val stu3: demo5case = new demo5case("003", "wang", 15, "女", "文科一班")
println(stu3)
}
}
实际上,这里的 new 是可以省略的
反编译样例类的 .class 文件
通过反编译器可以将 .class 反编译,这时就可以发现上面创建的样例类,里面的 id,name等变量都是被 private final 修饰的。而且下面会被隐式的加上许多方法,比如 get 方法等,但因为这里都是final修饰的变量,所以没有能够修改变量的方法
因此,如果希望样例类里面定义的变量可以被修改,就需要加上var。此时再创建一次对象,然后再次反编译,之后就会发现 id 变量前面只被 private 修饰了
case class demo5case(
var id:String
,name:String)
通过这个方法,修改变量的值
val stu3: demo5case = new demo5case("003", "wang", 15, "女", "文科一班")
println(stu3)
stu3.id = "004"
println(stu3)
回归正题,为什么创建对象时,可以去掉 new 关键字 反编译后,会发现这个方法也被自动添加到样例类的 .class 文件中