代码之家  ›  专栏  ›  技术社区  ›  Tom

scala继承中的方法或字段

  •  1
  • Tom  · 技术社区  · 6 年前

    我有以下代码片段:

    class Data(i: Int)
    
    class Person(@transient val data: Data) extends java.io.Serializable
    
    class Student(data: Data) extends Person(data)
    

    我以为数据是学生课堂的一个领域,但实际上,它是学生的一种方法,

    classOf[Student].getMethods.foreach(m => println(m.getName()),
    

    data

    我会问 why data becomes method of Student, but not field,

    谢谢!

    0 回复  |  直到 6 年前
        1
  •  3
  •   jwvh    6 年前

    在Scala类中,所有公共字段实际上都是通过公共方法访问的私有字段。

    这可以通过使用 Data

    %%> cat so.sc
    class Data(i: Int)
    
    %%> scalac -Xprint:4 so.sc
    [[syntax trees at end of                     typer]] // so.sc
    package <empty> {
      class Data extends scala.AnyRef {
        <paramaccessor> private[this] val i: Int = _;
        def <init>(i: Int): Data = {
          Data.super.<init>();
          ()
        }
      }
    }
    

    如你所见, val i private[this] 如果你跑 classOf[Data].getFields.isEmpty 它会回来的 true

    现在让我们添加一两个公共字段。

    %%> cat so.sc
    class Data(val i: Int) {
      val x = 'X'
    }
    
    %%> scalac -Xprint:4 so.sc
    [[syntax trees at end of                     typer]] // so.sc
    package <empty> {
      class Data extends scala.AnyRef {
        <paramaccessor> private[this] val i: Int = _;
        <stable> <accessor> <paramaccessor> def i: Int = Data.this.i;
        def <init>(i: Int): Data = {
          Data.super.<init>();
          ()
        };
        private[this] val x: Char = 'X';
        <stable> <accessor> def x: Char = Data.this.x
      }
    }
    

    我们都看到了 val i x ,是 私人的[这个] ,和 [Data].getFields.isEmpty的类 真的 def i def x ,它是公共的,并返回 Data.this.i Data.this.x 分别是。

        2
  •  3
  •   Duelist    6 年前

    Person 调用了public getter方法 data .

    scala> :javap -public Person
    Compiled from "<console>"
    public class $line3.$read$$iw$$iw$Person implements java.io.Serializable {
      public $line3.$read$$iw$$iw$Data data();
      public $line3.$read$$iw$$iw$Person($line3.$read$$iw$$iw$Data);
    }
    

    因为 Student 是的孩子 它继承了这个方法。

    数据 var val 它只是一个局部变量,只在 学生 ,所以它不是成员。

    Tour of Scala: Classes

    推荐文章