问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

scala面向对象编程之类与对象

发布网友 发布时间:2024-09-26 05:18

我来回答

1个回答

热心网友 时间:2024-11-09 05:52

一、类1、类的定义

scala是支持面向对象的,也有类和对象的概念。

示例:定义一个User类,并添加成员变量/成员方法,创建一个Main object,添加一个main方法,并创建Customer类的对象,并给对象赋值,打印对象中的成员,调用成员方法

class?User?{??var?name:String?=?_??var?sex:String?=?_??val?registerDate:Date?=?new?Date??def?sayHello(msg:String)?=?{????println(msg)??}}object?Main?{??def?main(args:?Array[String]):?Unit?=?{????val?user?=?new?User????//给对象的成员变量赋值????user.name?=?"张三"????user.sex?=?"男"????println(s"姓名:?${user.name},?性别:${user.sex},?注册时间:?${user.registerDate}")????//对象调用方法??????user.sayHi("你好!")??}}

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

var name:String = ?_ 表示使用默认值进行初始化 ?例如:String类型默认值是null,Int类型默认值是0,Boolean类型默认值是false

val变量不能使用 _ 来进行初始化,因为val是不可变的,所以必须手动指定一个默认值

main方法必须要放在一个scala的object(单例对象)中才能执行

2、类的构造器

主构造器 主构造器是指在类名后面的()里跟上一系列参数

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

辅助构造器 在类中使用this来定义

def?this(参数名:类型,?参数名:类型)?{??//?第一行代码必须是调用主构造器、其他辅助构造器、super父类的构造器??...}

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

例子:

class?User(val?name:String,?var?age:Int)?{val?address:String?=?"hangzhou"//定义一个参数的辅助构造器def?this(name:String)?{??this(name,?35)}def?this(age:Int)?{??this("张三",?age)}

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

}

object Main { def main(args: Array[String]): Unit = { val user1 = new User("李四") val user2 = new User("王五", 20)

println(s"姓名:?${user1.name},?年龄:${user1.age}")println(s"姓名:?${user2.name},?年龄:${user2.age}")

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

} }

####?二、对象#####?1、scala中的objectscala中是没有Java中的静态成员的。如果需要用到static变量、static方法,就要用到scala中的单例对象object,定义单例对象和定义类很像,就是把class换成object。示例:定义一个工具类,用来格式化日期时间

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

import java.text.SimpleDateFormat import java.util.Date

object DateUtils {

// 在object中定义的成员变量,相当于Java中定义一个静态变量 // 定义一个SimpleDateFormat日期时间格式化对象 val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

// 相当于Java中定义一个静态方法 def format(date:Date) = simpleDateFormat.format(date)

// main是一个静态方法,所以必须要写在object中 def main(args: Array[String]): Unit = { println(DateUtils.format(new Date())) }

}

*?工具类或者存放常量可以使用?object?定义一个单例对象*?在单例对象中定义的变量,类似于Java中的static成员变量。访问单例对象的成员变量也是使用单例对象名.变量名?*?在单例对象中定义的方法,类似于Java中的static方法;调用单例对象的方法,直接使用单例对象名.方法名*?object单例对象的构造代码可以直接写在花括号中?*?单例对象只能有一个无参的主构造器,不能添加其他参数,即没有(参数)#####?2、scala中的伴生对象在同一个scala文件,有一个class和object具有同样的名字,那么就称这个object是class的伴生对象,class是object的伴生类;伴生类和伴生对象的最大特点是,可以相互访问。示例:

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

class Person { private var name = "李四"

def printName(): Unit ={ //在Person类中可以访问伴生对象Person的私有属性 println(Person.CONSTANT + name) } }

object Person { //伴生对象的私有属性 private val CONSTANT = "hello!"

def main(args: Array[String]): Unit = { val p = new Person

//使用创建的对象访问私有字段p.name?=?"张三"p.printName()

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

} }

*?伴生类和伴生对象的名字必须是一样的?*?伴生类和伴生对象需要在一个scala源文件中?*?伴生类和伴生对象可以互相访问private的属性#####?3、scala中object的apply方法先来看一个之前经常使用的例子,使用如下方式来创建一个Array对象。

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

val a = Array(1, 2, 3, 4)

其实它是这样实现的

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

class Array -> object Array{ ?def apply = Array对象}

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}0

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

class Customer(var name:String, var age:Int) {

def getString: String = { s"Customer($name, $age)" } }

object Customer {

// 实现apply方法 // 返回的是伴生类的对象 def apply(name:String, age:Int): Customer = new Customer(name, age)

// 同时apply方法也支持重载 def apply(name:String):Customer = new Customer(name, 20)

def apply(age:Int):Customer = new Customer("张三", age)

def apply():Customer = new Customer("王五", 20)

}

object Exec { def main(args: Array[String]): Unit = { val p1 = new Customer("赵六", 20) val p2 = Customer("李四") val p3 = Customer(35) val p4 = Customer()

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}1

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

} }

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}2

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

object Exec{ def main(args:Array[String]) = { println("hello!") } }

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}3

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

object Exec extends App { println("hello!") }

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

class?类名(var/val?参数名:类型[?=?默认值],?var/val?参数名:类型[?=?默认值]){??//?构造代码块}4

原文:https://juejin.cn/post/7096749690372227086

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
门?049期父母欲其改娶五字金口决,开是什么特号生肖 支付宝怎么把银行卡的钱转到余额里呢? 下载wampserver5,安装并启动后不能启用apache、mysql的功能,请问这是怎... wampserver安装多个版本phpmysqlapache 四季豆有哪些吃法值得推荐? 四季豆牛肉馅饼的家常做法是什么? 香煎四季豆豆腐饼怎么做好吃 腾讯会议没声音怎么修复-腾讯会议没有声音修复办法 西安市高新区所有幼儿园 西安高新第二初级中学学区有哪些小区 scala中关于logger中方法参数def logInfo(msg: => String)的疑问_百度... 细菌性阴炎治疗的方法 梦见自己家放子漏雨的预兆 怎么治疗滴虫阴道炎 成都是怎么形成的阴道炎呢? 细菌性阴道炎用什么药好得快 非特异性阴道炎预防治疗 宝马1系启动后转速二千一下降到1千多是怎么回事? 葱白香菇粥葱白香菇粥的做法: 肥牛怎么造句 肥牛什锦大酱汤操作 肥牛什锦锅怎么做 报名四川小自考要注意哪些事情? 445除以90的除法算式? 数学1.3x3.8=4.94用竖式计算怎么算 四川2024自考怎么报名注册 485÷98用竖式计算.急需要的急嘛。 4.94÷1.3等于多少竖式计算? 9.8x0.5竖式计算? 什么才是真正的爱情,你理想中的恋爱? Scala教程之-Option-Some-None 鑫鹏是什么意思? 请大师八字查看鑫鹏好不好 段鑫鹏这个名字好吗? Scala学习笔记03_数组 Scala入门指引 【scala原理系列】scala ArrayOps原理用法示例源码详解 78年属马女2024年全年运势 2024年78年属马女的运势 78年属马女2024年事业运势 猫毛剃光多久长出来 梦见自己起诉别人扒窃是什么预兆? lms代表哪个国家 完美世界清风是好人还是坏人 腊月二十三的风俗是什么呢 2024腊月二十三过小年吃什么 腊月二十三过小年吃啥 请问下寻仙0797神宠加什么好 寻仙8777控火用的的小兔子怎么学技能 寻仙控火0777 神兽怎么学技能 寻仙控火该用哪种神宠 寻仙控火用0777 0877 0868的具体区别