创建使用类
(1)基本语法
[修饰符] class 类名 {
类体
}
说明
(1)Scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
(2)一个Scala源文件可以包含多个类
Java和Scala对比
java中类: public(文件名和类名一致) 和 默认
scala默认的getter和setter不满足标准的javaBean规范
getAge() setAge(…)
需要注解, 然后scala会自动的生产标准的getter和setter
类的属性
属性赋值
属性是类的一个组成部分
1)基本语法
[修饰符] var 属性名称 [:类型] = 属性值
注:Bean属性(@BeanPropetry),可以自动生成规范的setXxx/getXxx方法
object ObjDemo1 {
def main(args: Array[String]): Unit = {
val user = new User()
println(user.age)
//赋值为200
user.age = 200
println(user.age)
//赋值为100,正常人是不会用这个的.
user.age_$eq(100) //user.age_$eq(100) 等价于 user.age = 100
println(user.age)
}
}
class User {
// 定义属性:和定义普通的变量完全一样
@BeanProperty var age = 10 // 生成类似Java的标准的get set 方法的注解
private var name = "lisi"
@BeanProperty val country = "china"
private var a1 = 100 // 私有
// 给类定义方法
def eat() = {
println("eat:" + name)
}
}
初始化赋值
类的属性, 在scala中也可以让虚拟机自动给初始化值
var age:Int = _
初始化的值分3种:
1. 数字型 0
2. boolean false
3. 其他所有类型: null
object Obj2 {
def main(args: Array[String]): Unit = {
val user = new User1
println(user.age) // 0
println(user.name) // null
println(user.flag) //false
}
}
class User1 {
var age: Int = _
var name: String = _
var flag: Boolean = _
}
输出:
0
null
false
类的构造器
和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。
Scala类的构造器包括:主构造器和辅助构造器
基本语法
class 类名(形参列表) { // 主构造器
// 类体
def this(形参列表) { // 辅助构造器
}
def this(形参列表) { //辅助构造器可以有多个…
}
}
主构造器初始化赋值
- 调用构造器创建对象的时候, 可以给属性赋值
- 类名的后面添加需要的一些属性, 这些在创建对象的时候, 可以给这些属性赋值
- 类名后面根的其实就是构造器. 这个就是主构造器. 一个类只能有一个主构造器.
- 如果类后面没写入参的话,那么就是无参的构造器.
构造参数如果没有被var 或者val修饰的话,那么这个参数就是私有的参数,如果类的内部没有方法使用的话,那么这个私有参数就会在编译的时候被Scala优化掉了.
object Obj3 {
def main(args: Array[String]): Unit = {
val user = new User3(10, "张三", "男")
println(user.age)
// println(user.sex) // sex没有被var和val修饰,所以就是私有的
println(user.name)
}
}
// sex 没有被val和var修饰,那么就是私有的属性了,无法取出来
class User3(val age: Int, var name: String, sex: String) {
}
输出
10
张三
辅助构造器
你可以理解为构造器的重载,辅助构造器的首行必须是调用主构造器.
语法:def this(){<br /> // 首行必须是调用主构造器
}
object Obj3 {
def main(args: Array[String]): Unit = {
val user = new User3() //调用了辅助构造器
println(user.age)
// println(user.sex) // sex没有被var和val修饰,所以就是私有的
println(user.name)
}
}
class User3(val age: Int, var name: String, sex: String) {
// 这种构造器: 辅构造器
def this() {
// 首行必须是调用主构造器
this(10, "abc", "male")
}
}
输出:
10
abc
定义多个辅助构造器
- 后面的辅构造可以调用前面的, 前面的不能调用后面的.
- 辅构造的参数, 仅仅是一个只能在当前的这个辅构造内的使用的普普通的一个常量
class User3(val age: Int, var name: String, sex: String) {
// 这种构造器: 辅构造器
def this() {
// 首行必须是调用主构造器
this(10, "abc", "male")
}
/*第二个辅助构造器,
参数c只能在当前辅助构造器里面使用,不能在主方法里面使用.
*/
def this(c: Int) {
this() // 可以调用第一个辅助构造器
// this(c, "abc", "male") // 构造器内调用主构造器
println(c)
}
}
构造器参数
说明:
(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。
1)说明
Scala类的主构造器函数的形参包括三种类型:未用任何修饰、var修饰、val修饰
(1)未用任何修饰符修饰,这个参数就是一个局部变量
(2)var修饰参数,作为类的成员属性使用,可以修改
(3)val修饰参数,作为类只读属性使用,不能修改
类别名
如果原来的类名起的不太好(类名太长或者类名太烂),但是又不能改类名(别人写的类名你不能私自改),那么就可以取别名
给类取别名用type
object Obj3 {
def main(args: Array[String]): Unit = {
//给类取别名
type U = User3
val u = new U(10, "zhangsan", "男")
println(u.age)
println(u.getClass.getName) //获取原来的类名
println(u.name)
}
}
class User3(val age: Int, var name: String, sex: String) {
}
输出:
10
obj.User3
zhangsan