对不起初学者的问题,我的google-fu让我失望了。
我有一个界面,我们称之为Foo。 并且有两个类都实现了Foo(Bar1,Bar2)。
代码执行类似
的操作private Foo foovar;
继续正常使用foovar。 foovar是Bar1类的一个实例。
有人可以解释为什么会发生这种情况,如何将其更改为Bar2的实例?
谢谢。
答案 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类的实例。