scala面向对象
类
类的定义以及构建
类的定义:
- 关键字:class
- 普通的类,通过new来构建类的实例
- 全局多例的:在一个程序中可以构建多个实例
成员属性的定义
- 直接在类的内部声明每个成员属性,可以为var类型也可以为val类型
- 注意:Scala中会自动为每个成员属性构建getter and setter方法,不用自己申明
- var有get and set
- val只有get,因为val不可变
成员方法的定义
- 与Java中定义普通的方法时一致的
- 只需要根据语法定义即可
实现:
/**
* @ClassName Person
* @Description TODO 构建一个Scala Class,定义成员属性和成员方法
* @Date 2021/4/12 9:26
* @Create By Frank
*/
class Person {
//定义成员属性
var name:String = "itcast"
var age:Int = 20
var gender:String = _
val country:String = "China"
//定义成员方法
def sayWhat() = println("What the hell ?")
}
Object类的设计
JVM中类运行的规则
-
从类的main方法开始运行
-
如果一个方法要被调用:必须通过类进行调用
-
普通类调用方法:new Class().method
-
静态的调用:Class.method
-
Java中怎么实现main方法的运行
public static void main(String[] args) 当类被加载时,静态的方法也会被加载,所以可以直接从main方法开始运行
Scala中Object的设计
- Scala中一种特殊的类
- 全局只有唯一实例:单例类
- Object中定义所有属性和方法都是类似于静态的属性和方法
- main方法是程序运行的入口,必须被定义在object类中的
实现
/**
* @ClassName Person
* @Description TODO 构建一个Scala Class,定义成员属性和成员方法
* @Date 2021/4/12 9:26
* @Create By Frank
*/
class Person {
//定义成员属性
var name:String = "itcast"
var age:Int = 20
var gender:String = _
val country:String = "China"
//定义成员方法
def sayWhat() = println("What the hell ?")
}
object TestPerson{
def main(args: Array[String]): Unit = {
//构建Person类的实例
val person = new Person
//给属性赋值
person.gender = "male"
//调用对象的属性
println(person.name+"\t"+person.gender+"\t"+person.country)
//调用对象的方法
person.sayWhat()
}
}
访问修饰符
修饰符类型
- public:所有类都可以看见
- protected:子类可见
- privite:自己可见
Scala中的规则
- 如果不显示的指定修饰符,默认所有的都为public
- 可以自己显示指定权限修饰符
修饰符的使用规则
修饰符 / 修饰符[访问域]
实现
/**
* @ClassName Dog
* @Description TODO 实现权限的测试,指定修饰符和修饰符的作用域
* @Date 2021/4/12 10:38
* @Create By Frank
*/
class Dog {
//属性
var name:String = "wangcai"
private[this] val age:Int = 20
//方法
private[cn] def sayHello () = println("旺旺 ~ ")
}
object TestDog{
def main(args: Array[String]): Unit = {
val dog = new Dog
//访问属性
// println(dog.name+"\t"+dog.age)
//访问方法
dog.sayHello()
}
伴生对象
伴生关系的定义
- 如果在一个Scala文件中,有一个Class和一个Object同名,那么这个Class和这个Object就互为伴生关系
- 称这个Class为这个Object的伴生类
- 称这个Object为这个Class的伴生对象
伴生关系的特点
- 可以彼此访问各自的私有域
实现
class Cat {
private var name:String = "Tom"
var country:String = "China"
private def sayHello() = println("Hello ~")
def eatFish() = println("eating ………")
}
object TestCat{
def main(args: Array[String]): Unit = {
val cat = new Cat
println(cat.name + "\t"+cat.country)
cat.eatFish()
cat.sayHello()
}
}
//伴生对象访问类的私有属性
/**
* @ClassName Cat
* @Description TODO 测试伴生关系
* @Date 2021/4/12 10:50
* @Create By Frank
*/
class Cat {
private var name:String = "Tom"
var country:String = "China"
private def sayHello() = println("Hello ~")
def eatFish() = println(s"eating ${Cat.fishName}………")
}
object Cat{
private var fishName:String = "shark"
def main(args: Array[String]): Unit = {
val cat = new Cat
println(cat.name + "\t"+cat.country)
cat.eatFish()
cat.sayHello()
}
}