Scala学习——面向对象
Scala面向对象
三大特征:封装、继承、多态
1、类的定义和使用
package top.ruandb.scala.Course02
object Simple {
def main(args: Array[String]): Unit = {
val person = new People;
person.name="张三"
println(person.name +" "+ person.age)
person.eat("香蕉")
person.printInfo()
}
//类的定义
class People(){
//定义属性
var name:String = _
val age = 18
//私有属性
private[this] val gender= "male"
//定义方法
def eat(food:String): Unit ={
println(name + "正在吃" + food)
}
def printInfo(): Unit ={
println("gender:"+gender)
}
}
}
2、构造器
package top.ruandb.scala.Course02
object Constructor {
def main(args: Array[String]): Unit = {
//使用主构造器
val person1 = new People("张三",18);
println(person1.name + " " + person1.age + " " + person1.gender )
//使用附属构造器
val person2 = new People("李四",22,"male")
println(person2.name + " " + person2.age + " " + person2.gender )
}
//主构造器
class People(val name:String,val age:Int){
var gender:String = _
//附属构造器
def this(name: String,age:Int,gender:String){
this(name,age)//附属构造器必须首先调用主构造器或者其他附属构造器
this.gender = gender
};
}
}
3、继承 extends
package top.ruandb.scala.Course02
import top.ruandb.scala.Course02.Constructor.People
object Constructor {
def main(args: Array[String]): Unit = {
val student = new Student("王五",89,"通信工程")
println(student.name + " " + student.age + " " + student.major)
println(student.toString)
}
//主构造器
class People(val name:String,val age:Int){
var gender:String = _
val height:Float = 1.73f
def this(name: String,age:Int,gender:String){
this(name,age)
this.gender = gender
};
}
//Student类继承People类
class Student (name:String,age:Int,var major:String) extends People(name,age){
//重写属性
override val height =1.65f
//重写toString方法
override def toString: String = "name:" + name +" "+ "age:" + age + " " + "major:" + major
}
}
4、抽象类
/**
* 抽象类,只有方法定义,没有方法实现
* 属性也只有定义
*/
abstract class People1{
var name:String
var age:Int
def eat(food:String)
def speak
}
/**
* 继承抽象类,重写方法和属性
*/
class Person1 extends People1{
override var name: String = "赵六"
override var age: Int = 100
override def eat(food: String): Unit = println("吃"+food)
override def speak: Unit ={
println("大声说话")
}
}
5、伴生类和伴生对象
如果有一个Class,还有一个与Class同名的Object
那么就称这个Object是Class的伴生对象,Class是Object的伴生类,其中伴生对象是一个单例对象
伴生对象和伴生类可以互相访问其私有成员
package top.ruandb.scala.Course03 object Companion { def main(args: Array[String]): Unit = { for( i <- 1.to(10)){ TestCompanion.incr } println(TestCompanion.count)//结果为10,说明伴生对象是一个单例对象 } } /** * 伴生类和伴生对象 * class TestCompanion是伴生对象Object TestCompanion的伴生类 * object TestCompanion是伴生类class TestCompanion的伴生对象 */ //伴生类 class TestCompanion{ } //伴生对象 object TestCompanion{ var count = 0 def incr ={ count += 1 } }
6、scala apply
package top.ruandb.scala.Course03
object ApplyApp {
def main(args: Array[String]): Unit = {
val at1 = ApplyTest()//实际是通过伴生对象apply方法进行了对象实例化,避免了手动new对象
}
}
class ApplyTest{
}
object ApplyTest{
def apply() = {
println("object apply function")
new ApplyTest
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具