質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

4回答

564閲覧

【Java】引数のしくみ

t.z

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

1クリップ

投稿2020/03/06 13:28

編集2020/03/07 13:04

いろいろなライブラリやコードを見ていると、引数のつくりがわからなくなります。
仮引数と実引数にわけて質問します。
よろしくお願いします。

※さいごに追記あり

1. 仮引数

たとえばColor(int r, int g, int b)Color(int r, int g, int b, int a)の両方ある理由です。引数で同時に(View view, 仮引数)のように宣言することもできると思いますが、引数の中のそれが何なのかはどのように判別されているのですか。

数や順番や型ならば、Color(int r, int g, int b)Color(int r, int g, int b, int a)を作った人は意図的に(この例の場合は必然かもしれませんが...)引数の数を3と4で分けたということですよね。数や順番や型で完全に判別できるのは当たり前もしくは証明できるものなのですか。

Color (Java Platform SE 7 )
View  |  Android デベロッパー  |  Android Developers

2. 実引数(インスタンス化に関して?)

変数.メソッド名(new インターフェイス名(){public void メソッド名(仮引数){コンストラクタ;メソッド名(実引数);メソッド名(実引数);}});というふうに、変数.メソッド名のあとの引数が複雑なものを見かけます。

引数の中でこのように複雑に続けられる理由を知りたい、どのようなルールと照らし合わせればこの型が理解できるのかのヒントをいただきたい、というのが質問です。言い換えれば、なぜnew インターフェイス名()のあとに長く書いたものを引数の中に入れられるのかという質問でもあります。

私の中で()の中に入れられるものは単純な感覚でしか理解しておらず、上記のように仮引数と実引数がある、自分の作った変数をわたせる、定数を書き込める...等といった認識です。この認識では引数の中に複雑な記述が入り込める理由が不明なのです。

追記

1. 仮引数

(View view, 仮引数)の具体例は、

Java

1private OnItemClickListener messageClickedHandler = new OnItemClickListener() { 2 public void onItemClick(AdapterView parent, View v, int position, long id) 3 { 4 Toast.makeText(context,"You've got an event",Toast.LENGTH_SHORT).show(); 5 } 6 };

です。

AdapterView#HandlingUserSelections

引数がAdapterView parent, View v, int position, long idとなっているのです。

2. 実引数(インスタンス化に関して?)

おそらく「匿名クラス」の話だということがわかりました。なるほどそういうものがあるのかということがわかったので自分で調べます。なにか、調べてもわかりにくい部分などあれば回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/03/06 13:33

2については実際のコードを例示された方が良いように思います。 追記願います。
dodox86

2020/03/06 13:40 編集

2.について、デリゲート(<Javaではそうは言わないでしょうけど)、無名関数、関数オブジェクトの類でしょうかね? いずれにせよ例示しないと適切な回答は得られないと思うので、m.ts10806さんと同じ依頼をするものです。
xebme

2020/03/06 21:55

↑ まず、引数の評価が先に行われる(正格)ことを説明しなければなりませんね。そのうえで、関数オブジェクトを説明してもよい。
xebme

2020/03/06 21:59

> 引数で同時に(View view, 仮引数)のように宣言することもできると思いますが リンク先で見つけられませんでした。具体例があれば追記してください。
t.z

2020/03/07 06:50

