更改接口Java的已使用实现

时间:2013-12-13 11:30:31

标签: java interface

对不起初学者的问题,我的google-fu让我失望了。

我有一个界面,我们称之为Foo。 并且有两个类都实现了Foo(Bar1,Bar2)。

代码执行类似

的操作
private Foo foovar;

继续正常使用foovar。 foovar是Bar1类的一个实例。

有人可以解释为什么会发生这种情况,如何将其更改为Bar2的实例?

谢谢。

5 个答案:

答案 0 :(得分:3)

您可以使用instanceof检查它是否是实例,如果它是您可以转换的实例,则通过强制转换它Bar1 b = (Bar1)Foo

另一方面,Bar1不是Bar2 - 你不能直接将一个转换为另一个,除非它们提供(或你写)方法。例如,你可能有一个Bar2的构造函数,它接受一个Bar1。

除此之外,您描述的行为是继承如何工作的基本部分。阅读继承,如果你有更具体的问题,请回来。

答案 1 :(得分:3)

使用Factory Design模式通过传递类型等信息来获取具体类的对象。请查看以下示例

 interface vehicle
{ 
    void start();
    void stop();
} 
class car implements vehicle
   {
public void start()
{
    System.out.println("Start car");
}
public void stop()
{
    System.out.println("Stop car");
}
}
class bike implements vehicle
{
public void start()
{
    System.out.println("Start bike");
}
public void stop()
{
    System.out.println("Stop bike");
}
}
class factory
 {
    public static vehicle getVehicle(int ch)
        //(?)sould be interface type
        {
            vehicle v=null;//local always inialize otherwise error
            //car c=new car();
            //bike b=new bike();
            if(ch==1)

                v=new car();


            else
                v=new bike();
                return v;


        }
 }
 class factorymain
  {
public static void main(String[] args) 
{
    vehicle v;
    v=factory.getVehicle(Integer.parseInt(args[0]));
    v.start();
    v.stop();

}
}

答案 2 :(得分:2)

请参阅,接口指定实现它的特定类必须具有的基本强制功能集。假设你有一个界面“动物”

public interface Animal
{
 public void eat();
 public void sleep();
}

public class Dog implements Animal
{
 public void eat()
 {
  // do something..
 }
public void sleep()
{
 // do something..
}

}

所以你可以做的其他地方,

Animal a = new Dog();

工作正常..因为每只狗都是动物,它受到睡眠和吃的约束(至少......)。

答案 3 :(得分:1)

如果foovar = new Bar1()那么不经意的foovar将是实例Bar1。如果您希望foovar变量保存Bar2的实例,则必须为其分配新的bar2实例。

答案 4 :(得分:0)

foovar是一个引用变量,可以引用Bar1和Nar2类的实例。