作者dasea (植栽鸡肉饭)
看板ncyu_phyedu
标题[讨论] 讯息传递
时间Sat Jan 30 14:56:05 2010
讯息传递(Message Passing)和函数呼叫(Function Call)的不同点
Procedure Language以函数作为写作和执行的主体。函数由一群程式码所组成,函数的开
头地址在Compile time或Link time就已经决定好了,而在Runtime呼叫函数时给予适当的
参数。函数和记忆体之间没有关联性,而且函数A可以被任何其他函数呼叫,程式语言并没
有特别的规范。
Object-Oriented Language以Class作为写作的主体,执行时主要由Object来纪录程式状态
。由於物件导向程式语言将Object Variable和Object Method一起定义在Class内,再透过
Encapsulation的机制规范存取Object Member的范围,因此Object的Variable和Method就
组成了一个完整的个体。
虽然Object Method写起来就像Function,但执行Method内程式码的机制和Function不同:
Object Method定义物件接受到讯息时的反应, 也就是说执行Method时有一个隐形的参数
, 意即这个物件(this)
Function的实际地址在Compile或Link time就已经决定好了, 但对OO来说, Object必须在
Runtime接受到讯息後, 才能决定实际要执行的Method。
Message Passing的语法
由於Java只能透过reference来存取物件,因此Message Passing的语法是
reference.method
/**
* 假设People有variable age,其值限定於0到130之间
*/
public class People {
private int age;
public People(int d) {
this.age = d;
}
public int getAge() {
return age;
}
public void setAge(int d) {
if (d >= 0 && d <= 130) { // 检查年龄是否合法
age = d;
}
}
public void increaseAge() {
if (age < 130) { // 检查年龄是否合法
this.age++;
}
}
public static void main(String[] argv) {
People e1, e2; // e1,e2 are references to Object People, not the
Object themselves
e1 = new People(3);
e2 = new People(5);
e1.setAge(30);
e2.setAge(50);
e1.increaseAge();
e2.increaseAge();
}
}
this这个keyword表示接收到此讯息的物件。由於设计时是定义Class, 而执行时则是
Object接受讯息, Class只有一个, 但Object可以有很多个, 因此必须使用this表达现在
接收到此讯息的物件。
由於Object Method具有隐形的物件参数, 因此Class Method不能去存取Object Member
public class ErrorCall {
int data; // object variable
public void objectMethod() {
data = 10;
}
public static void classMethod() {
objectMethod(); // Compile Error
data = 10; // Compile Error
}
}
Message Passing在执行期间才会决定实际Method的机制, 我们将在Inheritance(继承)里
叙述。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.58.22.74