我已经阅读了一些关于实例化界面的问题,但是其中一个都没有解决我的问题,或者我没有完全理解发生了什么。
Observer observer = (Observer) observers.elementAt(i);
我从未遇到过这样的陈述。看起来像是一种实例化对象的奇怪方式。但是,Observer
是interface
,此语句的类(abstract
,如果有任何影响),则不会实现interface
。
有人能向我解释究竟发生了什么吗?
答案 0 :(得分:3)
该语句正在从某种集合中检索对象。该对象显式转换为类型Observer
并分配给observer
变量。该对象未被实例化,只是被检索。显式强制转换使得此语句稍微有点危险,因为无法保证从集合实现Observer
中检索的对象。
答案 1 :(得分:0)
首先,它没有实例化任何东西,它只是从一个集合中抓取一个Observer
实现的实例(我假设它是Vector
的方法名称。)
所以这就是正在发生的事情
Vector observers = new Vector();
observers.add(new ObserverImpl());
Observer o = (Observer) observers.elementAt(0);
请注意,这是一种非常古老的做事方式,您不应再使用Vector
而应始终使用泛型,因此应将此代码重写为
List<Observer> observers = new ArrayList<>();
observers.add(new ObserverImpl());
Observer o = observers.get(0); //you don't need to cast anymore because of generics
答案 2 :(得分:0)
接口是一种合同,可确保实现在该接口上定义的方法。如果一个对象实现了一个接口,它必须要满足它上面定义的所有方法。
在您的代码示例中,对象被强制转换为Observer
类型的变量,这意味着您可以调用任何Observer方法。它不会改变对象,也不会实例化。
答案 3 :(得分:0)
首先,抽象类是一个无法实例化的类,有时候只有一个方法抽象,有时候整个类都是抽象的。你必须extend
这样一堂课。它允许您在基类中实现功能。
接口是类的合约,由关键字implements
实现。它为您提供方法调用,接口中没有函数。
现在回答你的问题:
Observer observer = (Observer) observers.elementAt(i);
这确保了一个对象(包含类似:equals,hashCode或toString的方法)具有接口的方法。
ex in pseudocode:
interface Printable{
String print();
}
及其“实施”:
public class MyDocument implements Printable{
@Override
public String print(){
// do the print thing
}
public void additionalMethod(){
// do some other stuff
}
}
及其使用
Printable doc = new MyDocument(); // now we ensure that we can call .print()
答案 4 :(得分:0)
接口是其实现类的合同。编写您遇到的代码是完全合法的。 让我们通过一个简单的例子来理解这一点:
创建一个界面Animal
public interface Animal {
public void eat();
}
创建两个实现类,即实现此接口的Horse和Cat。
public class Cat implements Animal {
public void eat() {
System.out.println("Cat eats Mouse.");
}
}
public class Horse implements Animal {
public void eat() {
System.out.println("Horse eats hay.");
}
}
现在使用Tesy类测试行为:
public class Test {
public static void main(String[] args) {
Horse h = new Horse();
Cat c = new Cat();
Animal a = (Animal)h;
a.eat();
a = (Animal)c;
a.eat();
}
}
输出结果为:
Horse eats hay.
Cat eats Mouse.
这种行为支持动态多态或运行时多态。 即使你有Animal对象的引用,你也可以使用Horse或Cat的对象来实现这些方法,这样你就可以调用它们。保存实现它的类的对象的Animal引用只能调用在Animal。接口中声明的那些方法。