Java - 引用不同类中的方法

时间:2011-08-04 02:38:27

标签: java inheritance extend

我来自C编程,所以我是OOP概念的新手。我的问题是:

我正在尝试测试一堆模块,所以我决定为常用功能编写一个包装类,所以我可以从其他类调用这些方法。但令我感到困惑的是,如果我从extends创建其他类myWrapperClass,我仍然不能使用包装类的方法,除非定义它们static(并且大多数教程都说尝试如果可能,请远离静态)或者我需要使用new创建包装类的新实例。

那么使用extends有什么意义呢?如果这是我必须去的方式,是否有任何捷径使用它们而不是每次都写myclass.wrapperclassfunction()

提前致谢。

4 个答案:

答案 0 :(得分:4)

  

所以我可以从其他类调用这些方法。但我困惑的地方是。如果我从myWrapperClass扩展其他类,我仍然不能使用包装类的方法,除非它们被定义为静态

这是假的。

你绝对可以这样做。

public class MyWrapperClass {

     public void commonMethod() {
     }

}

public class YourClass extends MyWrapperClass {

     public void anotherMethod() {
            commonMethod();
            // other stuff
     }
}

答案 1 :(得分:0)

如果通用功能在各种模块(子类)中是相同的方法,那么您可以将它从模块中分解为公共超类,并且只需将方法定义在那里。如果方法在每个子类中以不同的方式实现,但是无论您具有哪个子类实例,都希望以相同的方式调用它,那么您可以在超类中将其声明为abstract并在每个子类中都有一个实现子类。如果它介于两者之间 - 除了几个子类之外都有相同的实现 - 那么你可以将最常见的实现分解为超类并在异常子类中覆盖它。

答案 2 :(得分:0)

[编辑OP问题摘要]:

您需要查看Java中原语和对象类型之间的区别。

可以简单地声明和使用基本类型:

   int f; // Java (or is c? :)
   f = 10;

必须分配对象类型。 (对于C程序员:Java对象是动态分配的。想想堆,而不是堆栈。)

   Foo myFoo = new Foo(); // Java
   struct foo *myFoo = (struct foo *) malloc(sizeof(struct foo)); // good old C

- 初步回答 -

你的困惑在于:

在行之间阅读,似乎你认为通过只是通知类型系统存在基类的扩展,你应该能够神奇地开始调用类型的方法

这就是为什么你已经确定了静态方法的原因:它们不需要创建一个实例 - 显然你拒绝这样做了!

假设你有一些与Kai的答案(上面的顺序是正确的)相符的话。

然后:

/** using Kai's classes */
public void foobar() {
   YourClass foo = new YourClass();
   foo.commonMethod();  // try it ..   
}

查看您必须知道的只需struct中定义和使用C的内容。

现在忘记了这个:

  typedef struct {
          int foo;
          char bar[3];
  } extended;

  extended s;  // this is not just declaring s; it is also allocating it
  s.foo = 10;  // hey, no malloc. nasty Java insists on new ..

在Java中,当你说:

   SomeClass s; // s declared but not instantiated (think 'allocated')  

然后必须实例化该对象。

  s = new SomeClass(); 

答案 3 :(得分:0)

确保在包装类中声明你的wrapperclassfunction 不是私有

public class wrapperClasss{

private wrapperMethod(){}
}

public class Myclass extends wrapperClasss{

  private myMethod(){
    wrapperMethod();//this is a compile erro
   }
}