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

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

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

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

Q&A

解決済

3回答

1080閲覧

javaのオブジェクト型と、中に何も書いていないメソッド

tttkkm

総合スコア10

Java

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

0グッド

0クリップ

投稿2021/10/05 04:34

デザインパターンの勉強をtechsocoreでしています。
その最初のイテレータの部分で

java

1public class StudentList{ 2 protected Student[] students; 3 private int last = 0; 4 5 public StudentList(){} 6 public StudentList(int studentCount){ 7 this.students = new Student[studentCount]; 8 } 9 10 public void add(Student student){ 11 students[last] = student; 12 last++; 13 } 14 public Student getStudentAt(int index){ 15 return students[index]; 16 } 17 public int getLastNum(){ 18 return last; 19 } 20}  

というコードがでてきました。
javaをきちんと学んだことがないので、これのprotected Student[] students;とpublic StudentList(){}がわかりません。
Student型から作ってるというのはわかるのですが、それならのprotected Student[] =new Student;となるのではないでしょうか?
またpublic StudentList(){}というこの空のメソッドは何なのでしょうか?
よろしくお願い致します。

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

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

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

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

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

Zuishin

2021/10/05 04:44

ひどいコード。 これは何パターンのつもりで書かれているんですか?
dodox86

2021/10/05 04:47

デザインパターンの勉強をしていて、そのプログラミング言語にJavaを使っていて、そのJavaを学んだことが無いとは、順番が間違っていませんか。習熟できる目算があるのでしょうか。
guest

回答3

0

とりあえず、前提そのものがおかしいです。
他の方も仰っているように、学習順序が違うです。

そもそもプログラミングっていうのは「こう書けばいい」というものではありません

入門書に載っている内容は基礎の基礎です。
知っていて当たり前のものです。

つまり、基礎をないがしろにして、応用だけやろうとしている状態です。

たとえば、料理をするとして、包丁の使い方すら知らない人が、「この料理をしたいから、やり方を教えろ」と言って来たらどうしますか?

で、よく聞くと、かつら剥きどころか包丁すら使えない。
「包丁の使い方から学んで来い」と言うと、「はぁ??? わかんねーなら答えんなク○が!!!」と逆ギレされるのです。

確かに包丁の使い方ぐらいなら教える事もできます。
でもその「包丁の使い方」に相当する部分が、この道ウン十年でないと出来ないとかだとどうでしょうか?

そういう、基礎をないがしろにする人って、すぐに諦めます。
「んな面倒なことやってられっか!!!」と。

それなのに、「御託はいいからとっとと答えだけ寄こせ!!」って何様のつもりでしょうか。
と思いませんか?

そういう、明らかに他人を見下したやりかたをしているのと同義なんですよ。

仮に教えても、そもそもの基礎知識が欠けているから無駄になる。

なので、まともな回答が付きづらくなるのです。

まずは「Java 入門」とかでググって、調べてください。


ここからは本題です。

これのprotected Student[] students;とpublic StudentList(){}がわかりません。

問題のコードを見ると、

