Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Smalltalk与java中的实例变量_Java_Encapsulation_Smalltalk_Instance Variables_Getter Setter - Fatal编程技术网

Smalltalk与java中的实例变量

Smalltalk与java中的实例变量,java,encapsulation,smalltalk,instance-variables,getter-setter,Java,Encapsulation,Smalltalk,Instance Variables,Getter Setter,在《法罗榜样》一书中,我读到 Smalltalk中的实例变量对实例本身是私有的。 这与java和C++的情况不同,它允许实例变量。 (也称为“字段”或“成员变量”)由任何 恰好属于同一类的其他实例 我认为这对于其他语言,如Java或c,也是很常见的。类的实例无法访问同一类的另一个实例的实例变量如何仅针对smalltalk? 在Smalltalk中,同一类的两个实例不能访问彼此的 实例变量,除非类定义“访问器方法” 一个实例如何使用访问器方法访问另一个实例的实例变量? 使用名称空间std; #包括

在《法罗榜样》一书中,我读到

Smalltalk中的实例变量对实例本身是私有的。 这与java和C++的情况不同,它允许实例变量。 (也称为“字段”或“成员变量”)由任何 恰好属于同一类的其他实例

我认为这对于其他语言,如Java或c,也是很常见的。类的实例无法访问同一类的另一个实例的实例变量如何仅针对smalltalk?

在Smalltalk中,同一类的两个实例不能访问彼此的 实例变量,除非类定义“访问器方法”

一个实例如何使用访问器方法访问另一个实例的实例变量?

使用名称空间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!");
    }
}