从反编译了解scala的属性重载

 众所周知的是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; } //抽象方法的实现

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理实验中,使用Scala编程语言进行分析是一种常见的做法。Scala是一门功能强大的多范式编程语言,它融合了面向对象编程和函数式编程的特性。 在编译原理实验中,我们通常需要实现语言的词法分析和语法分析两个重要的步骤。词法分析器主要负责将源代码分解为各种词法单元,例如关键字、标识符、运算符和常量等。而语法分析器则根据词法单元构建语法树,以验证源代码是否符合给定的文法规则。 Scala提供了丰富的语言特性和工具,便于我们实现词法分析器和语法分析器。例如,我们可以使用Scala的正则表达式库来定义词法规则,并使用模式匹配语法来进行单词的匹配和提取。此外,Scala还支持高阶函数和匿名函数的特性,使得我们可以更方便地实现语法分析器。 除了词法分析和语法分析,编译原理实验中还需要实现其他功能,如语义分析、中间代码生成和目标代码生成等。Scala作为一门面向对象和函数式的编程语言,具有良好的可扩展性和可维护性,能够有效地支持这些功能的实现。 在实验过程中,我们可以利用Scala的强类型系统和模式匹配等特性来提高代码的可靠性和可读性。此外,Scala还提供了丰富的工具库和框架,如ANTLR和ScalaTest等,可以进一步简化编译过程中的实现和测试工作。 总之,使用Scala编程语言进行编译原理实验分析是一种有效和方便的选择。Scala的多范式特性、丰富的语言特性和工具支持,可以帮助我们实现词法分析器、语法分析器和其他编译器的各个部分,并提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值