从派生类的实例访问基类方法

时间:2018-05-24 10:19:33

标签: java inheritance

我有一个带有公共方法的基类。

`public class ClassA {
   private int a;
   public void setA() {
    a = 15;
    System.out.println(a);
   }
 }`

然后,有一个扩展ClassA的ClassB,

`public class ClassB extends ClassA {
   public void test() {
      setA();
   }
 }`

现在,在main()中,我创建了一个ClassB实例。实例无法访问方法setA()test()

`public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
   Class<?> cls = ClassB.class;
   Object obj = cls.newInstance();
   obj.setA(); //Not Accessible
   obj.test(); //Not Accessible

}`

有人可以告诉我哪里出错了吗?

5 个答案:

答案 0 :(得分:0)

正如评论中已经回答的那样,您应该将obj转换为Class:

public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
           Class<?> cls = ClassB.class;
           Object obj = cls.newInstance();
           ((ClassB) obj).setA();
           ((ClassA) obj).setA();
           ((ClassB) obj).test();

        }

答案 1 :(得分:0)

您正在通过调用BuiltinFormats创建新的Object。但是,由于我们确定返回的对象将是我们想要的类,我们可以毫无问题地进行转换:

cls.newInstance()

如果没有转换为ClassB,返回的对象将被视为public static void main( String[] args ) throws IllegalAccessException, InstantiationException { Class<?> cls = ClassB.class; ClassB obj = (ClassB)cls.newInstance(); obj.setA(); //Accessible now obj.test(); //Accessible now } ,因此只包含由其定义的methods

但是,正如大多数评论已经说过,使用new运算符简单地创建类型的新实例通常要容易得多:

java.lang.Object

答案 2 :(得分:0)

您可以使用ClassB obj = new ClassB();

正常实例化obj

您可以尝试这样的事情:

ClassB obj = new ClassB();
obj.setA(); //Accessible
obj.test(); //Accessible

或者,为了进一步改善Abhishek的答案:

  Class<?> cls = ClassB.class;
  ClassB obj = (ClassB) cls.newInstance();
  obj.setA();
  obj.setA();
  obj.test();

注意:这会创建ClassB类型的obj。如果你只需要Object类型,你可以每次都将它转换为ClassB类型:

 Class<?> cls = ClassB.class;
 Object obj = cls.newInstance();
 ((ClassB) obj).setA();
 ((ClassA) obj).setA();
 ((ClassB) obj).test();

如果您想在评论中提出这个问题,如果您只知道cls,则可以进行类型转换:

Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).test();

答案 3 :(得分:0)

Object是所有类的基类,但在这种情况下,它不知道setA()方法和test()方法。你可以这样做。

If(merge(i).MessageNumber = merge1(j).MessageNumber1) Then
   Console.WriteLine("all fileds matched")

答案 4 :(得分:0)

class ClassA {
       private int a;

       public void setA() {
        a = 15;
        System.out.println(a);
       }
     }

      class ClassB extends ClassA {
          public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
               Class cls = ClassB.class;
               ClassB obj = (ClassB) cls.newInstance();
               obj.setA(); //Accessible
               obj.test(); // Accessible

            }
           public void test() {
              setA();
           }
         }

应该是这样的。

您想通过它的名称实例化一个类吗?

首先,您需要创建一个Class对象:

Class cls = Class.forName(strClassName); 然后实例化它(注意,这可以抛出各种异常 - 访问冲突,ClassNotFound,没有参数的公共构造函数等。)

Object instance = cls.newInstance();

然后你可以施展它:

return(SomeClass)实例; 请确保您了解以下各项之间的区别:

班级名称(大约是文件名) 类对象(本质上是类型信息) 类实例(此类型的实际对象) 如果需要,您还可以将cls对象强制转换为Class类型。但是,它并没有给你带来太多帮助。你可以将它内联到:

return(SomeClass)(Class.forName(strClassName).newInstance()); 哦,但你可以在实例化之前用cls对象进行类型检查。所以你只需要实现它,如果它满足你的API(实现你想要的接口)。

编辑:向反思添加更多示例代码。

例如:

if (cls.isInstance(request)) {
  // ...
}