众所周知的是scala中的成员变量是可以重写的,那么我们不得不思考一下什么样的成员方法是可以重写的
首先我们得明白的是 val var 的区别
1.var 声明的成员变量的引用指向是可以变化的,也就是说他的成员变量所指向的对象是可以变化的
2.val 声明的成员变量的引用指向是不可以变化的,也就是说他的成员变量所指向的对象是不可以变化的
那么我们明白了 var应该没必要重写,只需要使用父类属性,自己修改属性所指对象即可,所以继承一个非抽象的父类是不可以使用override重写父类用var声明的属性的
但是有时候我们可以看见别人的源代码var前却可以使用override的原因是什么
其实是因为子类的父类是一个抽象类,这里的override其实是一个父类属性的实现,所以我们建议不要在子类的这个属性前加override,容易混淆概念
接下来我们谈谈scala中的抽象属性
1.抽象属性必须声明在抽象类中 所以抽象类的声明方式是abstract class xxx
2.抽象属性的声明方式 即 var 属性名:xxx 不进行声明即可(赋值)
最后我们从反编译角度解释一下抽象属性
1.抽象属性并不会在底层创造一个属性而只是创建了一个抽象的 属性名(),和属性名_$eq()方法
2.子类实现属性会实现父类的抽象的name(),和name_$eq()方法
源代码
package edu.lulu.oop.chapter6
// 众所周知的是scala中的成员变量是可以重写的
// 那么我们不得不思考一下什么样的成员方法是可以重写的
// 首先我们得明白的是 val var 的区别
// var 声明的成员变量的引用指向是可以变化的,也就是说他的成员变量所指向的对象是可以变化的
// val 声明的成员变量的引用指向是不可以变化的,也就是说他的成员变量所指向的对象是不可以变化的
// 那么我们明白了 var应该没必要重写,只需要使用父类属性,自己修改属性所指对象即可
// 但是var前却可以使用override的原因是什么
// 其实是因为子类的父类是一个抽象类,这里的override其实是一个父类属性的实现,所以我们建议不要在子类的这个属性前加override,容易混淆概念
// 接下来我们谈谈scala中的抽象属性
// 1.抽象属性必须声明在抽象类中 所以抽象类的声明方式是abstract class xxx
// 2.抽象属性的声明方式 即 var 属性名:xxx 不进行声明即可(赋值)
// 最后我们从反编译角度解释一下抽象属性
// 1.抽象属性并不会在底层创造一个属性而只是创建了一个抽象的 属性名(),和属性名_$eq()方法
// 2.子类实现属性会实现父类的抽象的name(),和name_$eq()方法
object Test07 {
def main(args: Array[String]): Unit = {
println("Test07")
}
}
abstract class Father00{
var name:String //抽象属性
}
class Son00{
var name = "wanglulu"
}
反编译的源代码
package edu.lulu.oop.chapter6;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="\006\001%2Q!\001\002\002\002-\021\001BR1uQ\026\024\b\007\r\006\003\007\021\t\001b\0315baR,'O\016\006\003\013\031\t1a\\8q\025\t9\001\"\001\003mk2,(\"A\005\002\007\025$Wo\001\001\024\005\001a\001CA\007\021\033\005q!\"A\b\002\013M\034\027\r\\1\n\005Eq!AB!osJ+g\rC\003\024\001\021\005A#\001\004=S:LGO\020\013\002+A\021a\003A\007\002\005!9\001\004\001a\001\016\003I\022\001\0028b[\026,\022A\007\t\0037yq!!\004\017\n\005uq\021A\002)sK\022,g-\003\002 A\t11\013\036:j]\036T!!\b\b\t\017\t\002\001\031!D\001G\005Aa.Y7f?\022*\027\017\006\002%OA\021Q\"J\005\003M9\021A!\0268ji\"9\001&IA\001\002\004Q\022a\001=%c\001")
public abstract class Father00
{
public abstract String name();//抽象方法
public abstract void name_$eq(String paramString);//抽象方法
}
package edu.lulu.oop.chapter6;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="\006\00112A!\001\002\001\027\t)1k\03481a)\0211\001B\001\tG\"\f\007\017^3sm)\021QAB\001\004_>\004(BA\004\t\003\021aW\017\\;\013\003%\t1!\0323v\007\001\031\"\001\001\007\021\0055\001R\"\001\b\013\003=\tQa]2bY\006L!!\005\b\003\r\005s\027PU3g\021\025\031\002\001\"\001\025\003\031a\024N\\5u}Q\tQ\003\005\002\027\0015\t!\001C\004\031\001\001\007I\021A\r\002\t9\fW.Z\013\0025A\0211\004I\007\0029)\021QDH\001\005Y\006twMC\001 \003\021Q\027M^1\n\005\005b\"AB*ue&tw\rC\004$\001\001\007I\021\001\023\002\0219\fW.Z0%KF$\"!\n\025\021\00551\023BA\024\017\005\021)f.\033;\t\017%\022\023\021!a\0015\005\031\001\020J\031\t\r-\002\001\025)\003\033\003\025q\027-\\3!\001")
public class Son00
{
private String name = "wanglulu";
public String name() { return this.name; } //具体实现
public void name_$eq(String x$1) { this.name = x$1; } //抽象方法的实现
}