2

私はJavaの概念をクリアしています。Java に関する私の知識は非常に初心者向けなので、ご容赦ください。

静的メソッドと非静的メソッドのインターコールを理解しようとしています。知っている -

  1. 静的メソッドは、同じクラス内の名前だけで別の静的メソッドを呼び出すことができます。
  2. 静的メソッドは、クラスのインスタンスを作成した後でのみ、同じクラスの別の非静的メソッドを呼び出すことができます。
  3. 非静的メソッドは、単に classname.methodname を介して同じクラスの別の静的メソッドを呼び出すことができます - これが正しいかどうかわかりませんか?

私の質問は、同じクラスの別の非静的メソッドへの非静的メソッド呼び出しに関するものです。クラス宣言では、すべてのメソッドを宣言するときに、非静的クラスから同じクラスの別の非静的メソッドを呼び出すことができますか?
例を挙げて説明してください。ありがとうございました。

4

5 に答える 5

7

#3 は正しいです。classname.methodname を使用して、非静的メソッドから静的メソッドを呼び出すことができます。

そして、あなたの質問は、クラス内の非静的メソッドを他の非静的メソッドから呼び出すことができるかどうかを尋ねているようです。これも可能です(そして最も一般的に見られる)。

例えば:

public class Foo {

public Foo() {
    firstMethod();
    Foo.staticMethod(); //this is valid
    staticMethod(); //this is also valid, you don't need to declare the class name because it's already in this class. If you were calling "staticMethod" from another class, you would have to prefix it with this class name, Foo
}

public void firstMethod() {
    System.out.println("This is a non-static method being called from the constructor.");
    secondMethod();
}

public void secondMethod() {
    System.out.println("This is another non-static method being called from a non-static method");

}

public static void staticMethod() {
    System.out.println("This is the static method, staticMethod");
}
}
于 2012-07-09T21:14:36.093 に答える
2

メソッドは、まずクラスまたはインスタンスのいずれかに意味的にバインドされている必要があります。

何かの List には長さまたはサイズがあるため、特別な List のサイズを要求します。を呼び出すには、そのクラスのオブジェクトが必要です.size ()

静的メソッドの典型的なよく知られた例はInteger.parseInt ("123");. その時点では Integer インスタンスはありませんが、作成したいと考えています。

そのメソッドをインスタンスにバインドする場合は、それを String インスタンスにバインドします。これは理にかなっています。

int a = "123".parseInt ();

それは合理的な選択でしたが、float、double、long、short、Boolean、および対称的な「toString」メソッドを持つすべてのクラスの同様のメソッドを String に配置する必要があることを意味します。これは、String クラスに無数の拡張機能を追加することを意味していました。

代わりに String は final であるため、そのようなメソッドを配置する適切な場所は、Integer や Float などのターゲット クラスです。

于 2012-07-09T21:22:13.460 に答える
0

質問を正しく理解しているかどうかはわかりませんが、非静的メソッドは OO でクラスを設計する標準的な方法です。たぶん、このサンプルは議論の火付け役になるでしょう:

public class MySampleClass{

   private void methodA(){
       System.out.println('a called');
   }

   public void methodB(){
       this.methodA();
       staticMethod(this);
   }

   private static void staticMethod( MySampleClass inst ){
       inst.methodA(); 
   }
}
于 2012-07-09T21:14:00.813 に答える
0

そのメソッドを呼び出したいオブジェクトへの明示的な参照を使用してsomeObject.method、またはそのオブジェクトを指定せずに、非静的メソッドから非静的メソッドを呼び出すことができますsomeMethod()(この場合、現在の非静的を呼び出しているのと同じオブジェクトで呼び出されます)方法)。

多分これはそれをよりよく示します

class Demo {
    private String name;

    public Demo(String n) {
        name = n;
    }

    public String getName() {// non static method
        return name;
    }

    public void test(Demo d) {// non-static method
        System.out.println("this object name is: "+getName());// invoking method on this object
        System.out.println("some other object name is: "+d.getName());// invoking method on some other object
    }
    //test
    public static void main(String[] args) {
        Demo d=new Demo("A");
        Demo d2=new Demo("B");
        d.test(d2);
    }
}

出力:

this object name is: A
some other object name is: B
于 2012-07-09T21:28:34.763 に答える
0
public class TestClass{

  public static void testStatic(){
   System.out.println("test1");
  }

  public void testNonStatic(){
    System.out.println("test2");
  }

  public void test1(){
    // both is valid
    testStatic();  
    TestClass.testStatic();

    // this is valid, cause it can call the method of the same instance of that class
    testNonStatic();   
    this.testNonStatic();

    // this is not valid, cause without a concrete instance of a class you cannot call
    // non static methods
    TestClass.testNonStatic();
  }

  public static void test2(){
    // again these are both correct
    testStatic();  
    TestClass.testStatic();

    // this doesn't work, cause you cannot call non static methods out of static methods
    testNonStatic();   
    this.testNonStatic();

    // this instead does work cause you have a concrete instance of the object
    TestClass myTestClass = new TestClass();
    myTestClass.testNonStatic();

    // this still doesn't work
    TestClass.testNonStatic();
  }

}
于 2012-07-09T21:17:54.003 に答える