谈一下我的理解,如有不对的地方欢迎指正。宗量(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中讨论的更应该是值域为函数的函数。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…