如何使用对象的函数作为另一个类的函数的参数来访问?

时间:2019-04-11 05:10:32

标签: java object methods

这是我要实现的目标:

public class cls1{
  public cls1(){}                        //constructor for the sending class
  String name = "foo";                   //String I wish to access
  public String sentName(){              //Method to access the string outside
    return name;
  }
}

public class cls2{                       //Class where I wish to access the name
  public String gotName(Object obj){     //Method where I wish to call the cls1 instance
    String recvName;                     
    if(obj.getClass()==cls1.class){
      recvName = obj.sentName();         //THE PROBLEM
    }
    return recvName;
  }
}

我确实知道obj直到运行时才具有cls1的方法和变量,因此无法编译该行。有没有办法做到这一点?

P.S。我还尝试在cls1中创建cls2的实例:

cls1 cls1Inst;
obj=cls1Inst;
cls1Inst.sentName();

但是这给出了一个nullpointer异常,可能是因为我试图访问cls1的方法而没有实际创建它的实例(我对nullpointer不太清楚,对不起,请原谅)。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您不能在对象类object上调用sendName()。您需要先将其转换为cls1类。

public class cls2{                       //Class where I wish to access the name
  public String gotName(Object obj){     //Method where I wish to call the cls1 instance
    String recvName;                     
    if(obj.getClass()==cls1.class){
      cls1 cls1Obj = (cla1)obj;
      recvName = cls1Obj.sentName();         //THE PROBLEM
    }
    return recvName;
  }
}

答案 1 :(得分:0)

对象是每个对象的基类。首先,您必须使用cls1进行类型转换,然后可以使用cls1个方法。

更改

recvName = obj.sentName(); 

recvName = ((cls1)obj).sentName();

在此代码中

cls1 cls1Inst;  // here it is uninitilized (null)
obj=cls1Inst;    //<------ after this statement cls1Inst will be same and null
cls1Inst.sentName();// thats why it throws null pointer exception

此代码将起作用

cls1 cls1Inst;  // here it is uninitilized (null)
cls1Inst = (cls1)obj;    // if obj is not null then typecast it. Now it is assigned to cls1Inst
cls1Inst.sentName(); // it will work perfect file

已更新

或者您可以将函数参数类型从Object更改为cls1。这样可以避免额外的检查类类型的检查。参见下面的代码。

public String gotName(cls1 obj){                     
      return obj.sentName();// No need to check class type. just return name
  }