はじめに
この章では、javaの基本的な構造を学んでもらいます。 ソースを読むにしても、書くにしてもとーっても大切なポイントになります。
とは言っても、 最初は難しいと思います。
ひとまず、読み進めていきましょう!
Step1: クラス
クラスとは、「データ」と「処理」の集まりです。
Javaのプログラムはこの「クラス」 を複数組み合わせてプログラミングしていきます。
そのため、Javaのプログラミングは、大きく分けて2つの作業に分かれます。
クラスをプログラミング
クラスには 「データ」 と 「処理」 を記述します。
- データ
そのクラスが持つ特徴・クラスに見合った情報などを指します - 処理
そのクラス内で行いたいタスク・TODO・ふるまいなどを指します
呼び出し側のプログラミング
クラスが完成したら、クラスのインスタンス (実体) を生成し、 メソッドの呼び出しを記述します。
メソッドの呼び出しは「クラス内」「または、クラスの呼び出し側」の両方で行えます。
クラスをプログラミングするにはいくつかルールがあります。
1. 必ず public class クラスと記述
2.{ }(中括弧) で囲むように「データ」と「処理」を記述
このように中括弧で囲まれたプログラムコードのまとまりをブロックと呼びます。
サンプルクラス 「HelloJava.java」
解説①
クラス名には、オリジナルの名前を記述することが可能ですが、 Javaではクラス名の最初の一文字は半角英大文字で記述するという慣習があります。
上記のプログラムでは、クラスに Hello Java という名前を付けています。
解説②
クラスのブロック内に、 データ (フィールド変数)を宣言したり、処理(コンストラクタやメソッド) のブロックを記述したりしていきます。
上記のプログラムでは、 message という名前のStringクラスのフィールドを宣言しています。
また、コンストラクタ HelloJava() と、メソッド print() を定義しています。
練習問題
ここからはVSCodeで実際に記述しながら進めてみましょう。
windowsの方はUbuntu上で、macの方はターミナル上で「java1」というディレクトリを作成し、java1ディレクトリに移動した後code .と打ち込んでVSCodeを起動します。
VSCodeを起動したら、HelloWorld.javaというファイルを作成してください。
上記のコードの中からクラス、フィールド、コンストラクタ、メソッドがそれぞれどれかスクリーンショットのようにコメントアウトして回答してください。
回答はSlackでスクリーンショットを添付して送信してください。
※コードはできるだけ書き方を覚えて欲しいのでコピペせずに自分で書いてください。
Step2: mainメソッド
プログラミングしたクラスを動かすため、 自クラス又は他のクラス内に mainメソッドを記述します。
そのmainメソッドの中で「new」 演算子を使用し、メモリ上にクラスが扱うデータ用の領域を新規に確保します。
このようにしてクラスという「型」 から 「具体的な実体」を生成することをインスタンス化と呼び、
生成されたものをインスタンスと呼びます。
【実行結果】
練習問題
java1のディレクトリにMain.javaを作成し、下記の問題を実施してください
インスタンス生成とメソッドの呼び出しは今後かなり重要になってきます。
この後の章でも解説していますが、ここで書き方だけでも学んでおきましょう。
このカリキュラムを参考に上記のコードを完成させてください。 完成したものをスクリーンショットで送ってください。
Step3: フィールド変数
フィールドまたはフィールド変数とは、クラス内の変数のことです。
フィールドを宣言するとき、「public」や「private」などのアクセス修飾子を記述します。
アクセス修飾子は、省略することも可能です。
フィールドとして宣言した変数はコンストラクタやメソッド内で変数を宣言することなく、 そのクラス内であればどこからでも値を参照したり更新したりすることができます。
また、フィールドは、 初期化を省略してもかまいません。 その場合は、デフォルト値が入ります。
Step4: アクセス修飾子
アクセス修飾子とは、「public」「protected」「private」といった修飾子(変数名、 関数名の前に付与する単語) のことで、クラスや変数がどこからアクセス可能であるかの公開範囲を決定します。
例えば、以下のようなコードがあったとします。
ModAccess.java
クラスで定義したアクセス修飾子を同一クラスから呼んだ場合は 、どのアクセス修飾子にも問題なくアクセスできます。
【出力結果】
ModAccess.javaに書かれている変数を別のファイル (ModAccess.javaを継承) から呼んだ場合はどうでしょうか?
(この「継承」については後のカリキュラムで詳しく紹介します)
ModAccessChild.java
【出力結果】
ModAccess.javaを継承している(extends ModAccess の部分)ので、 private 以外は出力できています!
また、private な pri_var にはアクセスができないため、 実装時にはコンパイルエラーとなりエラー対象のコードに赤い下線が引かれます。
ポイント
コンパイルエラー時の対応策としては主に以下の3つとなります。
- 正しいコードに修正
- コメントアウト (1) することにより、コードとして認識させない
- 対象のコードを削除
アクセス修飾子のみでコンパイルエラーが発生する訳ではありませんので、 その他の実装でコンパイルエラーが発生した場合は上記3つの対応を参考にエラーを解消しましょう!
最後に、ModAccess.java に書かれている変数を別のファイル(継承とかはしていない)から呼んだ場合はどうでしょうか?
ModAccessOther.java
このコードを実行すると下のように出力されます↓↓↓
継承をしていないので、 public 以外は出力できません!
【出力結果】
