【问题标题】:What exactly is a reference variable in Java? How does it differ from other variables?Java中的引用变量到底是什么?它与其他变量有何不同?
【发布时间】:2018-05-01 21:34:20
【问题描述】:

我一直在研究 Java 中的继承,作者声明“它是被引用的对象的类型(而不是引用变量的类型),它决定了将执行哪个版本的覆盖方法。” 这句话非常令人困惑。

【问题讨论】:

    标签: java oop inheritance polymorphism


    【解决方案1】:

    参考变量是表示/解释变量的术语 仅指一种类型,尚未实例化。 同样在实例化之后,它的类型将取决于引用变量将被实例化的方式或类。

    从上面罗伯特·哥伦比亚的例子中说

       Person myBFF;
    

    或者以布伦为例

       Coordinate cords; //Cords is the ref. var
    

    在这两种情况下,myBFF 和cords 仅分别引用 Person 或 Coordinate 类。请注意,它们尚未实例化!

    【讨论】:

      【解决方案2】:

      引用变量如下所示:

      Coordinate cords; //Cords is the ref. var
      

      that 内部的引用变量是您计算机 RAM 中的一个地址,用于存储该对象的属性。由于我们没有实例化(实际上是创建一个对象)上述cords对象的地址是null

      引用变量保存内存保留部分的地址。

      cords = new Coordinate(0.0,0.0,0.0);
      

      现在计算机的 RAM 内部是一个保留空间,用于保存三个浮点类型变量。在实例化时,引用变量保存地址。那么我们可以用 Java 中的地址做什么呢?

      没什么用。 Java内存地址没用,看不到(虽然看起来像0xFFFFFFF)

      对于视觉表示点击here

      【讨论】:

        【解决方案3】:

        这本书所指的是多态,更具体地说是通过动态调度

        简而言之,想象以下类:

        public class Person {
        
            public Person() {
            }
        
            public void introduceYourself() {
            } 
        
        }
        
        public class Texan extends Person {
        
            public Texan() {
            }
        
            public void introduceYourself() {
                System.out.printLn("Howdy y'all!");
            } 
        
        }
        
        public class NewYorker extends Person {
        
            public NewYorker() {
            }
        
            public void introduceYourself() {
                System.out.printLn("Yo. You got a problem with that?");
            } 
        
        }
        

        现在,让我们创建一个Person 类型的引用变量。

        Person myBFF;
        

        让我们实例化他

        myBFF = new NewYorker();
        

        请他自我介绍

        myBFF.introduceYourself();
        

        打印出来:

        哟。你有什么问题吗?

        现在,让我们把你的 BFF 换成德州人。

        myBFF = new Texan();
        

        让我们再次拨打同一条线路,让我们的 BFF 自我介绍一下。

        myBFF.introduceYourself();
        

        打印出来:

        大家好!

        在每种情况下,您使用的引用变量都是 Person 类型。在每种情况下,变量的 instance 分别是 NewYorkerTexan那个实例类型决定了调用introduceYourself()的哪个版本。

        【讨论】:

        • 你有一个真正的解释诀窍!真的很感激,但我确实有一个问题;无论多少代子类,引用变量总是超类类型吗?例如。如果我将 Texan 扩展到 SouthernTexan,该引用变量是否仍然是 Person 类型?
        • 是的,但是您可以将引用变量声明为更接近实例类型的类型。例如,您可以使用Texan bob = new SouthernTexan();SouthernTexan sue = new SouthernTexan();,但您可以 使用NewYorker clyde = new SouthernTexan();,也不能使用SouthernTexan henry = new Person();
        【解决方案4】:

        引用变量是您在左侧指定的类型(包含引用类型的变量)。作者所指的是右手边不同的时候。考虑

        Object a = new Foo(); 
        System.out.println(a.toString());
        

        如果Foo 覆盖Object.toString()(即如果Foo 提供了public String toString())方法那么 调用的是FootoString(不是Object 的)。另请参阅 Java 教程中的 Overriding and Hiding Methods

        【讨论】:

          猜你喜欢
          • 2015-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-21
          相关资源
          最近更新 更多