Scala包对象
类的定义:
Scala类的定义和Java基本一致,均是通过class来定义一个类,但是Scala没有public关键字,即每个定义的类默认都是public,且一个.scala文件中可以有多个public类.
方法和属性访问权限和java区别
1、Scala中默认的访问权限是public 但是Scala中没有public关键字
2、protected为受保护权限,Scala中protected比Java更严格,同类和子类可以访问,同包则不可以访问
3、private[包名]可以增加访问权限,改包下的其他类也可以使用
重写父类方法
在子类中方法重定义的前面增加override即可
创建对象
通过new关键字创建一个对象,如果创建的对象没有构造参数,可以省略小括号
构造器
1、主构造器
主构造器在类名后面,类体之前增加一个形参列表,作为主构造器
//注意这里必须加上var 或 val,代表name和age作为类属性,如果不加则只是形参
class Student(var name:String,var age:Int){ //主构造器
def say():Unit={
print(s"我叫${name},今年${age}岁")
}
}
//测试
object HelloScala {
def main(args: Array[String]): Unit = {
var student=new Student("小白",18)
student.say()
}
}
结果:
2、辅助构造器
辅助构造器必须直接或者间接调用主构造器。
辅助构造器名称必须是this,且辅助构造器可以有多个,辅助构造器之间通过参数类型和个数来区分。
辅助构造器不能直接创建对象,其实质上是直接或间接调用了主构造器方法构造对象。
构造器调用其他构造器,被调用者必须提前声明
class Student(){ //主构造器
var name:String= _
var age:Int= _
//辅助构造器
def this(name:String)={
//必须先通过主构造器创建对象
this()
//然后才是辅助构造器对这个对象自身的操作
this.name=name
this.age=1000
}
def say():Unit={
print(s"我叫${this.name},今年${this.age}岁")
}
}
//测试
object HelloScala {
def main(args: Array[String]): Unit = {
//这里调用了辅助构造器,然后辅助构造器先调用主构造器,自己另外进行修改
var student=new Student("小白")
student.say()
}
}
Scala抽象类的继承和重写
abstract class ss {
var s: String="小白"
val a:Int=18
def test():Unit
}
//测试
object HelloScala {
def main(args: Array[String]): Unit = {
var s1=new ss {
//s由于在抽象类中不是抽象属性,且用var修饰,所以在这里不可以重写,只能直接赋值
s = "小白1号"
//a在抽象类中不是抽象属性,但他是val修饰,所以要改变值的话必须重写
override val a=18
override def test(): Unit = print(s+"今年"+a+"岁了")
}
s1.test()
}
}
伴生对象(单例对象)
class修饰的是类,object修饰的是单例对象!由于class类中没有static关键字,即没有静态方法属性,所以为了与Java交互,Object对象内存储的方法和属性全部默认相当于Static,这也是为什么main方法不能写在class类中,而必须写在object对象中的原因了。单例对象对应的类叫做伴生类
//单例对象的定义
object Person {
//定义属性和方法
//main方法也只能在单例对象中定义
}
伴生类和伴生对象应在同一个文件夹内
伴生对象测试
object test {
def main(args: Array[String]): Unit = {
var student= new Student("小白",18)
student.info()
}
}
//伴生类
class Student(var name:String,var age:Int){
def info():Unit={
print(s"${this.name}今年${this.age}岁了,就读于${Student.school}")
}
}
//伴生对象
object Student{
var school:String="北京大学"
}
Scala单例模式
object test {
def main(args: Array[String]): Unit = {
var student=Student.getInstance()
student.info()
}
}
class Student private (var name:String,var age:Int){
def info():Unit={
print(s"${this.name}今年${this.age}岁了,就读于${Student.school}")
}
}
object Student{
var school:String="北京大学"
private val student:Student=new Student("小白",18)
def getInstance():Student=student
}