Java在父类中如何创建子类对象?

1、Public abstract class Animal{
public abstract Animal breed();
}
2、public class Fox extends Animal{
@Override
public Animal breed() {
Animal ret = null;
if ( isBreedable() && Math.random() < 0.5) {
ret = new Fox();
}
return ret;
}
}
3、public class Rabbit extends Animal{
@Override
public Animal breed() {
Animal ret = null;
if ( isBreedable()&& Math.random() < 0.12) {
ret = new Rabbit();
}
return ret;
}
4、问题:Fox.breed()和Rabbit.breed()几乎一样,
有什么好办法修改?注意Fox和Rabbit的breed()返回的具体类型不同。

你好,很高兴回答你的问题。
可以进行如下修改,将breed的实现移到抽象父类Animal中,略做修改,修改后代码如下
public Animal breed(){
Animal ret =null;
if(isBreedable() &&Math.random()<getValue()){
ret=getAnimal();
}
return ret;
}
父类Animal中增加如下两个抽象方法:
public abstract double getValue();
public abstract Animal getAnimal();
在Fox中不再需要实现breed,实现新定义的两个方法:
public abstract double getValue(){
return 0.5;
}
public abstract Animal getAnimal(){
return new Fox();
}
在Rabbit类中类似处理:
public abstract double getValue(){
return 0.12;
}
public abstract Animal getAnimal(){
return new Rabbit();
}
如果有帮助到你,请点击采纳。
我解答的大部分是软件开发新人遇到的问题,如果有兴趣可以关注我。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-08-17
其实这个问题算是如何应用设计模式里面的工厂模式, 在父类作为一个工厂去创建子类,前提是父类需要知道所有的子类。最简单的修改如下,关于返回的对象可以进行强制转换后使用。
Public abstract class Animal{
public Animal breed(){
Animal ret = null;
if ( this instanceof Fox && isBreedable() && Math.random() < 0.5) {
ret = new Fox();
} else if(this instanceof Rabbit && isBreedable() && Math.random() < 0.12){
ret = new Rabbit();
} // 都不满足的话我们返回null
return ret;
}
public class Fox extends Animal{

}

public class Rabbit extends Animal {

}
欢迎关注我的微公号: 某鸟碎碎, 推送各种java入门教学,java框架学习,顺便解答java学习问题。
第2个回答  2020-06-07
下面是三个子类:
Sub1 sub1=new Sub1();
Sub2 sub2=new Sub2();
Sub3 sub3=new Sub3();
对象数组:
Acar[] acars=new Acar[3];
赋值:
acars[0]=(Acar)sub1;
acars[1]=(Acar)sub2;
acars[2]=(Acar)sub3;
如果要调用这个对象数组中的第一个元素的方法(假如它实现了print1()方法)。需要这么写:
acars[0].print1();
相似回答