Scala 學習(4)之「類——基本概念2」

內部類

import scala.collection.mutable.ArrayBuffer
class Class {
	class Student(val name: String) {}		//此處爲內部類
	val students = new ArrayBuffer[Student]
	def getStudent(name: String) = {
		new Student(name)
	}
}

val c1 = new Class
val s1 = c1.getStudent("0mifang")
c1.students += s1

val c2 = new Class
val s2 = c2.getStudent("0mifang1")
c1.students += s2		//錯誤的演示

extends

  • 繼承就表明子類能夠從父類繼承父類的 field 和 method ;而後子類能夠在本身內部放入父類所沒有,子類特有的 field 和 method,使用繼承能夠有效複用代碼。
  • 子類能夠覆蓋父類的 field 和 method,可是若是父類用 final 修飾,field 和 method 用 final 修飾,則該類是沒法被繼承的,field 和 method 是沒法被覆蓋的。
class Person {
	private var name = "0mifang"
	def getName = name
}
class Student extends Person {
	private var score = "A"
	def getScore = score
}

var student = new Student
student.getName

override和super

  • 若是子類要覆蓋一個父類中的非抽象方法,則必須使用 override 關鍵字 override
  • 關鍵字能夠幫助咱們儘早地發現代碼裏的錯誤,好比:override 修飾的父類方法的方法名咱們拼寫錯了;好比要覆蓋的父類方法的參數咱們寫錯了;等等
  • 此外,在子類覆蓋父類方法以後,若是咱們在子類中就是要調用父類的被覆蓋的方法,那就可使用 super 關鍵字,顯式地指定要調用父類的方法
class Person {
	private var name = "0mifang"
	def getName = name

}
class Student extends Person {
	private var score = "A"
	def getScore = score

	override def getName = "Hi, I'm " + super.getName
}

var student = new Student
student.getName		// 能夠發現,student 類繼承了 Person 類的 getName 方法

override field

子類能夠覆蓋父類的 val field,並且子類的 val field 還能夠覆蓋父類的 val field 的 getter 方法,只要在子類中使用 override 關鍵字便可編程

class Person {
	val name: String = "Person"
	def age: Int = 0
}

class Student extends Person {
	override val name: String = "0mifang"
	override val age: Int = 18
}

val person = new Person
val student = new Student
person.name
person.age
student.name
student.age

isInstanceOf和asInstanceOf

若是咱們建立了子類的對象,可是又將其賦予了父類類型的變量。則在後續的程序中,咱們又須要將父類類型的變量轉換爲子類類型的變量,應該如何作? 首先,須要使用 isInstanceOf 判斷對象是不是指定類的對象,若是是的話,則可使用 asInstanceOf 將對象轉換爲指定類型。ide

  • 若是對象是 null,則 isInstanceOf 必定返回 false,asInstanceOf 必定返回null;
  • 若是沒有用 isInstanceOf 先判斷對象是否爲指定類的實例,就直接用 asInstanceOf 轉換,則可能會拋出異常。
class Person
class Student extends Person
val p: Person =  new Student
var s: Student = null
// 若是 p 是 Student 類,則讓 s 指向 p 轉換爲 Student 的對象
if (p.isInstanceOf[Student]) s = p.asInstanceOf[Student]

在這裏插入圖片描述

getClass和classOf

  • isInstanceOf 只能判斷出對象是不是指定類以及其子類的對象,而不能精確判斷出,對象就是指定類的對象;
  • 對象.getClass 能夠精確獲取對象的類,classOf[類] 能夠精確獲取類,而後使用 == 操做符便可判斷。
class Person
class Student extends Person

val p: Person = new Student
p.isInstanceOf[Person]		//true
p.getClass == classOf[Person]	//false
p.getClass == classOf[Student]	//true

歡迎關注,本號將持續分享本人在編程路上的各類見聞。scala

相關文章
相關標籤/搜索