1

私は初心者で、家庭教師がさまざまな方法について話している youtube のチュートリアルを見ていました。彼はJavaで値を返すことについて話しましたが、私はそれについて何も理解していませんでした. 最初にスクリプトを共有し、次に私の考えや質問を共有します。

class1 スクリプトは次のとおりです。

import java.util.Scanner;
class class1{
public static void main(String args[]){
    System.out.println("This is class1.");
    Scanner x = new Scanner(System.in);
    System.out.print("Please enter the name of your first gf here:");
    String name = x.nextLine();

    class2 class2obj = new class2();
    class2obj.setname(name);
    class2obj.tellname();
}
}

ご覧のとおり、main メソッドがあり、何をするかというと、最初に最初のガールフレンドの名前を尋ね、それを変数に格納しますname。次に、後で共有するclass2スクリプトをリンクし、class2でsetnameメソッドを実行します。

class2スクリプトは次のとおりです。

class class2{
    private String girlname;
    public void setname(String name){
    girlname = name;
}
public String returnname(){
    return girlname;
}
public void tellname(){
    System.out.printf("your first girlfriend was %s",returnname());
}
}

では、メソッドが の値をプライベート変数に設定しclass2ていることがわかりますが、私の質問は、それが何を返すのかということです。なぜこのメソッドが必要なのですか? メソッド間の変数には絶対に不可欠ですか? また、メソッドでを返すことができないのはなぜですか?setnamenamegirlnamereturnnamegirlnamesetname

返品については何も知らないので、動画や記事がとても参考になります。また、これが、上記の私の発言が奇妙に感じる場合の理由です。

returnnameまた、メソッドとメソッドが何をしているのか教えてくださいtellname

また、class1私たちは実行しましclass2obj.tellnameたが、なぜ実行しなかったのclass2obj.returnnameですか?

私は今とても混乱しているので、ばかげた行動をとっていても気にしないでください。

4

8 に答える 8

6

まず、提供したコードが実際にチュートリアルで使用したコードである場合は、別のチュートリアルを選択してください。標準の Java 命名規則も尊重しません。

次に、あなたの質問に答えます。オブジェクトは、状態 (フィールド) と動作 (メソッド) の組み合わせです。一部のメソッドは、オブジェクトの状態を変更します。一部のメソッドを使用すると、オブジェクトの状態にアクセスできます。一部の方法では、両方を実行できます。一部のメソッドは、オブジェクトの状態やその他のオブジェクトを使用して何か有用なことを行います。

メソッドvoid setName(String name)は何も返しません。javadoc コメントがあり、クラス名とメソッド名が適切に選択されていれば、このコメントは次のようになります。

/**
 * Sets the name of this GirlFriend object. Replaces the previous name of
 * the girl friend with the new name given as argument
 */
public void setName(String newName) {
    this.name = newName;
}

このメソッドはオブジェクトの状態を変更し、何も返す必要はありません。その責任は名前を変更することであり、他には何もありません。新しい名前を返すことは、呼び出し元が既に知っているため、何の役にも立ちません: それを引数として渡しました。

後で、ガール フレンドの名前を知りたいと思うかもしれません。

/**
 * Returns the name of this GirlFriend object
 */
public String getName() {
    return this.name;
}

このメソッドには引数は必要ありません。ガールフレンドに名前を尋ねることができ、メソッドは名前を答えとして返します。

詳細については、良い本か、公式の Java チュートリアルを使用します。

于 2012-07-28T07:55:42.130 に答える
1

setname戻り値の型voidがあり、何も返さないことを意味します。この関数の動作は、後で取得できるように名前を保存することです。

returnname戻り値の型Stringがあり、以前に保存したものを取得したいときに呼び出されます。

ここで使用されているパターンは、あまり例示されていませんが、ゲッター/セッターです。それらは補完的ですが、非常に異なる (反対の) 動作をします。

セッターで値を返すこともできsetnameますが、それは (とにかく初心者にとって) 不必要な複雑さです。メソッドを単一目的で焦点を絞ってください。

tellname名前関連の出力をコンソールに出力するヘルパー関数です。

それにかんする:

また、class1 では class2obj.tellname を実行しましたが、なぜ class2obj.returnname を実行しなかったのでしょうか。

あなたは..ちょうどtellname()呼ばれたようにreturnname()。class1 のコードは、置き換えられる可能性があります

class2obj.tellname();

System.out.printf("あなたの最初のガールフレンドは %s でした", class2obj.returnname());

最後に、他の人が提案したように繰り返し/強調するには、新しいチュートリアルを見つけてください。

于 2012-07-28T07:56:56.113 に答える
1
  1. setName は何も返しません。正直なところ、それは何も意味しない特別なタイプのvoidです。
  2. Java 構文のポイントから girlname を返すことは可能ですが、別の getter が必要なため、ほとんどの場合意味がありません。Java Beangetter/setterの詳細を参照してください。また、このメソッドには 2 つの責任 (値を変更する、結果を返す) があり、これは良くありません。
  3. すでに理解しているようreturnnameに、getter メソッドであり、private 変数の値を取得するために使用されます。Java アクセス修飾子の詳細を参照してください。tellnameプリンターメソッドだけで、ガールフレンドの名前を標準出力に表示します。
  4. 文字列オブジェクトを返すためreturnname、その変数はメモリに保存され、 を使用して印刷できますSystem.out.println(class2Obj.returnname())。しかし、それを印刷する方法がありますが、なぜこれを行う必要があるのですか? 呼び出すだけclass2Obj.tellname()です(ただし、これは悪いアプローチです)

PS。Javaコードスクリプトの一部を呼び出さないでください:)

于 2012-07-28T08:05:33.897 に答える
0

