(一)private
默认情况下,类的属性在可以通过对象.属性名的方式来获取,如果不希望在类的外部被访问,可以用private来修饰。
格式:
class 类名{
private 属性
private 方法}
package level02
object Class02 {
class Student(val name: String, val age: Int) {
// private: 私有的。不对外公布,不对外发布,在外面不可以访问。在家之外的地方,不可以被别人知道....
private val hobbies: String = "躲在被子,打手电看恐怖小说"
private def hobby(): Unit = {
println(s"${hobbies}")
}
def sayHi(): Unit = {
println(s"${name}, ${age}")
hobby() // 在类的内部,可以调用私有方法
}
}
def main(args: Array[String]): Unit = {
val stu = new Student("小花", 18)
stu.sayHi()
// println(stu.hobbies)
// stu.hobby() // 在类的外部,无法访问私有属性
}
}
(二)判断类和对象的关系
方法1: 对象.getClass()
方法2:对象.isInstanceof[类]
println("s".getClass())
println(p1.isInstanceof[Person])
package level02
object Class03 {
// 如何类和对象的关系? 猴子鉴宝?
// 方式1:对象.getClass()
// 方式2:对象.isInstanceOf[类]
class Student() {}
class Teacher() {}
def main(args: Array[String]): Unit = {
val age: Int = 1
val stu = new Student()
// stu 是对象名
// Student是类名
// stu是Student类的实例。
println(stu.getClass) // class level02.Class03$Student
println(age.getClass) // int
// 注意:[], 结果是boolean值
println(stu.isInstanceOf[Student]) // true
println(stu.isInstanceOf[Teacher]) // false
}
}
当我们拿到一个对象时,如何知道它所属的类呢?
[讲授]
方法1: 对象.getClass()
方法2:对象.isInstanceof[类]
[编码示例]
println("s".getClass())
println(p1.isInstanceof[Person])
(二)重写toString****
1.在Scala中,要重写一个方法,你需要使用override关键字。对于toString方法,你可以在你的类中定义它,并使用override来指明这是对父类方法的重写。
2.定义toString方法
你可以在类的内部直接定义toString方法。这个方法通常不需要任何参数,并且返回一个String类型的结果。
override def toString: String = {
s"Person(name: age)"
}
package level02
object Class04 {
// 目标:改进类的代码,让它在println的时候,输出的信息更友好一点!
// 重写 toString方法
// (1)override 重写,覆盖....
// (2)toString 方法,是每个对象都自带的一个方法,当我们使用println时,它就会自动地调用,返回一个字符串,就是输出的内容。
class Student(var name: String, var age: Int) {
override def toString: String = s"姓名: ${name}"
}
def main(args: Array[String]): Unit = {
val stu1 = new Student("小花", 18) // level02.Class04$Student@2133c8f8
val stu2 = new Student("小明", 18) // level02.Class04$Student@2133c8f8
println(stu1) // 姓名: 小花
println(stu2) // 姓名: 小明
}
}
(四)判断两个对象是相等的?
两个对象做比较==时,会自动调用equals方法。我们可以重写equals方法,并自己定义两个对象相等的标准。
重写equals方法的语法格式:
override def equals(obj: Any): Boolean = {
true/false
if (obj == null || obj.getClass != this.getClass) return false
// 类型转换和字段比较
val other = obj.asInstanceOf[Student]
(this.ID == other.ID) && (this.name == other.name)
}
package level02
object Class05 {
// 目标:判断两个Student对象是否相等的依据:学号相同 并且 姓名相同
// 这里的判断条件可以自己来确定
class Student(val id: String, val name: String, val age: Int) {
// 改写 equals 方法
// 在使用 == 判断的时候,会自动调用。
// 如果返回true,则相等
// 如果返回false,则不相等
override def equals(obj: Any): Boolean = {
println(s"比较是否相等.... ${this.id},${this.name},")
// 在这里自己判断逻辑
// obj当前Student
val other = obj.asInstanceOf[Student]
this.id == other.id && this.name == other.name
}
}
def main(args: Array[String]): Unit = {
val stu1 = new Student("202401001", "小花", 18)
val stu2 = new Student("202401001", "小花", 19)
if (stu1 == stu2) {
println("他们是同一个人")
} else {
println("不是同一个人")
}
// println(stu1 == stu2) // false
}
}