面向对象
- 概念:面向过程(c)-->面向对象(java/scala)<比较复杂>
- 面向对象的特点:
- ①.更符合人的思考习惯 -②.把复杂的事情简单化 -③.把程序员从执行者变成指挥者
- 类class(类是属性和行为的集合):
- ①.属性也叫成员变量:名词,用来描述事物的外在特征
- ②.行为也叫成员方法:动词,表示事物能做什么
- 面向对象的特征:①. 封装②. 继承③. 多态
创建类和对象
Person就是一个类名,理解为变量名(首字母大写,类名一般为名词)
object Base31 {
def main(args: Array[String]): Unit = {
//定义类:
class Person(){}
class Student(){}
def main(args: Array[String]): Unit = {
//实例化对象:
val p1 = new Person()
val s1 = new Student()
println(p1)
println(s1)
}
}
}
定义和访问成员变量
把功能都封装在class中: ①.属性 ②.方法 ③.辅助构造器
object Base31 {
def main(args: Array[String]): Unit = {
//定义类:
class Person(){}
class Student() {
//在类中,定义就是变量
var name: String = "小花"
var age: Int = 18
}
def main(args: Array[String]): Unit = {
//实例化对象:
val p1 = new Person()
val s1 = new Student()
//访问成员变量
println(s1.name)
//修改成员变量
s1.name="小花花"
println(s1.name)
}
}
}
定义和访问成员方法(函数)
//类的方法-函数
def say(): Unit = {
println(s"${name},${age}")
带参数的构造器(构造函数)<即将参数直接放入构造器中>
object Base32 {
def main(args: Array[String]): Unit = {
//带参数的构造器(构造函数)
//定义类:
class Person() {}
class Student(var name: String = "小花", var age: Int = 18) {
println("Student.....被调用了...")
//在类中,定义就是变量
//类的属性-变量
//var name: String = "小花"
//var age: Int = 18
//类的方法-函数
def say(): Unit = {
println(s"${name},${age}")
}
}
//实例化对象:
val s1 = new Student()
s1.say()
val s2 = new Student("小明", 19)
s2.say()
}
}
eg:求三角形的面积:
- 1.求三角形的面积
-
- 判断是否是个三角形
- 3.构成三角形的条件是:任意两边之和 > 第三边
object Base33 {
// 1.求三角形的面积
// 2. 判断是否是一个三角形。
class Triangle(var a: Double = 1.0, var b: Double = 1.0, var c: Double = 1.0) {
// 检查是否构成三角形,结果是 boolean
def check(): Boolean = {
// 构成三角形的条件是:任意两边之和 > 第三边
return a + b > c && b + c > a && a + c > b
}
// 计算面积:根据三角形的三边计算面积
def getArea(): Double = {
if (check()) {
var s = (a + b + c) / 2
s = Math.sqrt(s * (s - a) * (s - b) * (s - c))
return s
} else {
println(s"$a,$b,$c: 不能构成一个三角形")
return -1
}
}
}
def main(args: Array[String]): Unit = {
// print("请输入第一条边")
// val a = scala.io.StdIn.readDouble()
// print("请输入第二条边")
// val b = scala.io.StdIn.readDouble()
// print("请输入第三条边")
// val c = scala.io.StdIn.readDouble()
// val t1 = new Triangle(a, b, c)
val t1 = new Triangle(3, 4, 7)
println(t1.getArea())
val t2 = new Triangle(3, 4, 3)
println(t2.getArea())
//if(t1.check)){
//}
}
}
构造器的默认值
- ①.必填项(姓名,年龄)
- ②.有默认项(性别:男;民族:汉)
- eg:
object Base34 {
class Student(var name:String,var age:Int,var gender:String="男",var nav:String="汉族") {
def say(): Unit = {
println(s"${name},${age},${gender},${nav}")
}
}
def main(ages:Array[String]): Unit = {
//var s0=new Student()//gender和nav使用默认值
var s1=new Student("小明",19)
s1.say()
var s2=new Student("小花",18,"女","回族")
s2.say()
}
}
构造器中的参数中的类型
- ①.val定义的属性,不能修改
- ②.var定义的属性,可以修改
- ③.没有var,也没有val的,不是对象的属性,不能使用语法来访问
object Base35 {
class Student(val name:String,var age:Int,var gender:String="男",var nav:String="汉族") {
def say(): Unit = {
println(s"${name},${age},${gender},${nav}")
}
}
def main(ages:Array[String]): Unit = {
//var s0=new Student()//gender和nav使用默认值
var s1=new Student("小明",19)
s1.age=20
s1.say()
}
}
辅助构造器
-
- 名称一定是this
-
- 在辅助构造器内部,一定要调用主构造器this
-
- 可以有多个
-
eg: 多种注册用户的方式 --- 辅助构造器 ①. 手机号 + 密码②.邮箱 + 密码 + 用户名
object Base36 {
class Register(val name: String, var email: String, var pwd: String, var phone: String) {
println("主构造器被调用")
def this(phone: String, pwd: String) {
this("默认用户xxxxxx", "xxxx@qq.com", pwd, phone) // 调用主构造器
println("辅助构造器被调用")
}
def this(email: String, pwd: String, name: String) {
this(name, email, pwd, "13600000000") // 调用主构造器
println("辅助构造器被调用")
}
def say(): Unit = {
println(s"姓名: ${name}, 邮箱: ${email}, 密码: ${pwd}, 手机号: ${phone}")
}
}
def main(args: Array[String]): Unit = {
// val r1 = new Register("小明", "12323@qq.com", "123456", "13617885566")
// 调用辅助构造器
val r1 = new Register("13617885566", "123456")
val r2 = new Register("9456651@qq.com", "123456", "小明")
r1.say()
r2.say()
}
}