?? | 类内部 | 本包 | 子类 | 外部包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
? ?
举例说明:
????package com.starzy.extends_demo ????class Person { ??????val name="super" ??????def getName=this.name ????} ????class Student extends Person{ ??????//继承加上关键字 ??????override ??????val name="sub" ??????//子类可以定义自己的field和method ??????val score="A" ??????def getScore=this.score ????} |
? ?
举例说明:
????class Person1 { ??????private val name = "leo" ??????val age=50 ??????def getName = this.name ????} ????class Student1 extends Person1{ ??????private val score = "A" ??????//子类可以覆盖父类的 val field,使用override关键字 ??????override ??????val age=30 ??????def getScore = this.score ??????//覆盖父类非抽象方法,必须要使用 override 关键字 ??????//同时调用父类的方法,使用super关键字 ??????override def getName = "your name is " + super.getName ????} |
? ?
如果实例化了子类的对象,但是将其赋予了父类类型的变量,在后续的过程中,又需要将父类类型的变量转换为子类类型的变量,应该如何做?
? ?
Scala | Java |
obj.isInstanceOf[C] | obj instanceof C |
obj.asInstanceOf[C] | (C)obj |
classOf[C] | C.class |
? ?
举例说明:
????????class Person3 {} ????????class Student3 extends Person3 ????????object Student3{ ????????????def main (args: Array[String] ) { ????????????val p: Person3 = new Student3 ????????????var s: Student3 = null ????????????//如果对象是 null,则 isInstanceOf 一定返回 false ????????????println (s.isInstanceOf[Student3]) ????????????// 判断 p 是否为 Student3 对象的实例 ??????????if (p.isInstanceOf[Student3] ) { ????????????//把 p 转换成 Student3 对象的实例 ??????????????s = p.asInstanceOf[Student3] ??????????} ??????????println (s.isInstanceOf[Student3] ) ??????????} ? ? } |
? ?
举例说明:
????class Person4 {} ????class Student4 extends Person4 ????object Student4{ ??????def main(args: Array[String]) { ????????val p:Person4=new Student4 ????????//判断p是否为Person4类的实例 ????????println(p.isInstanceOf[Person4])//true ????????//判断p的类型是否为Person4类 ????????println(p.getClass == classOf[Person4])//false ????????//判断p的类型是否为Student4类 ????????println(p.getClass == classOf[Student4])//true ??????} ????} |
? ?
举例说明:
????class Person5 {} ????class Student5 extends Person5 ????object Student5{ ??????def main(args: Array[String]) { ????????val p:Person5=new Student5 ????????p match { ??????????// 匹配是否为Person类或其子类对象 ??????????case per:Person5 => println("This is a Person5‘s Object!") ??????????// 匹配所有剩余情况 ??????????case _??=>println("Unknown type!") ????????} ??????} ? ? } |
? ?
? ?
举例说明:
????class Person6{ ??????protected var name:String="tom" ??????protected[this] var hobby:String ="game" ??????protected def sayBye=println("再见...") ????} ????class Student6 extends Person6{ ??????//父类使用protected 关键字来修饰 field可以直接访问 ??????def??sayHello =println("Hello "+name) ??????//父类使用protected 关键字来修饰method可以直接访问 ??????def??sayByeBye=sayBye ??????def makeFriends(s:Student6)={ ????????println("My hobby is "+hobby+", your hobby is UnKnown") ??????} ????} ????object Student6{ ??????def main(args: Array[String]) { ????????val s:Student6=new Student6 ????????s.sayHello ????????s.makeFriends(s) ????????s.sayByeBye ??????} ????} |
? ?
举例说明:
????class Person7(val name:String,val age:Int){ ??????var score :Double=0.0 ??????var address:String="beijing" ??????def this(name:String,score:Double)={ ????????//每个辅助constructor的第一行都必须调用其他辅助constructor或者主constructor代码 ????????//主constructor代码 ??????????this(name,30) ??????????this.score=score ??????} ??????//其他辅助constructor ??????def this(name:String,address:String)={ ??????????this(name,100.0) ??????????this.address=address ??????} ????} ????class Student7(name:String,score:Double) extends Person7(name,score) |
? ?
举例说明:
????abstract class Person9(val name:String) { ??????//必须指出返回类型,不然默认返回为Unit ??????def sayHello:String ??????def sayBye:String ????} ????class Student9(name:String) extends Person9(name){ ??????//必须指出返回类型,不然默认 ??????def sayHello: String = "Hello,"+name ??????def sayBye: String ="Bye,"+name ????} ????object Student9{ ??????def main(args: Array[String]) { ????????val s = new Student9("tom") ????????println(s.sayHello) ????????println(s.sayBye) ??????} ????} |
? ?
举例说明:
????abstract class Person10 (val name:String){ ????//抽象fields ????????val age:Int ????} ????class Student10(name: String) extends Person10(name) { ?????? val age: Int = 50 ????} |
? ?
原文:https://www.cnblogs.com/starzy/p/10466558.html