在Java中,属性类如何为其“父”类调用方法?

在Java中,属性类如何为其“父”类调用方法?,java,android,events,Java,Android,Events,我正在开发一个Android应用程序 对于某些任务,我有一个activity parentActivity和一个子类 我在parentActivity中还有一个隐藏的文本视图。我想从子类中显示这个textView,但我不知道怎么做 我想我可以从子类调用parentActivity方法。我该怎么做 public class ParentActivity extends Activity { private SomeClass mSomeClass; ... } 我想从mSomeCl

我正在开发一个Android应用程序

对于某些任务,我有一个activity parentActivity和一个子类

我在parentActivity中还有一个隐藏的文本视图。我想从子类中显示这个textView,但我不知道怎么做

我想我可以从子类调用parentActivity方法。我该怎么做

public class ParentActivity extends Activity
{
   private SomeClass mSomeClass;

   ...
}
我想从mSomeClass调用ParentActivity

在C语言中,我使用事件监听器来实现这一点

我需要更多的细节告诉我


谢谢。

如果SomeClass是ParentActivity的非静态内部类,则只能从SomeClass直接调用ParentActivity中的方法

public class ParentActivity {

  protected void parentActivityMethod() {
    System.out.println( "Method called" );
  }

  protected class InnerSomeClass { // This could extend SomeClass
    protected void callParentMethod() {
      parentActivityMethod();
    }
    // Maybe override SomeClass methods to invoke ParentActivity methods?
  }

  private InnerSomeClass someClass;

  public ParentActivity() {
    this.someClass = new InnerSomeClass();

    someClass.callParentMethod(); // Will print "Method called"
  }


}
这要求在ParentActivity中实例化someClass

public class ParentActivity {

  protected void parentActivityMethod() {
    System.out.println( "Method called" );
  }

  protected class InnerSomeClass { // This could extend SomeClass
    protected void callParentMethod() {
      parentActivityMethod();
    }
    // Maybe override SomeClass methods to invoke ParentActivity methods?
  }

  private InnerSomeClass someClass;

  public ParentActivity() {
    this.someClass = new InnerSomeClass();

    someClass.callParentMethod(); // Will print "Method called"
  }


}
或者,当实例化SomeClass对象时,可以传递对ParentActivity对象的引用。这还需要编辑SomeClass定义

原来的答案不再适用:

您可以通过super关键字调用super类的方法

一个简单的例子:

public class Parent {
  protected String s1;
  protected void m1() {
    System.out.println( "PARENT M1" );
  }
}

public class Child extends Parent {

  protected void m1() {
    System.out.println( "CHILD M1" );
  }

  public String doSomething() {
    super.m1(); // Prints PARENT M1
    m1(); // Prints CHILD M1

    return s1; // Same as super.s1 because s1 has not been redeclared

  }

  public static void main( String args[] ) {
    new Child().doSomething();
  }

}

如果SomeClass是ParentActivity的非静态内部类,则只能从SomeClass直接调用ParentActivity中的方法

public class ParentActivity {

  protected void parentActivityMethod() {
    System.out.println( "Method called" );
  }

  protected class InnerSomeClass { // This could extend SomeClass
    protected void callParentMethod() {
      parentActivityMethod();
    }
    // Maybe override SomeClass methods to invoke ParentActivity methods?
  }

  private InnerSomeClass someClass;

  public ParentActivity() {
    this.someClass = new InnerSomeClass();

    someClass.callParentMethod(); // Will print "Method called"
  }


}
这要求在ParentActivity中实例化someClass

public class ParentActivity {

  protected void parentActivityMethod() {
    System.out.println( "Method called" );
  }

  protected class InnerSomeClass { // This could extend SomeClass
    protected void callParentMethod() {
      parentActivityMethod();
    }
    // Maybe override SomeClass methods to invoke ParentActivity methods?
  }

  private InnerSomeClass someClass;

