2016-12-22 5 views
0

私はプログラミング初心者です。私は方法について学んでいて、その2つの違いを知りたい。なぜ私は自分の作成したメソッドを同じ方法で使用できないのですか?text.length();使用されていますか?Javaメソッドの構文

text.length(); 

text.selfMadeMethod(); instead of selfMadeMethod(text); 

編集:上記の私の例を書いているようですが、残念です。私が取り組んでいる練習を投稿して、私がやろうとしたことをより明確に示すことができます。

import java.util.Scanner; 

public class ReversingText { 
public static String reverse(String text) { 
    int x = text.length() -1; 
    String reverse = ""; 
    while (x >= 0) { 

     reverse += text.charAt(x); 
     x--; 

    } 
    return reverse; 
} 

public static void main(String[] args) { 
    Scanner reader = new Scanner(System.in); 
    System.out.print("Type in your text: "); 
    String text = reader.nextLine(); 
    System.out.println("In reverse order: " + reverse(text)); 
    System.out.println("In reverse order: " + text.reverse()); 
    } 
} 

最後のプリントステートメントは私がそれを試していただけで、エクササイズは私にそれを求めませんでした。再びこれが愚かな質問か不明瞭な場合は、申し訳ありませんが、ありがとうございます。

+4

これは言語の設計方法です。既存のクラスに任意のメソッドを追加することはできません(拡張することなく、 'final'クラスでは不可能です)。 – shmosel

答えて

1

なぜ私は自分の作成したメソッドをtext.length()と同じ方法で使用できないのですか?使用されていますか?

オブジェクトのメソッドを呼び出す必要があるためです。

しかし、クラスReversingTextのオブジェクトを作成していません。

オブジェクトは、クラス名(より正確には、クラスのコンストラクタ)が続くnewオペレーターを呼び出すことによって作成された

new ReversingText(); 

しかし、あなたが書いた方法は、それを意味staticキーワードを介してアクセスされています直接クラス名:

ReversingText.reverse("some string"); 

あなたは、クラス名を省略することができ、同じクラスにいるので、あなたは、あなたのコード内でそれを記述する必要はありません。

あなたがtext.length()のような独自のメソッドを使用したい場合は、3つの事をしなければならない。

  1. は、メソッドのシグネチャからstaticキーワードを削除します。
  2. ReversingTextのインスタンスを作成し、メインで変数に格納:
    ReversingText reversingText = new ReversingText();

  3. その変数に自分のメソッドを呼び出します。
    reversingText.reverse("some string");

3

のJava StringString.length()を持っている(とreverse(String)メソッドを持っていない)、それは(それはあなたがサブクラスそれがカスタムメソッドを追加することができないことを意味)finalクラスですので。あなたの質問に直接言及する価値はありませんが、既にStringBuilder.reverse()メソッドがあることに言及する価値があります。

1

あなたはJavaでクラスを再び開くことはできません。

textは文字列で、Stringクラスで定義された文字列にのみメッセージを送信できます。ああ、Stringクラスは独自の関数でクラスを拡張することはできません。これはJavaの残念な制限です。 Rubyのような他の言語では、クラスを再オープンすることができます。

この制限を回避するには、静的なreverse機能をStringUtilsクラスを作成し、

StringUtils.reverse(text) 
+0

これは幸運なことかもしれません。編集の必要はありません。 – shmosel

0

あなたは非常によく知られた言語機能、別名ポン引きマイライブラリについて尋ねているが、次のようにそれを使用することで一般的な方法。 Scala、Kotlin、C#などの言語にはすでにこの構文があります。しかし残念ながら、Javaにはまだそれがありません。

2

これはjavaのセマンティクスに関するものです。

public class SomeClass{ 
    public void someMethod(){ 

    } 
} 

上記のコードは、基本的SomeClassは任意のインスタンスは、次の方法で使用できる方法someMethodを有することを意味する:

SomeClass s = new SomeClass(); 
s.someMethod(); 

someMethodSomeClassのインスタンスメソッドと呼ばれています。つまり、someMethodは、クラスSomeClassのインスタンスの一部です。

一方

public void anotherMethod(SomeClass s){ 

} 

anotherMethodパラメータとしてクラスSomeClassのインスタンスを受け取り、次のように呼び出すことができることを意味:

anotherMethod(new SomeClass()); 

「がインスタンスメソッド」と「パラメータの違いに注意してください"

クラスは外部からは変更できません。つまり、クラスにメソッドを追加できる唯一の場所は、それぞれのクラスの定義内に直接あります。

1

あなたがすることによってメソッドを呼び出すときクラス/インスタンス名の後に置きます。これは、そのクラスに属するメソッドを呼び出していることを示します。いくつかの例:

  • text.length()textに割り当てられた値を用いて、(textでのインスタンスである)クラスStringにおけるメソッドlength()を呼び出します。
  • Math.random()は、クラスMathの静的メソッドrandom()を呼び出します。

メソッドが属するクラスは、メソッド自体の名前の前に指定する必要があります。クラスが指定されていない場合は、呼び出されたのと同じクラスに属しているとみなされます。

これは、例では第1の方法ではなく第2の方法で動作する理由です。 reverse(text)は、現在のクラスのreverse(String)メソッドを呼び出し、textを引数として渡します。 text.reverse()は、Stringreverse()メソッドを呼び出しますが、これは存在しません。