2012-04-06 82 views
2

在這兩個類中,我已經通過main方法在TestClass的getName方法中傳遞了TestClassTwo對象,現在我想調用getTwoName方法使用對象obj。有人可以幫助我。感謝 //下面是代碼 //的Class1如何使用「對象類」調用java中的用戶定義類的方法

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

}

回答

2

Object(超類)到TestClassTwo(子類):

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

或:

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

請注意,使用實例調用靜態方法是無用的。相反,使用類名來調用靜態方法:

String name = TestClassTwo.getTwoName(); 
0

爲什麼?您不需要使用任何對象,因爲該方法是靜態的。使用一個對象來調用這個方法是徒勞的。只需寫TestClassTwo.getTwoName()

[我強烈懷疑有什麼不對您的問題]

如果你真的需要通過這個類的一個對象訪問一個未知類的靜態方法,你這是怎麼做到這一點:

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

你是對的我無法正確解釋它。事情是,getTwoName()方法存在於許多不同的類中。所以,我試圖通過簡單地傳遞該類的類名或對象來訪問此方法。 – MayurCM 2012-04-06 07:10:59

+0

@MayurMaisuria在這種情況下,您需要根據我的編輯進行反思。 – EJP 2012-04-06 07:45:35

0

正如其他人所說,如果您打算以靜態方式訪問該方法,則不需要實例,因此根本不需要參數TestClass#getName。如果你希望它是一個實例方法,但是,你可以做的三兩件事之一:TestClass#getName

1)您可以在類型TestClassTwo

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()); 
    } 
} 
相關問題