假设我们有A类作为父类,C类对它进行扩展。
class A
{
void m()
{
System.out.println("A.m");
}
}
class C extends A
{
@Override
void m()
{
System.out.println("C.m");
}
}当我们使用引用A a和C c指向相同的对象类型时,例如A a = new C();和C c = new C();,它们之间有什么区别
从这个问题:Java inheritance vs. C# inheritance,看起来像是a和c指向C的对象类型,使用它们似乎没有区别。
我测试了这段代码,它们都打印C.m。
class inherit {
void x(A a)
{
a.m();
}
public static void main(String[] args) {
System.out.println("hello");
A a = new C();
C c = new C();
a.m();
c.m();
new inherit().x(a);
new inherit().x(c);
}
}发布于 2013-02-17 12:34:08
这取决于对象要用来做什么。
如果你真正需要的是一个有A接口的对象(也就是A的类型),强烈推荐使用A a = new C();。这样可以清楚地表明你想要的是A接口,而不是C实现。以后当你改变主意时,你可以在不破坏其他代码的情况下安全地将其更改为A a = new Another_Subtype_Of_A();。
当A是一个接口时尤其如此(在您的例子中,A是一个类)。例如,如果你只是想要一个列表,List list = new ArrayList();显然比ArrayList list = new ArrayList();更好。这就是所谓的“编程到接口,而不是实现”。
如果你正在创建一个特别需要C接口的对象(尤其是那些没有出现在A中的接口),你最好选择C c = new C();。如果你写的是A a = new C(),你迟早还是要把这个对象转换成C(因为A没有你想要的所有接口),所以为什么要麻烦呢?
发布于 2013-02-17 12:17:57
这与变量的运行时类型无关。您可能只知道在编译时有一个Vehicle对象,并且根据用户输入,它可能是一个GarbageTruck或SportsCar。
GarbageTruck t;
...
t = new SportsCar(); //can't do this!
// so we do this:
Vehicle t;
if(user.isFast()) {
t = new SportsCar();
} else {
t = new GarbageTruck();
}发布于 2013-02-17 12:23:37
Java是关于接口和实现的。
接口只是一组公共字段(方法和属性),用于描述用户如何与实现接口的类进行交互。
实现是实际使这些方法和属性执行某些操作的代码。实现可以是对interface执行implements操作的类,也可以是其他实现的子类。
当您实例化一个类时,您编写的代码如下:
Interface a = new Implementation();很多时候,我们把接口和实现包装在一起……换句话说,当我们定义一个接口时,无论我们是否显式地实现了一个接口,我们都是在用我们编写的每个public方法定义一个接口。
因此,是接口影响了我们可以调用的方法,而是实现影响了我们调用它们时发生的事情。
https://stackoverflow.com/questions/14917903
复制相似问题