引用变量指向另一个对象

时间:2017-12-10 06:07:24

标签: java

有一个名为Bank的界面,它有两个实施类:ABCXYZ

public class Tester2 {
    public static void main(String[] args) {
        // i/f ref can directly refer to ANY concrete imple cls instance Bank
        ref = new ABC();// up casting
        ref.withdraw(123, 345);// DMD
        // ref.payBills(); 
        ((ABC) ref).payBills();
        ref = new XYZ();
        if (ref instanceof ABC)
            ((ABC) ref).payBills();
        else
            System.out.println("Wrong Bank!!!!");
    }
}

现在ref的类型为ABC,而ref的值被XYZ覆盖。那么ref的实例怎么可以ABC, considering payBills is a method in both the class ABC and XYZ`?

3 个答案:

答案 0 :(得分:-1)

首先,refBank

Bank ref = new ABC();

鉴于Bank是一个接口,ABC实现了这个接口,这很好;这种方法被称为"编程到接口"。只要您通过接口引用类,就可以互换使用任何实现的子类。

接下来,您对ABC进行了多余转换:

((ABC) ref).payBills();

由于refABC的实例支持,因此根本无法执行此投射。

然后重新分配 refXYZ的实例。同样,这是合法的,就像分配给ABC是合法的一样:

ref = new XYZ();

现在,您执行了一项奇怪的instanceof检查,我们知道 ref不是由ABC的实例支持,但我们会检查无论如何。请注意:您已重新分配 ref,因此现在由XYZ支持。

if (ref instanceof ABC)

该语句中ref的支持实例将 从不 作为ABC的实例后,您已将其重新分配给{ {1}}。

答案 1 :(得分:-1)

  

现在var sum = +''; str = 'one two three four five'; int = 5; words = str.split(/ /); for (var i = 0; i < int; i++) { l = words[i].length; sum += l; } console.log(sum);的类型为ref,ref的值被ABC覆盖。

没有。这很困惑。 XYZ仍为ref类型,其引用的对象已变为Bank类型。

  

那么XYZ的实例怎么可能是ref

在分配到ABC之后,它不能。

  

考虑new XYZ()是课程payBills()ABC中的一种方法吗?

不相关。

答案 2 :(得分:-2)

如果我正确理解了这个问题,那么声明变量:

interface Bank {}
class ABC implements Bank {}
class XYZ implements Bank {}
Bank ref;

如果ABCXYZ之间没有继承关系,那么你就不能从一个转换为另一个。这意味着if问题将评估为false,否则您将在运行时获得ClassCastException

编辑: 根据评论,这是我尝试的代码。 If语句被省略了。  这是一个完整的工作方式,您可以复制粘贴到您的IDE:

public class Test {

    public static void main(String[] args) {
        Bank ref;
        // i/f ref can directly refer to ANY concrete imple cls instance Bank
        ref = new ABC();// up casting
        ref.withdraw(123, 345);// DMD
        // ref.payBills(); 
((ABC) ref).payBills();
        ref = new XYZ();
            ((ABC) ref).payBills();
    }

    public static interface Bank {
        void withdraw(int i, int j);
        void payBills();
    }

    public static class ABC implements Bank {

        @Override
        public void withdraw(int i, int j) {
            System.out.println("ABC");
        }
        @Override
        public void payBills() {
            System.out.println("ABC payBills");
        }
    }

    public static class XYZ implements Bank {

        @Override
        public void withdraw(int i, int j) {
            System.out.println("XYZ");
        }
        @Override
        public void payBills() {
            System.out.println("XYZ payBills");
        }
    }
}

输出:

ABC
ABC payBills
Exception in thread "main" java.lang.ClassCastException: test.Test$XYZ cannot be cast to test.Test$ABC
    at test.Test.main(Test.java:15)