Scala基础之类(伴生对象,半生类)
类基本语法:Scala中一个源文件中可以声明多个公共类
// 声明类:访问权限 class 类名 { 类主体内容 }
class User {
// 类的主体内容
}
// 对象:new 类名(参数列表)
new User()
类的属性 :在编译时,编译器会将变量编译为类的(私有的)属性,同时提供了属性对应的set,get方法
class User {
var name : String = _ // 类属性其实就是类变量
var age : Int = _ // 下划线表示类的属性默认初始化
}
// 给类的属性赋值,等同于调用对象属性的set方法
//user.name = "AsianHarden"
// 访问类的属性时,等同于调用对象属性的get方法
//println(user.name)
//scala中给属性提供的set,get方法不遵循bean规范
//@BeanProperty var email : String = _
访问权限:java&scala对比
java :
1. private => 本类
2. (default) => 本类,本包
3 protected => 本类,本包,子类
4. public => 任意
scala :
1. private => 同类
2. private[包名] => 同包,包私有
3. protected => 受保护的, 同类,子类,没有同包
4. (default) => 什么都不写就是公共的。没有public关键字
private val name1:String = "AsianHarden"
private[package_name] val name2:String = "AsianHarden"
protected val name3:String = "AsianHarden"
val name4:String = "AsianHarden"
访问权限的疑问
public class Test{
public static void main(String[] args) throws Exception {
// 访问权限 ,调用者和方法的提供者之间的关系
// 方法的提供者 =>AA
// 方法的调用者 =>Test
// 点不是调用的意思,点的含义就是"的",从属关系
AA aa = new AA();
aa.clone();
}
}
class AA {
//1 @Override
// 2 protected Object clone() throws CloneNotSupportedException {
// 3 return super.clone();
}
}
//123注释掉后,aa.clone()报错,Test的object没用权限访问到AA的object,Test,AA的Object是彼此独立的
类的对象
val | var 对象名 [:类型] = new 类型() var user : User = new User()
类的构造方法
- 1.主动构造函数
- 2.辅助构造函数
class User() { // 主构造函数
var username : String = _
def this( name:String ) { // 辅助构造函数,使用this关键字声明
this() // 辅助构造函数应该直接或间接调用主构造函数
username = name
}
def this( name:String, password:String ) {
this(name) // 构造器调用其他另外的构造器,要求被调用构造器必须提前声明
}
}
1)辅助构造方法在执行之前,应该首先调用主构造方法完成类的初始化 2)辅助构造方法可以重载的,并且可以互相调用,但是调用的辅助构造方法应该提前声明(位置关系)
- 参数声明为val & var 区别
参数声明为val
如果构造函数参数声明为val,Scala只为它生成一个getter方法。
参数声明为var
如果构造函数参数声明为var,Scala将生成访问器和mutator方法。
//定义一个类,参数不可变
class Book( val title:String)
//调用只能调用getter 方法 无法调用setter方法
object Main {
def main(args: Array[String]) {
class Book( val title:String)
val book = new Book("Scala")
println(book)
println(book.title )
//book.title = "new title" //Error
}
}
//定义一个类,参数可变
class Book( var title:String)
//Scala将生成访问器和mutator方法。
object Main {
def main(args: Array[String]) {
class Book( var title:String)
val book = new Book("Beginning Scala")
book.title = "new title"
println(book.title )
}
}
- 构造方法私有化
构造方法私有化: 在参数列表前增加private关键字
class Person private () {
}
scala类java静态语法,私有化实现
1)scala中没有静态语法,但是可以直接使用java中的静态操作 2)scala采用了一种特殊的处理方式来代替静态语法 :object 3)object关键字可以用于创建对象,对象的名字就是声明的名字,object关键字声明的类和对象有关系的。 这个对象等同于伴随着这个类创建时所产生的,所以将这个对象称之为:伴生对象 这个类称之为伴生类 伴生对象就是一个对象,可以访问伴生类中的所有东西,包括私有的。 伴生对象其实就是马丁模拟静态语法所产生的。 一般写代码时,将静态语法操作的代码写在伴生对象中,将成员方法或属性写在伴生类中
//构造方法私有化导致new Person()报错,所以需要构建一个对象来创建Person类 //半生类 class Person private (){ println("class Person") } // 伴生对象,与半生类同名 类java的静态方法调用使用 object Person{ def getInstance(): Person ={ new Person() } } } Person.getInstance() // val person = new Person() 报错
TODO scala中伴生对象就是单例的
伴生对象只需要声明即可,无需构建,所以不需要构造参数列表
单例模式存在一个问题:创建的对象不会被回收,需要显示地回收(设置为null)
// 如果伴生对象中构建对象的方法名成为apply,编译器可以自动识别的,所以这个方法名可以省略的
val test1: Test = Test.apply()
val test1 = new Test() // 调用类的构造方法
val test2 = Test() // 调用的是伴生对象的apply方法
val test3 = Test // 伴生对象本体
class Test() {
println("ttttt")
}
object Test {
def apply() = {
println("apply") //打印apply。证明走的是伴生对象的apply()
//new Test()
}
}
本文为原创文章,转载请标明出处

浙公网安备 33010602011771号