如何使用“Object Class”来调用java中用户定义类的方法

时间:2012-04-06 06:55:19

标签: java

在这两个类中,我已经从main方法在TestClass的getName方法中传递了TestClassTwo的对象,现在我想使用对象obj调用getTwoName方法。有人可以帮助我。谢谢 //下面是代码 // class1

package Test;

public class TestClassTwo {

    public static String getTwoName()
    {
        return "2nd";
    }

}

// class2

包测试;

公共类TestClass {

public void getName(Object obj) throws InstantiationException, IllegalAccessException, ClassNotFoundException
{
    //  call getTwoName method of TestClassTwo using obj object
}
public static void main(String args[]) throws InstantiationException, IllegalAccessException, ClassNotFoundException
{
    TestClass tc=new TestClass();
    tc.getName(new TestClassTwo());
}

}

3 个答案:

答案 0 :(得分:2)

Object(超类)强制转换为TestClassTwo(子类):

String name = ((TestClassTwo) obj).getTwoName();

或:

TestClassTwo temp = (TestClassTwo) obj
String name = temp.getTwoName();

请注意,使用实例调用静态方法是没用的。而是使用类名来调用静态方法:

String name = TestClassTwo.getTwoName();

答案 1 :(得分:0)

为什么呢?您不需要使用任何对象,因为该方法是静态的。使用对象来调用此方法是徒劳的。只需写下TestClassTwo.getTwoName()

[我强烈怀疑你的问题有问题。]

如果你真的需要通过该类的对象访问未知类的静态方法,那么你就是这样做的:

String twoName = obj.getClass().getMethod("getTwoName").invoke(null);

答案 2 :(得分:0)

正如其他人所说,如果您打算静态访问该方法,则不需要实例,因此您根本不需要TestClass#getName中的参数。但是,如果您确实希望它是实例方法,则可以执行以下三种操作之一:

1)参加 TestClassTwo TestClass#getName

public class TestClass {
    public void getName(TestClassTwo obj) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        String name = obj.getTwoName();
        // Do something with 'name'
    }
    public static void main(String args[]) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        TestClass tc=new TestClass();
        tc.getName(new TestClassTwo());
    }
}

2)将对象投射到 TestClassTwo 的实例,检查类型:

public class TestClass {
    public void getName(Object obj) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if (obj instanceof TestClassTwo) {
            TestClassTwo two = (TestClassTwo) obj;
            String name = two.getTwoName();
            // Do something with 'name'
        } else {
            // Handle failure accordingly (throw an exception, log an error, do nothing, etc.)
        }
    }
    public static void main(String args[]) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        TestClass tc=new TestClass();
        tc.getName(new TestClassTwo());
    }
}

3)如果您想允许其他类具有 getTwoName() 功能,请定义一个接口并将该接口的实例作为参数 TestClass#getName

public interface HasTwoName {
    public String getTwoName();
}

public class TestClassTwo implements HasTwoName {
    @Override
    public String getTwoName() {
        return "2nd";
    }
}

public class TestClass {
    public void getName(HasTwoName obj) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        String name = two.getTwoName();
        // Do something with 'name'
    }
    public static void main(String args[]) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        TestClass tc=new TestClass();
        tc.getName(new TestClassTwo());
    }
}