Codegym University コースの一部としてのメンターによる講義の抜粋。フルコースにお申し込みください。


「こんにちは、アミーゴ! あなたはすでに方法をよく理解しているようですが?」

「こんにちは、リシ。はい、私はすでにその先生のトリックを突破しました。私はそれほど悪くはなかったと言うでしょう、しかしあなたは私に言うでしょう、「いいえ、いいえ!あなたは何も理解していません。」 「」

「あなたは明らかに、特定の教師、おそらくディエゴとのチャットに多くの時間を費やしすぎています。とにかく...私はあなたがメソッドを十分に理解していることを願っています。結局のところ、今日はメソッドを説明するのに役立つ魔法の言葉をいくつか教えます「影響力の範囲」。

「興味深いですね。」

「実際、これはすべて簡単です。各メソッドの前に、プログラマはいわゆるアクセス修飾子を指定できます。これには、次のキーワードが含まれます: publicprotectedprivate

「これらのアクセス修飾子を使用すると、他のクラスのメソッドへのアクセスを制限できます。

たとえば、privateメソッド宣言の前にキーワードを記述した場合、メソッドは宣言されているのと同じクラスからのみ呼び出すことができます。キーワードにより、public任意のクラスの任意のメソッドからマークされたメソッドにアクセスできます。

このような修飾子は合計 3 つありますが、メソッドへのアクセスには 4 つのタイプがあります。これは、アクセス修飾子の不在にも意味があるためです。完全な表は次のとおりです。

からのアクセス...
修飾子 どのクラスでも こどもクラス そのパッケージ そのクラス
public はい はい はい はい
protected いいえ はい はい はい
修飾子なし いいえ いいえ はい はい
private いいえ いいえ いいえ はい

「そして、アクセス修飾子の完全な説明は次のとおりです。

1.public修飾子

修飾子でマークされたメソッド (または変数、またはクラス) には、プログラム内のどこからでもpublicアクセスできます。これは最高度のオープン性であり、制限はありません。

2.private修飾子

修飾子でマークされたメソッド (または変数、またはクラス) は、それが宣言されているのと同じクラスからのprivateみアクセスできます。他のすべてのクラスでは、マークされたメソッド (または変数) は表示されません。まるで存在しないかのようです。これは最高レベルの制限であり、独自のクラスのみです。

3. 修飾子なし (デフォルトの修飾子)

メソッド (または変数) が修飾子でマークされていない場合、「デフォルトの修飾子」があるとみなされます。その修飾子を持つ変数またはメソッド (つまり、修飾子をまったく持たない) は、それらが宣言されているパッケージ内のすべてのクラスに表示されます。そして彼らだけに。この修飾子は と呼ばれることもありpackage-private、変数やメソッドへのアクセスがそれらのクラスが含まれるパッケージ全体に開かれていることを示します。

4.protected修飾子

メソッドが修飾子でマークされている場合protected、同じクラス、同じパッケージ、および子孫 (メソッドが宣言されているクラスを継承するクラス) からそのメソッドにアクセスできます。このトピックについては、Java Core クエストでさらに詳しく分析します。」

「興味深いですが、これらの修飾子をすべての適切な場所にすぐに配置できるかどうかはわかりません。

「徐々にそこに到達します。事前に心配する必要はありません。Java 構文クエストの最後に到達するまでは、すべてのメソッド (クラスやpublicインスタンス変数も同様) でこの修飾子を使用できます。 OOP を積極的に学習し始めるときに他の修飾子を使用します。」

「アクセス修飾子が必要な理由を詳しく説明していただけますか?」

「これらは、数十人、数百人のプログラマーが同時に作成する大規模なプロジェクトで必要になります。

「プログラマが、大きすぎるメソッドをいくつかの部分に分割し、コードの一部をヘルパー メソッドに移動したいという状況が時々あります。しかし同時に、他のプログラマーがこれらのヘルパー メソッドを呼び出すことを望まないのです。対応するコードが正しく動作しない可能性があります。」

「そこで、彼らはこれらのアクセス修飾子を思いつきました。ヘルパー メソッドをprivateという単語でマークすると、クラス以外のコードはヘルパー メソッドを参照できなくなります。」

"分かったと思います。"

staticキーワード

