scala中的class文件:
在class文件中创建的main方法是一个普通的方法
需要在object创建main方法才能run
使用val定义变量和不能用_赋值
private 修饰的参数在编译后自动生成private的 get和set方法
public 修饰的属性编译后自动生成public的 get和set方法
val修饰的属性只会生成get方法
使用private[this]修饰的属性,在class文件中不会生成get和set方法
private[this] var name:String = _
//使用java风格的get和set方法
import scala.beans.BeanProperty
@BeanProperty var like:String=_
scala中的构造器&java中的构造方法
主构造器 构造方法 在类名后加上参数 创建在类名上面的为主构造器
在只有主构造器时,不能new无参构造方法
辅助构造器:当主构造器不能满足需求的时候
class MyClass02(var name:String,var age:Int) {
/**
* 定义辅助构造器
* 1.方法名为this
* 2.第一行必须调用另一个构造器,不能存在环形关系
*
*/
def this(name:String){
this(name,10)
}
def this(){
this("baba",30)
}
def m01()={
println(name)
}
}
scala中没有静态属性和静态方法
scala中object编译后产生的都是静态方法和属性
为什么在class当中创建的main函数无法运行:
因为main函数在JVM当中运行时必须是静态的才行
对象-伴生对象
如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
伴生类和伴生对象必须放在同一个.scala文件之中
伴生类和伴生对象,最大的特点就在于,互相可以访问private属性
伴生对象可以调用伴生类中的私有属性
对象-apply方法
object中非常重要的一个特殊方法,通过在伴生对象中实现apply方法,并在其中实现构造伴生类的对象功能
而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式地调用伴生对象的apply方法。这样会让对象创建更加简洁
apply方法可以重写
可以让使用者直接使用对象,但在apply方法中,是需要去实例化类的
def apply(): myObject_ Class01 = new myObject_Class01()
def apply(hobby:String): myObject_Class01 = new myObject_Class01(hobby:String)
继承
继承采用的关键字与java相同
继承父类的属性可以进行修改
final修饰的类不能被继承
scala对方法的重写需要加上override关键字
如果父类属性被private修饰,则继承子类可以创建重名属性
抽象类abstract
没有方法体的方法为抽象方法
子类继承抽象类,那么必须重写抽象方法,除非子类也是抽象类
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
可以有抽象方法和普通方法:
//抽象方法
def method01()
//普通方法
def method02(): Unit = {println(“00000000000000000”)}
使用extends将trait和class关联,并可实现多继承,当使用多个trait继承时使用with进行连接
如果两个trait当中有同名的抽象方法的话,因为抽象方法没能方法体,我们是不用管到底用的是那一个trait当中的方法
但是,如果两个trait当中有一样的普通方法的话,那怎么怎么处理?
在启动的时候,会报错,因为他不知道到底调用哪一个方法,怎么处理?
如果多个Trait当中有同名的方法的话,在子类当中必须进行重写
下划线:_ 的使用:
1.导包的时候可以使用相当于 "*"
2.在遍历的时候可以使用 arr03.foreach(println(_))
3.将函数复制给变量时,转换高阶函数时
var a: String => Unit = method01 _ //为一个函数变量
4.如果参数在函数体中只使用一次,可以直接使用_代替
当参数有多个时,使用_时,第一次出现_时表示第一个参数,第二次出现_时表示第二个参数
var x=1 to 10
x.foreach((data:Int)=>println(data))
x.foreach((data)=>println(data))
x.foreach(data=>println(data))
x.foreach(println(_))