  public ParentActivity() {
    this.someClass = new InnerSomeClass();

    someClass.callParentMethod(); // Will print "Method called"
  }


}
或者,当实例化SomeClass对象时,可以传递对ParentActivity对象的引用。这还需要编辑SomeClass定义

原来的答案不再适用:

您可以通过super关键字调用super类的方法

一个简单的例子:

public class Parent {
  protected String s1;
  protected void m1() {
    System.out.println( "PARENT M1" );
  }
}

public class Child extends Parent {

  protected void m1() {
    System.out.println( "CHILD M1" );
  }

  public String doSomething() {
    super.m1(); // Prints PARENT M1
    m1(); // Prints CHILD M1

    return s1; // Same as super.s1 because s1 has not been redeclared

  }

  public static void main( String args[] ) {
    new Child().doSomething();
  }

}

mSomeClass不是ParentActivity的子活动。mSomeClass对包含它的类一无所知。这非常清楚地表明您的设计存在严重缺陷。您试图完成的是什么?

mSomeClass不是ParentActivity的子活动。mSomeClass对包含它的类一无所知。这非常清楚地表明您的设计存在严重缺陷。您想要完成的是什么?

您的家长活动保持不变

public class ParentActivity extends Activity
{
   private SomeClass mSomeClass;
}
你的课程需要一些小的变化

class SomeClass extends XYZ
{
    ParentActivity parent;        

    SomeClass(ParentActivity p)   //Constructor
    {
       this.parent = p;
       ......
    }

    public void someMethodWhereParentAccessIsRequired()
    {
        .....
        parent.doSomethingOnSomeTextView();
        ....
    }

}
最后,在ParentActivity内初始化mSomeClass时:

mSomeClass = new SomeClass(this)

您的家长活动保持不变

public class ParentActivity extends Activity
{
   private SomeClass mSomeClass;
}
你的课程需要一些小的变化

class SomeClass extends XYZ
{
    ParentActivity parent;        

    SomeClass(ParentActivity p)   //Constructor
    {
       this.parent = p;
       ......
    }

    public void someMethodWhereParentAccessIsRequired()
    {
        .....
        parent.doSomethingOnSomeTextView();
        ....
    }

}
最后,在ParentActivity内初始化mSomeClass时:

mSomeClass = new SomeClass(this)

我想你对什么是子类感到困惑。给我们看一些代码怎么样。@Falmari:我刚刚添加了一个示例。对不起,我想你对什么是子类感到困惑。给我们看一些代码怎么样。@Falmari:我刚刚添加了一个示例。对不起,对不起,我解释得不太清楚。我刚才在我的问题上加了一个例子。对不起,我解释得不太清楚。我刚刚在我的问题中添加了一个例子。MSOCCELASS是一个OpenGL渲染器,它使用C++来渲染一些东西。从C++中,我可以调用MSOCKLASS中的方法,但是我需要从PARTRONACTION调用一个方法来显示TeXVIEW。如果您是制作mSomeClass的人,并且可以更改构造函数,那么可以按照@Sarwar的建议执行,并将指针传递给父类。只是要小心存储对上下文的引用,因为这可能会导致内存泄漏。但是,在包含特定对象的对象中,没有通用的方法来调用方法。那么侦听器呢?这取决于你的课程。有很多方法可以使对象之间的通信成为可能。但是它与父/子活动无关,它完全取决于你想做什么。MSOCCELASS是一个使用C++来渲染东西的OpenGL渲染器。从C++中,我可以调用MSOCKLASS中的方法,但是我需要从PARTRONACTION调用一个方法来显示TeXVIEW。如果您是制作mSomeClass的人,并且可以更改构造函数,那么可以按照@Sarwar的建议执行,并将指针传递给父类。只是要小心存储对上下文的引用,因为这可能会导致内存泄漏。但是,在包含特定对象的对象中,没有通用的方法来调用方法。那么侦听器呢?这取决于你的课程。有很多方法可以使对象之间的通信成为可能。但它实际上与父/子活动无关,完全取决于你想做什么。