これを理解するには、最初に OOP の概念と Java の基本について読んでください。ここでは簡単に説明しようと思います。

girlnameプライベート変数として宣言されているため、外部から直接アクセスすることはできませんclass2girlnameしたがって、クラスの外部から変数の値にアクセスするために、変数を設定して返す 2 つのメソッドが作成されます。

また、クラス 2classobj2.returnnameの変数の値を返し、それを表示する を使用することもできます。ここでは、変数の値を直接単純に出力するために使用されます。girlnameclassobj2.tellname

于 2012-07-28T07:54:04.067 に答える
0

returnname()およびsetname()は、getter および setter メソッドの例です (それぞれ)。これらはmutator メソッドとも呼ばれます。

これらのタイプのメソッドが存在する主な理由は、カプセル化を尊重することです。このチュートリアルは明らかに、これが不要な非常に単純な例ですが、ユーザーがデータベース内の情報を検索できるようにするシステムを構築していると想像してください。セッターメソッドを使用せず、代わりにデータベースによって実行されるクエリの一部となる変数にユーザーが直接アクセスできるようにすると、あらゆる種類の厄介なコードが挿入され、データベースがハッキングされる可能性があります (これはSQL インジェクションとして知られています)。攻撃)。これを防ぐには、ユーザーから変数を非表示にします (この例では、変数はprivate) を設定し、setter メソッドを使用して値を設定します。このメソッドは、例よりも複雑になる可能性があり、入力を見て不要な入力を削除します。もちろん、変数が非表示になったので、他のオブジェクトが値にアクセスする方法、つまり getter メソッドが必要です。

要約すると、より安全なシステムにつながり、開発者は変数へのアクセス方法を制御して誤用を防ぐことができます。非常に単純な例に取り組んでいますが、後で安全なシステムを構築する上で重要になるため、学習することをお勧めします。

于 2012-07-28T07:55:05.013 に答える
0

Java 関数は、何らかのアクションを実行するために作成したコードの一部です。このアクションの最後に答えが必要な場合もあれば、何かを行う必要がある場合もあります。答えが必要な場合は、特定のオブジェクトを返す関数を作成します。それ以外の場合は、その関数を void に設定します。そして、あなたは何も返しません。

setName を呼び出すと、アクションはオブジェクト名を設定することになるため、何も戻す必要はありません。returnName を呼び出すときは、答えが必要です-オブジェクト名は何ですか?そこで return ステートメントを使用します。

于 2012-07-28T07:57:02.400 に答える
0

girlnameisであるためprivate、他のオブジェクトからアクセスすることはできません。したがって、値を読み取る方法を提供しない限り、値を取得することはできません。

それは不可欠ですか?いいえ、しかしそれは良い習慣です。girlnameこれにより、知らないうちに他のオブジェクトが変更されるのを防ぎます。これは実際、OOP では非常に重要な概念です。

girlnameメソッドからを返すことは非常に便利ですsetnameが、ポイントは何でしょうか。すでに値を渡しているということは、すでに変数にアクセスしていることを示していますか?

tellName実際には、returnnameメソッドを使用して、テキストを表示するだけです。

を呼び出せない理由はありませんがreturnname、変数に代入しない限りあまり意味がありません

Learnng the Java Languageを読んでおくとよいでしょう。

于 2012-07-28T08:00:07.697 に答える
0

まず、これらのスクリプトは実際のクラス ソースですが、それは理解できます。言語が何であれ、初心者は用語をよく間違えます :)

これらの情報源で示されている規則は非常にひどいものであり、おそらく混乱を招く可能性がありますが、結論として、すべての変数にはスコープがあります。一言で言えば、スコープとは、変数を使用できる場所を意味し、スコープは、奇妙な副作用や、修正が困難またはまったく不可能なバグを回避するために、適切なコードで処理する最も重要なものの 1 つと見なされます。

上記ではclass2、実際には正しいです。フィールドクラスプライベートスコープにあるため、メソッド呼び出しreturnname()は実際には必要ありません。つまり、クラス内のすべてのメソッドは、その特定のフィールドを直接見ることができます。tellname()private String girlname

あなたも尋ねる

why isn't it posible to return the girlname in the setname method?

これは実際には可能ですが、既に述べたように、ここのコードは通常の Java とは非常に型破りであり、間違いなく混乱を引き起こしています。getX/setX メソッドの命名規則は、プロパティ パターンとして知られているものです。これは、型のプライベート フィールドを持つクラスがFoo2 つのパブリック スコープ メソッドを公開して、クラスのユーザーがそのフィールドを変更できるようにする規則です。この規則は JavaBeans の一部です。JavaBeans は、今すぐ脇に置いておくべき非常に大きなトピックなので、自分で読みたいと思うかもしれません。これを示す単純なクラスは次のようになります。

public class FooFieldBean {
    private Foo field;

    public Foo getFoo() {
        return field;
    }

    public void setFoo() {
        this.field = field;
    }
}

ちょっとしたおまけとして、一般的な Java 規則に一致するようにクリーンアップされた 2 つのクラス ソースを次に示します。大文字、空白の使用、インデントに注意してください。

import java.util.Scanner;
public class Class1 {
    public static void main(String[] args) {
        System.out.println("This is Class1.");
        Scanner x = new Scanner(System.in);
        System.out.print("Please enter the name of your first gf here:");
        String name = x.nextLine();

        Class2 class2obj = new Class2();
        class2obj.setName(name);
        class2obj.tellName();
    }
}


public class Class2 {
    private String girlName;

    public void setName(String name) {
        girlName = name;
    }

    public String getName() {  
        return girlName;
    }

    public void tellName() {
        System.out.printf("your first girlfriend was %s",getName());
    }
}
于 2012-07-28T08:01:54.153 に答える