是这样的,比如我有一个基类(Animal),和两个子类(Dog和Cat),它们都有一个public void eat(){}方法,有一个测试类,class Test{
       public static void main(String[]args){
            Animal a1 = new Dog();
            Animal a2 = new Cat();
            //下面我用a1和a2 调用eat()方法,都可以得到相应的猫或狗的操作
             // 但是问题是:我在声明a1或a2时还不知道是要用Dog或是Cat的实例呢怎么办?
             // 我怎么能够根据传的参数进行动态的执行
             // Animal a = new Dog();或是new Cat()呢?
        }
   }谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【painforever】截止到2008-07-30 19:07:18的历史汇总数据(不包括此帖):
    发帖的总数量:4                        发帖的总分数:30                       每贴平均分数:7                        
    回帖的总数量:6                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:4                        结贴的总分数:30                       
    无满意结贴数:2                        无满意结贴分:20                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:50.00 %               无满意结分率:66.67 %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=painforever
      

  2.   

    public class Main {    public static void main(String[] args) {
            Animal obj = Factory.getAnimalInstance("Dog");
            obj.eat();
            obj = Factory.getAnimalInstance("Cat");
            obj.eat();
        }
    }abstract class Animal {    abstract public void eat();
    }class Dog extends Animal {    public void eat() {
            System.out.println("Dog eat");
        }
    }class Cat extends Animal {    public void eat() {
            System.out.println("Cat eat");
        }
    }class Factory {    public static Animal getAnimalInstance(String type) {
            try {
                return (Animal) Class.forName(type).newInstance();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }
    }
      

  3.   

    说句实话  我不懂lz再问什么问题class Animal{
    public void eat(){
    System.out.println ("I'm a animal!I want to eat something.");
    }
    }class Cat extends Animal{
    public void eat(){
    System.out.println ("I'm a cat!I want to eat something.");
    }
    }class Dog extends Animal{
    public void eat(){
    System.out.println ("I'm a dog!I want to eat something.");
    }
    }public class DogAndCat {
    public static void main (String args[]){
    Animal a1 = new Cat();
    Animal a2 = new Dog();

    a1.eat();
    a2.eat();
    }
    }
    I'm a cat!I want to eat something.
    I'm a dog!I want to eat something.
      

  4.   

    如果像2楼的那样,就是说Factory的getAnimalInstance的参数必须是"Cat"或者"Dog"了,除了Class.forName().newInstance()还有别的办法么?谢谢
      

  5.   

    我把你的代码运行了  报错了...  我菜鸟  帮我看看  谢谢
    java.lang.ClassCastException: Dog
    at Factory.getAnimalInstance(Main1.java:34)
    at Main1.main(Main1.java:4)
    Exception in thread "main" java.lang.NullPointerException
    at Main1.main(Main1.java:5)
      

  6.   

    我知道了  我知道问题出在哪儿了
    Class.forName(type)这个方法是不是返回一个type类  然后再用Class.forName(type).newInstance()实例化一个对象啊?
      

  7.   

    返回的是一个代表type(比如Dog或者Cat)的Class类的对象,不是type类.
      

  8.   

    Java的还在学,不太懂,但好像在C++里你只要传个父类的引用就可以帮你搞定了,当然你的eat()要变成:virtual void eat(){};了,C++的多态机制会自动帮你调用相应的eat()的,你可以看看这方面的资料,我想可能对你有帮助。
      

  9.   

    还想再问一下,除了Class.forName("类名")的方法之外,还有别的能动态生成类的方法不,谢谢
      

  10.   

    ZangXT兄,你说的使用反射,可以直接得到构造方法并调用,可以使用带参数的构造方法,能举个例子么?
    另,谢谢你一直回帖,帮我解惑啊~