Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
147 views
in Technique[技术] by (71.8m points)

Java中的宗量怎么理解呢?

  1. 我在看《Java虚拟机原理》中有描述宗量:方法的接收者和方法的参数统称为方法的宗量。

  2. 这个宗量如何理解呢,【方法的接收者】和【方法的参数】方法的宗量

  3. 【方法的接收者】和【方法的参数】 这两个概念是什么意思呢


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

谈一下我的理解,如有不对的地方欢迎指正。宗量(argument),可以理解为自变量,在计算机科学中可能当成形式参数更好理解一些。

方法的接收者,在运行时可以理解为方法的实际执行者。

看一下下面的例子:

public class Book{
  public void read(){}

  public static void doRead(Book b){
    b.read();
  }
}

类方法 Book.doRead(Book) 他的接收者就是 Book 这个类对象,他的参数 b 是一个形式参数。意思是在方法没被调用前,b 没有具体的值,就只是一个形式而已,相当于于一个占位符。再来看方法体:b.read(),我们可以说b.read()一定是指向Book#read这个方法吗?也可以不严谨的说 read 的执行者 b 一定是 Book 对象吗?不行的,因为面向对象的多态性,父类的方法是可以被子类重写的。只有运行时,我们调用这个方法时才可以确定方法的接收者,比如 Book.doRead(new Magazine()),在运行时实际指向的是 Magazine#read。所以说方法的接收者是形式变量(宗量)。

实际上这个问题要开来讲的,在运行时,方法的接收者是方法的宗量,方法的参数不是。在编译时,方法的接收者和参数才是方法的宗量,因为影响同名方法编译出来的字节码指向哪个方法的符号引用,就是方法的接收者的静态类型和方法的参数列表(重载)。

static class People{
  public void read(Book b){}
  public void read(Magazine b){}
}

static class Child extend People{
  public void read(Book b){}
  public void read(Magazine b){}
}

People p = new Child()
Child c = new Child()
p.read(new Book()) //People#read(Book)
c.read(new Book()) //Child#read(Book)

宗量,好像是指泛函中的术语,泛函是指定义域为函数的函数,在 java 中用这个术语好像可以理解。不过在这里java中讨论的更应该是值域为函数的函数。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...