Smalltalk与java中的实例变量
在《法罗榜样》一书中,我读到 Smalltalk中的实例变量对实例本身是私有的。 这与java和C++的情况不同,它允许实例变量。 (也称为“字段”或“成员变量”)由任何 恰好属于同一类的其他实例 我认为这对于其他语言,如Java或c,也是很常见的。类的实例无法访问同一类的另一个实例的实例变量如何仅针对smalltalk? 在Smalltalk中,同一类的两个实例不能访问彼此的 实例变量,除非类定义“访问器方法” 一个实例如何使用访问器方法访问另一个实例的实例变量?Smalltalk与java中的实例变量,java,encapsulation,smalltalk,instance-variables,getter-setter,Java,Encapsulation,Smalltalk,Instance Variables,Getter Setter,在《法罗榜样》一书中,我读到 Smalltalk中的实例变量对实例本身是私有的。 这与java和C++的情况不同,它允许实例变量。 (也称为“字段”或“成员变量”)由任何 恰好属于同一类的其他实例 我认为这对于其他语言,如Java或c,也是很常见的。类的实例无法访问同一类的另一个实例的实例变量如何仅针对smalltalk? 在Smalltalk中,同一类的两个实例不能访问彼此的 实例变量,除非类定义“访问器方法” 一个实例如何使用访问器方法访问另一个实例的实例变量? 使用名称空间std; #包括
使用名称空间std;
#包括
班车{
私人:
国际里程;
公众:
car(int);//构造函数
int里程表();
};
汽车:汽车(整数米){
里程=m;
}
int car::里程表(){
返程里程;
}
内部主(空){
福特汽车(10000辆);
本田汽车(20000辆);
库特
我认为这在Java或c#等其他语言中也很常见。一个类的实例不能访问同一个类的另一个实例的实例变量。它如何仅适用于smalltalk
对不起,这种想法是不正确的
在Java中,一个类的实例可以访问同一个类的另一个实例的私有字段
对于具有两个字段x
和y
的类点
,等于
方法(实际上由Intellij生成)的常见实现是:
在这种情况下,当前对象直接访问另一个对象的字段point
,这在Smalltalk中是不允许的
这在C#和许多其他语言中也是允许的。我不确定Smalltalk是否真的是唯一不允许它的语言
按照惯例,Smalltalk类的访问器通常与实例变量相同,但您需要实际编写访问器,并且没有语法可用于直接访问不同实例上的字段。请查看以下Java代码:
public class Person {
Integer wallet = new Integer(100);
}
并运行小偷类:
public class Thief {
Person victim = new Person();
public static void main (String[] args) {
Thief thief = new Thief();
System.out.println("I take $"+ thief.victim.wallet + " from your wallet!");
}
}
结果是:我从你的钱包里拿走了100美元!
它甚至不必是同一类的实例
如果您将Java变量声明为private,则同一类的实例仍然可以访问彼此的实例变量。如果您采用上述示例,则小偷仍然可以从另一个小偷那里偷窃:
public class Thief {
private Integer wallet = new Integer(100);
public Thief victim() {
Thief victim = new Thief();
return victim;
}
public static void main (String[] args) {
Thief thief = new Thief();
System.out.println("I take $"+ thief.victim().wallet + " from your wallet!");
}
}
这在Smalltalk中是不可能的
这与java和C++不同,它允许实例变量被任何其他实例访问,而这些实例恰好是<强>相同< /强>类。
这是真的。如果我们在java中将钱包声明为私有,那么我们可以实现与smalltalk相同的功能。不是吗?所以在那本书中,他们在smalltalk中说,默认情况下,实例变量的作用域是私有的。对吗?在这种情况下,小偷只能从另一个小偷那里偷:)现在同样的类条件适用了。@Sankaran不,你不能在Java中声明这种方式,相同类的每个其他实例(或通过桥接方法的内部类)都可以访问实例的私有字段/方法。例如,在Scala中,有private[this]
(Smalltalk方式)和private
(Java方式)的区别@MartinW您的评论是正确的,尽管您的答案似乎是关于默认可见性,而不是问题所涉及的私有性。@GáborBakos我扩展了我的答案。但在问题中,私有一词只出现在与Smalltalk变量相关的地方,而不是作为Java访问修饰符。我已经阅读了答案,并在Pharo By example book中进一步阅读了答案我明白了,在C++和java中,一个实例可以根据其访问修饰符级别访问其他实例的变量,如果是私有的,那么它可以在类中访问,如果是公共的,那么它就可以在任何地方访问。但是在SMALLATTS中,我们不能在类或任何地方进行。java提供的最大封装,C++是类的。仅限级别
public class Thief {
Person victim = new Person();
public static void main (String[] args) {
Thief thief = new Thief();
System.out.println("I take $"+ thief.victim.wallet + " from your wallet!");
}
}
public class Thief {
private Integer wallet = new Integer(100);
public Thief victim() {
Thief victim = new Thief();
return victim;
}
public static void main (String[] args) {
Thief thief = new Thief();
System.out.println("I take $"+ thief.victim().wallet + " from your wallet!");
}
}