わかりにくくてすみません。まず、2の方ですが、実際のコードはほかの人のコピペになってしまうので躊躇しています。皆さんどうされているのでしょうか。 「デリゲート、無名関数、関数オブジェクト、正格」を調べてみましたが、無名関数はこのページ(https://techacademy.jp/magazine/19027)でピンときました。これのことかもしれません。 デリゲートはJavaではなかったのでわかりませんでした。関数オブジェクトはrunnableが出てきているのでswordoneさんの回答コードのことでしょうか?正格は、同期・非同期の話に似ているようなでも検索すると出てきませんね。4つともすべて同じことを言ってるのでしょうか。 取り急ぎ、浅い理解で失礼します...。
t.z

2020/03/07 06:51

1の(View view, 仮引数)の方も、具体例は目の前にあるのですがほかの方の完全なオリジナルで、それと全く同じことをいっているのか判別できませんがこちらのアンドロイドマニュアル(https://developer.android.com/guide/topics/ui/binding?hl=ja)の「ユーザー選択の処理」を見ていただければ"(AdapterView parent, View v, int position, long id)"とあると思います。 おそらく、答えが出るまで追記・修正しても混乱をまねくと思うので、追記・修正はしないでおきます。
dodox86

2020/03/07 07:14

>質問者さん androidのマニュアルとは、この部分でしょうか? // Create a message handling object as an anonymous class. private OnItemClickListener messageClickedHandler = new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { // Display a messagebox. Toast.makeText(context,"You've got an event",Toast.LENGTH_SHORT).show(); } } OnItemClickListenerと言うinterface型を使うために、インスタンス化している部分ですね。 https://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener コメントをそのまま直訳すると、「メッセージハンドリング用のオブジェクトを匿名クラスとして生成」です。 swordoneさんの回答、Runnableもinterfaceであり、swordoneさんの回答が相当すると思います。
t.z

2020/03/07 12:13

dodox86さん、その部分です。 > OnItemClickListenerと言うinterface型を使うために、インスタンス化している部分ですね。 とてもしっくりくる一文ありがとうございます。
dodox86

2020/03/07 12:19

まぁ、interfaceを「型」と呼ぶのは語弊があるかもしれませんのでご注意ください。(私がコメントした内容ですけれども)
m.ts10806

2020/03/07 12:45

質問は編集できますので適宜追記してください
t.z

2020/03/07 13:06

dodox86さん、わかりました。ありがとうございます。 m.ts10806さん、ご指摘ありがとうございます。追記しました。
guest

回答4

0

引数の中のそれが何なのかはどのように判別されているのですか

JavaDoc Color

ご提示の様にOracleのJavaドキュメントを見るしかないのでは?
自作のメソッドなどではソースを見るかやはりドキュメントを見るしかないでしょう。

数や順番や型で完全に判別できるのは当たり前もしくは証明できるものなのですか。

どういう事でしょう?Colorの引数が何なのかはやはりドキュメントを見るしかないでしょう。

意図的に(この例の場合は必然かもしれませんが...)引数の数を3と4で分けたということですよね。

これをオーバーロードと言います。引数の数や型を変えることにより同じメソッド名を使えます。
型については言語によって違う場合もありますので注意して下さい。

なぜnew インターフェイス名()のあとに長く書いたものを引数の中に入れられるのかという質問でもあります。

インターフェースでなくても、メソッド(この中)でnew などができるのかという事ですか?
これは、ただ一旦変数に置き換えずにダイレクトに行っているだけでしょう。

この認識では引数の中に複雑な記述が入り込める理由が不明なのです。

ただ、これらは何故この様な事ができるのかという事を知りたいのでしょうか?
それは私はJavaを開発した訳では無いので分かりません。そのように使えるようになっているのでそれを知り使っているだけです。

追記

(View view, 仮引数)のように宣言することもできると思いますが、
引数がAdapterView parent, View v, int position, long idとなっているのです。

(Color color, int a)このようにColor color、AdapterView parent、View view、Hoge hogeこうなったらどこを調べればよいか分からないという事ですか?

すでに質問のリンクにあるようにAndoroid viewJavaDoc Colorあたりじゃないですか?

ただ、呼出し側(実引数)へ入れる変数は、Color colorとなっていたらColorクラスの型で宣言した変数を入れましょうという事。

java

1private void xxx() { 2Color co = new Color(255,255,255); 3aaa(co, 1); 4} 5 6private void aaa(Color color, int a) { 7 //内容 8}

投稿2020/03/07 12:31

編集2020/03/07 13:47
shinami

総合スコア334

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.z

2020/03/07 13:40

ドキュメントを見るしかないのですね。オーバーロードも、新しい視点で見ることができました。言語を学ぶときの柔軟さをつかむのが難しくてあたふたしてしまっている私です。ご回答ありがとうございます。
shinami

2020/03/07 13:45

追記しておきました。
t.z

2020/03/07 13:55

追記ありがとうございます。ドンピシャ回答です。
guest

0

2に関しては多分こういうことのことを言っているのだと思うのですが。

java

1new Thread(new Runnable(){ 2 @Override 3 public void run(){ 4 System.out.println("test"); 5 } 6}).start();

これはこう分けて考えてください。

java

1Runnable r = new Runnable(){ 2 @Override 3 public void run(){ 4 System.out.println("test"); 5 } 6}; 7new Thread(r).start();

引数に渡すものを、変数に一度入れることなく直接書き込んでいるのが前者の書き方です。

投稿2020/03/06 13:42

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.z

2020/03/07 06:52

サンプルコードありがとうございます。助かります! 私の質問意図とまったく一致ではないのですが、解決に近いです。 どちらのコードにも共通の @Override public void run(){ System.out.println("test"); } の部分をなぜその位置にかけるのかというのが質問でした...。いつもならRunnable r = new Runnable();という形でおわっているのに、なぜ続くのかということです。
swordone

2020/03/07 07:09

「匿名クラス」を調べてください。
t.z

2020/03/07 12:13

ありがとうございます。調べます。
guest

0

ベストアンサー

2. 実引数(インスタンス化に関して?)

学習の進み具合を推察して基本を説明します。メソッド呼び出しの際に代入<仮引数> = <実引数>が行われます。

代入文

一般的な変数の宣言と代入文の関係をみましょう。代入文の左辺には<変数>を、右辺には<式>を書くことができます。文法的には<変数>や<値(リテラル)>も<式>です。式は評価されて一つの値になります。左辺の変数に評価された値がコピーされます。

Java

1int a = 3; // 数値リテラルを代入 2int b = a + 5; // 計算式の評価結果を代入 3String s = new String("Hello"); // 文字列のインスタンスを生成して参照値を代入

引数の値の評価

<実引数>は<式>である。<式>は<仮引数>の型に代入可能な値に評価されたのち、値が<仮引数>にコピーされる。引数を先に評価する戦略を「正格」という。Java以外の言語には、引数(式)の評価が遅延する「非正格」な機能を持つものがある。

Java

1<仮引数> = <実引数>; // <実引数>は<式>である。

質問のメソッド呼出は、実引数の部分に変数や値ではなく式(new ...)を書いています。メソッド呼び出しは、代入の右辺が遠くにあるので気付かないかもしれません。

ここまでが基本です。説明が質問に答えていて理解できたなら終わり。

次に、ローカルクラスの説明、そのあと関数型インターフェイス、ラムダ式の説明になります。学習の進度によっては後で改めて質問するほうが良いかもしれません。

投稿2020/03/07 07:41

編集2020/03/07 07:49
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2020/03/07 12:38 編集

失礼しました。ローカルクラス(無名クラス)の説明を知りたいのですね。
t.z

2020/03/07 12:47

進み具合の推察ありがとうございます。 > 文法的には<変数>や<値(リテラル)>も<式>です。式は評価されて一つの値になります。左辺の変数に評価された値がコピーされます。 のあたりでだいぶ頭が柔らかくなった気がします。繰り返し読ませていただきます。 ローカルクラスに関しては、わかっていないつもりはないのですが、どうつながっていくのでしょうか。 > メソッド呼び出しは、代入の右辺が遠くにあるので気付かないかもしれません。 というところだけひっかかっています。具体的にお願いできますか。
xebme

2020/03/07 13:11

[代入の右辺が遠くにあるので]とは、仮引数に代入する「右辺の式」が、メソッド呼出しの括弧の中にあり、遠く離れているので、という意味です。わかりにくくてすみません。
xebme

2020/03/07 13:46 編集

> ローカルクラスに関しては、わかっていないつもりはないのですが、どうつながっていくのでしょうか。 メソッドの仮引数の位置にインターフェイスが記述されていますね。メソッド呼び出しの実引数の位置でそのインターフェイスを実装する無名クラス(ローカルクラス)の宣言とインスタンスの生成を行っています。new 式の評価は、無名クラスのインスタンスをヒープに生成し、初期化して、その参照値を得ることです。つぎに仮引数にその参照値を代入します。メソッドのブロックを実行します。というつながりです。 (進み具合の推察が間違っていたかもしれません。JVMの実行時メモリーモデルやバイトコードを学ぶと良いかもしれません)
xebme

2020/03/07 14:15

実引数には仮引数に代入可能な<式>を記述する。<式>はメソッドの実行前に評価され、評価された値が仮引数に代入される。(この回答でよかったみたいです)
t.z

2020/03/07 14:16

ローカルクラス(無名クラス)に関してもそうですが、目の前にあるこのコード(他人のコードなので載せられない)はどこから理解すればいいのかわからないということなので、xebmeさんのご回答は新たな視点なのでとてもありがたいです。 コメントもありがとうございます。納得しました。習うより慣れよでやってきて壁にぶつかったところです。より深いところが詳しく知れたので腑に落ちてきつつあります。JVMの実行時メモリーモデルやバイトコードも加えて学ぼうと思います。とりあえず私の中でひと段落つきました。ありがとうございます。
guest

0

難しく考える必要はないです。

Color(int r, int g, int b)とColor(int r, int g, int b, int a)は、名前は同じだけど別の関数となります。

引数の数が違うとか、引数の型が違う場合は、同じ名前をつけることができる、というそんだけのはなしです。

投稿2020/03/06 13:33

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.z

2020/03/07 06:54

名前は同じだけど別の関数と考えるとすごくすっきりします。ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問