public class StudentList{ protected Student[] students; // <- ここ(*1) と private int last = 0; public StudentList(){} // <- ここ(*2) public StudentList(int studentCount){ this.students = new Student[studentCount]; } public void add(Student student){ students[last] = student; last++; } public Student getStudentAt(int index){ return students[index]; } public int getLastNum(){ return last; } }  

ですね。(*1, *2)

(*1)は「フィールド」と言います。
(*2)は「コンストラクタ」と言います。

そもそも、オブジェクト指向というのは、「クラスを組んだからオブジェクト指向」…ではありません。

オブジェクト指向(以下OOP)は、「データ(= フィールド) と処理(= メソッド) をひとまとめにしたオブジェクト」なるものを中心に見る発想法です。

C言語とかのような、OOP以前の言語だと、データと処理(C言語だと関数と呼ばれるが)は別物でした。

それをデータと処理、つまりJavaでいえばフィールドとメソッドをひとまとめにすることで管理をしやすくするのです。

たとえば、Stringクラス。

Java

1String s = "Hello";

この オブジェクト s は、データである "Hello" を持っています。
で、このsが "Hello"というデータを保持し、管理をします。

フィールドとメソッドをひとまとめにすることで、「オブジェクトだけが対象データと処理方法を知っている」状態にできます。

これにより、呼び出し側(mainメソッドとか)は、「sさん、一番目のデータを下さいな」と依頼するだけで、処理されます。
Stringという型によって、sは自分が管理するデータや処理方法(メソッド)を知っているため、
System.out.printlnメソッドみたいに、呼び出し側は「どういう実装なのか」を意識することなく、
処理の概要と引数、戻り値だけを集中していればいいのです。

そして、デザインパターンのStrategyパターンのようにオブジェクトを切り替えるだけでいい……みたいな感じでできます。

そして、クラスはそのオブジェクトの担当区域を定義しているだけです。

コンパイラとかに「こういうデータ構造があるので、よろしくね~」と教えてあげるだけです。
そのため、単に定義しただけでは動きません。動かせません。
なのでインスタンス化と呼ばれる処理をします。オブジェクトを生成するのです。

で、コンストラクタはそのオブジェクトを生成するときに動くものです。

Test1 test1 = new Test1( 100 );

みたいにすると、int型(おそらく)の引数を受けるコンストラクタ Test1( int n ) が動きます。

コンストラクタの役割は『フィールドの初期化や前処理』です。
ただ、今回のような処理自体が空の場合もありますね。

今回のコードで、もし空のコンストラクタを定義しない場合、

StudentList sl = new StudentList();

みたいな、引数無しのインスタンス化ができません。それをできるようにするために、引数無しのコンストラクタを用意する事があります。

ただ、今回のコードだと、引数無しの方を呼ぶとフィールドである student がインスタンス化されていないので、いわゆるヌルポが発生するはずです。

それならのprotected Student[] =new Student;となるのではないでしょうか?

一応、Javaではフィールドをコンストラクタ等以外でそのまま初期化する事はできるようですが、
今回の場合、int型引数を一つ受け取る方のコンストラクタ内で要素数を指定して初期化しています。

もし

protected Student[] student = new Student[10];

とかみたいにやると、配列なので要素数を変動させることができません。要素数10としたら、10個しかはいりません。
10 -> 12 とかにする場合、つまり追加や削除をする場合、別の配列を用意してそこにコピーして挿げ替えないといけません。

ヒント: 配列のサイズ変更について

なので、直接やるのではなく、コンストラクタで要素数を決めています。
完全固定なら質問者さんが思うようにやってもいいです。(書き方は間違っているが)

またpublic StudentList(){}というこの空のメソッドは何なのでしょうか?

上で述べた通り、引数無しのコンストラクタです。

つまり、「基礎からやりましょう」です。

基礎をやるのは面倒ですね。でもそれをないがしろにしても、必要になるのでどうしてもやらないといけません。
そうなると通常の工程までストップしてしまいます。

まずは基礎からやりましょう

投稿2021/10/05 07:36

BeatStar

総合スコア4958

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

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

tttkkm

2021/10/05 10:44

スッキリわかるjava買いました、ありがとうございました。
guest

0

クラスと同じ名前の戻り値型の記述のない関数は、コンストラクタです

投稿2021/10/05 04:49

編集2021/10/05 04:49
y_waiwai

総合スコア87800

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

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

tttkkm

2021/10/05 07:05

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

0

ベストアンサー

どのように使われるものか分かりませんが、コンストラクタが2つ用意されてるので、それによってnullにしておきたいものと推察されます。

コンストラクタは別に空でも良いのと先に書いたようにフィールドstudentsがnullであることをなにかに使う為に処理がなにもないのでしょう。

投稿2021/10/05 04:38

m.ts10806

総合スコア80861

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

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

tttkkm

2021/10/05 07:04

これはpublic StudentList(){}のことですよね? ありがとうございます。 protected Student[] students;についてもご教授いただければ幸いです。
m.ts10806

2021/10/05 07:14 編集

回答に書いてますし、解決済みにされたようなので私から言うことはありません。 いずれにしても基礎からでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問