【问题标题】:In java, is an object considered a variable?在java中,一个对象被认为是一个变量吗?
【发布时间】:2017-08-02 20:29:07
【问题描述】:

我正在研究的一个来源将数组定义为“一个名称下的变量集合,其中变量通过索引号访问。”

但后来我意识到你可以拥有一个对象数组(或者至少是一个指向对象的指针数组)。

这让我想知道在 java 中变量是如何定义的,因为我不认为对象是变量。 Jenkov Tutorials 将变量称为“一块可以包含数据值的内存”。

既然我相信一个对象符合这个定义,那么一个对象是否被认为是一个变量?

【问题讨论】:

  • 不,对象不是变量。我会说引用的来源是不准确的。
  • 如果说数组是对象的集合会更准确吗...?
  • 数组是一个可变的、固定大小的索引对象引用集合。

标签: java class variables


【解决方案1】:

将数组称为“变量集合”可以说是在扩展定义。但是数组当然是引用的集合,可以指向内存中的不同对象,并且每个这样的引用都可以合理地称为变量。

首先问“是一个对象还是一个变量”有点奇怪。在Object o = new Object() 中,o 显然是一个变量,但请记住它是对堆中对象的引用,而不是对象本身。

老实说,“变量”是一个非常灵活、定义不明确的术语——字段是变量吗?方法的返回结果?这取决于谁在说话以及他们今天使用的模糊定义。

【讨论】:

  • 为什么说引用是变量?我会说它和任何原语一样有价值。使用您自己的示例,返回引用类型的方法是否返回“变量”?我不这么认为。
  • 我现在明白了o是一个变量,也是一个指针/引用,对吧?
  • @shmosel: o 是一个变量——可能不是存储在o 中的引用,而是o 本身。我同意方法的返回不是传统意义上的“变量”,但我再次认为“变量”在这里是一个模糊的术语,毫无用处。
【解决方案2】:

对象是否被视为变量?

不,这是两个不同的东西。
第一个(对象)是值,第二个(变量)是引用对象的一种方式,通常是使用它(例如调用一系列方法)。
例如当你写:

new Dog()

你实例化了一个Dog。好的。但是假设你想在它饿了的时候喂它。
如果你没有办法在这个对象上链接一系列方法,你就不能。

通过将Dog 的引用存储在dog 变量中,您可以做到这一点:

Dog dog = new Dog();
if (dog.isHungry()){
   dog.feed();
}

Jenkov Tutorials 将变量称为“一块内存 可以包含数据值。”

它说的是同样的事情。

但是这个:

我正在研究的一个来源将数组定义为“一组 一个名称下的变量,其中变量通过索引访问 数字。”

相当具有误导性。
数组是具有状态的对象,其中包含数组元素等。
引用元素的方式是 Array 类的实现细节,我不会肯定每个元素都存储在特定变量中。

【讨论】:

  • 好的,我想我现在开始理解它了,但是如果一个变量是“一块可以包含数据值的内存”,那么数据值就是引用的名称/变量?
  • 不一定。变量 is 只是一种说法:我将有一种使用对象的方法。所以我使用一个“指向”它的变量。然后很好,因为我可以使用这个变量来操作它所引用的对象。
【解决方案3】:

当您使用保留字new 调用构造函数时会创建一个对象。

例如:

Object a = new Object();

a 将是创建的新对象的变量,并将转到为该对象保留的内存。您正在实例化该新变量,并且该变量与该对象相关联。

【讨论】:

  • 但是指针不是指向包含数据值的那块内存吗?不是实际的内存块本身?
  • ...我不明白你的第一句话或它在问什么。请改写。
  • 好的,所以,我们命名为“a”的对象是一个变量,对吧?那它也是参考吗?
  • 引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。来自 [docs.oracle.com/javase/specs/jls/se8/html/… Doc) 这是什么表示我的变量 a 正在保存到内存中的某个位置,
【解决方案4】:
Hope might this will help you to understand it better...

class Bulb
    {
    private int w;
    public void setWattage(int e)
    {
    w=e;
    }
    public int getWattage()
    {
    return w;
    }
    }
    class Test
    {
    public static void main(String args[])
    {
    Bulb b[];
    b=new Bulb[2];
    b[0]=new Bulb();
    b[1]=new Bulb();
    b[0].setWattage(60);
    b[1].setWattage(100);
    System.out.println(b[0].getWattage());
    }
    }

这里 b[0] 和 b[1] 是引用变量,具有两个 Bulb 对象的地址

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2012-12-29
    • 2010-10-14
    • 2016-07-01
    相关资源
    最近更新 更多