2

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

package Test;

public class TestClassTwo {

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

}

// 类 2

包装测试;

公共类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());
}

}

4

3 回答 3

2

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

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

或者:

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

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

String name = TestClassTwo.getTwoName();
于 2012-04-06T06:57:19.627 回答
0

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

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

如果您确实需要通过该类的对象访问未知类的静态方法,您可以这样做:

String twoName = obj.getClass().getMethod("getTwoName").invoke(null);
于 2012-04-06T06:59:34.720 回答
0

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

TestClassTwo 1)输入 类型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());
    }
}
于 2012-04-06T07:00:40.500 回答