「もう 1 つ興味深いキーワードがあります。それは ですstatic。当然のことながら、メソッドは静的になります。」

"どういう意味ですか?"

「それについては後で詳しく説明します。心配しないでください。今のところは、静的メソッドに関するいくつかの事実を覚えておいてください。

事実 1.静的メソッドはどのオブジェクトにも付加されず、そのメソッドが宣言されているクラスに属します。静的メソッドを呼び出すには、次のように記述する必要があります。

ClassName.MethodName()

静的メソッドの例:

クラス名 静的メソッド名
Thread.sleep() Thread sleep()
Math.abs() Math abs()
Arrays.sort() Arrays sort()

静的メソッドをクラス内から呼び出す場合は、静的メソッド名の前のクラス名を省略できます。これが、呼び出される各静的メソッドの名前の前に記述する必要がない理由です。Solution

事実 2.静的メソッドは、自身のクラスの非静的メソッドにアクセスできません。静的メソッドは静的メソッドのみにアクセスできます。その結果、メソッドから呼び出したいすべてのメソッドをmainstatic として宣言します。」

"何故ですか?"

「OOP の学習を開始し、静的メソッドがどのように機能するかを理解したら、この質問に自分で答えることができます。それまでは、私を信じてください。

throwsキーワード

「おそらくメソッド宣言で見たことがあるキーワードがもう 1 つあります。キーワードですthrows。アクセス修飾子やキーワードとは異なり、このキーワードはメソッド パラメーターの後にstatic配置されます。

public static Type name(parameters) throws Exception
{
  method body
}

「で、それはどういう意味ですか?」

「もう一度言っておきますが、その本当の目的は、後で例外(レベル 15)を勉強するときに分かるでしょう。

ただし、表面的に触れると、キーワードでマークされたメソッドは、クラス (およびそれを継承するクラス)throwsのインスタンスを意味するエラー (例外) をスローする可能性があると言えます。Exceptionクラス内で複数の異なるタイプのエラーが発生する可能性がある場合は、それぞれをカンマで区切ってリストする必要があります。」

「神秘的で理解不能ですね! レベル 14 まで待たなければなりません。」

メインメソッド

「メインメソッドを詳しく見てみましょう。すべての修飾子を含むメソッドが宣言されている行が、このメソッドが他のクラスやメソッドから呼び出される方法に影響を与えることはすでに理解しています。さらに、それはメソッドの型にも影響します。メソッドが返す結果は、実行時にどのようなエラーが発生する可能性があるかを示します。

「このような行はメソッド宣言と呼ばれ、次の一般的な形式になります。

access modifier static Type name(parameters) throws exceptions
メソッド宣言の一般的な形式

ここで、、、 、または何もaccess modifiers置き換えられません。publicprotectedprivate

メソッドが静的である場合、staticキーワードが表示されます (非静的メソッドの場合は存在しません)。

Type戻り値の型です (void結果がない場合)

「これで、メソッドの宣言におけるこれらすべての単語の意味がよりよく理解できましたmain

public static void main(String[] args) throws Exception
mainメソッドの宣言

main()「キーワードで示されているように、どのクラスからでもメソッドにアクセスできることがわかりましたpublic。このメソッドは静的であるため、 として明示的に呼び出すことができますSolution.main()。」

main()メソッドはどのような結果を返しますか?」

「まったくありません。結果の型は ですvoid。これは空の型、プレースホルダーのようなものです。」

main()括弧の中には何が入っているの?」

「うーん...このメソッドは引数 (!) を取ることがわかりましたmain。引数は文字列の配列として渡されます。」

「その通りです。パラメータ名はargs私たちの頭に『引数』を連想させます。プログラムの開始時に、引数、つまり文字列の配列を渡すことができます。それらはメソッドargsの配列に含まれますmain()。」

「おお!初めて見たときは疑問に思いましたが、慣れてきて何も考えずにパラメータリストを書き始めました。」

「誰もが経験したことがあります。最後に、Exception(またはその子孫) のようなハンドルされないエラーがメソッド内で発生する可能性があります。宣言の一部のmain()おかげで、私たちはこれを知っています。」throws Exception

「ありがとう、リシ。全部は理解できなかったけど、面白かったです。」

「どういたしまして。だんだんと細かい点も分かってくると思いますよ」