イントロダクション
Java言語での文法をちょっとやると「クラス」という言葉が出てきます。「インスタンス」とか、「オブジェクト」なんて言葉も一緒に出てきます。
これらの言葉は、目に見えないことが多く、初学者、ある程度学習した人でも認識が、あやふやになっていることが多いです。
しかし、難しく考えることはありません。いろんな人がいろんな言葉でモノを言うのでこんがらがりますが、シンプルに考えて問題ありません。
扱っているものは、所詮、機械なのですから。
クラスとは
今までに、書いてきた、プログラム(クラス)は下のようにmainメソッドだけでした。
public class AAA {
public static void main(String[] args) {
}
}
なので、クラスをクラスとして使用していませんでした。
具体的にはクラスには以下の要素があり、それぞれの機能を持たせることができます。
1:フィールド変数
2:メソッド
これらを使用して現実にある様々なものを表現できます。
例えば、全てを表現すると難しいので、部分的に「ゲーム機」をクラスで表現しようとすると、下のようになります。
クラス名: 某社〇〇ッチ フィールド変数: カセットを入れるソケット メソッド:ボタンを押す、ボタンを離す、ボタンを長押しする
部分的ではありますが、このように表現できます。注意点としてはこれらの名前が複数あるというところです。C言語で表現するときは「フィールド変数」は「メンバ変数」、メソッドのことは「メンバメソッド」などのように言語による違いが「言葉の違い」になり、それがまた混乱のもとになっていると思います。
そして、フィールド変数とメソッドがあれば、それはクラスであり、それ以上でも、それ以下でもない。というところを認識してください。
いろんな人が、いろんなことを言うので混乱することが多いと思います。※筆者が若いころは混乱しました。。。
例えば人間を表現してみます。※ほんのさわり部分のみです
public class Human {
/** 年齢 */
private int age;
/** 性別 */
private int sex;
/** 挨拶する */
public void greet() {
System.out.println("Hello!");
}
}
人間にはその人の年齢があり、性別他にもたくさんありますが、それぞれ「人間」と言う生き物に共通する要素があります。
それを「フィールド変数」として定義してやります。
そして、取りうる行動を「メソッド」として表現することができます。
例えば自転車ならば。。。
public class Bicycle {
/** ハンドルのサイズ */
private double handleSize;
/** 車輪のサイズ */
private double wheelSize;
/** スピード */
private double speed;
/** 停止しているフラグ */
private boolean isStop;
/** 自転車をこぐ */
public double start(int power) {
speed = power * wheelSize;
isStop = false;
}
/** 自転車の動き */
public void bicybleState() {
// 何かしらの処理。。。
}
}
とまぁキリがなくなってきたので、ここら辺で自転車の実装を終わりにしますが、つまるところは。。。
フィールド変数とメソッドがあれば、「現実にあるもの」を「クラス」として表現できる。※あくまでも「文字や言葉を使って表現できる」
言い方を変えると、属性と操作があれば、何でも表現することができる ※部分的になりますが。。。
ちなみに、「属性と操作」は日本語で、英語にするならば「アトリビュート(Attribute)とオペレーション(Operation)」になります。
日本語だと意味が広いから混乱してしまうように思いますので、英語(カタカナ)で理解するのもよい方法だと思います。
と言うところがクラスの存在意義です。
そして、クラスがJavaプログラミングの基本になります。
そして、実行してみました。コードはこちらにあります。
#### UML
ちなみに図で表現することもできます。それをUMLというものがありこのルールで記述したものは世界中のだれもが読めます。
下のような図です。
![](http://zenryokuservice.com/wp/wp-content/uploads/2022/03/ClassSample1.png)
### 初めのプログラムの解説
インスタンスとは
クラス(ファイルに記述したもの)の「コンストラクタ」の処理を通った後に出来る、オブジェクト。
<例>
ホームページにログインするとインスタンスが1個作られます。→ログイン処理でユーザーをあらわすクラスのコンストラクタでDBから取得した情報を保持します。この保持するためのオブジェクトの事をインスタンスと呼びます。
オブジェクトとは
構造体、クラスの事。データをセットしたり、ゲットしたり、何かの処理を行ったりします。構造体はクラスと同じ様な意味です。細かい所は混乱するので省きます。
オブジェクトはインスタンス化したもの。→コンストラクタを通ればオブジェクト。
<サンプルコード>
public class MyCls {
//フィールド変数
private String name;
private int age;
//コンストラクタ
public MyCls() {
this.age = 3;
}
//メソッド
public void setName(String name) {
this.name = name;
}
}
カプセル化とは
1.
上記の様にフィールドへのアクセス(name)にはクラスの外からアクセス出来なくする事MyCls.name = “”;
はエラーになる。
ちなみにフィールドをpublic String name;
と書くと外部からアクセス出来る。MyCls.name = “”;
はエラーにならない
2. データと処理をひとまとめにして、「役割」を果たすために外部へ提供する機能と、内部で使用する機能を分けて作成したクラス
クラスの構成のコメントをつけております。
サンプルはこちら
/** 外部の提供されているクラスをインポートする */
package jp.zenryoku.sample.cls;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
/**
* javaAPIの使い方
* <span class="s2">@author</span> <span class="s3">takunoji</span>
*/
// クラス定義
public class Step2_1 {
// フィールド変数:クラスの全てのメソッドからアクセスできる
private String FIELD_HENSU="クラスの外からはアクセスできません。";
public String FIELD_HENSU2="クラスの外からはアクセスできます。";
// メインメソッド(必ずこの書き方になる)
public static void main(String[] <span class="s4">args</span>) {
Step2_1 step = new Step2_1();
// 入力を受け取り切らない場合は次のStreamに読み込まれる
//123456step.arrayTest1();
step.arrayTest2();
}
// 自作のメソッド(メンバメソッドともいう)
public void arrayTest1() {
System.out.println("test1 入力開始");
// バイト型の配列をサイズ5で作成する
byte[] moji = new byte[5];
// エラーハンドル用のくくり
try {
// 標準入力から入力を受け取る
System.in.read(moji);
} catch(Exception e) {
e.printStackTrace();
}
// 入力は「バイト型」のデータなのでString型(参照型)を生成する
System.out.println("入力じた文字:" + new String(moji));
}
public void arrayTest2() {
System.out.println("test2 入力開始");
// 読み込み用のクラスを宣言する<br/>
BufferedReader read;<br/>
// InputSreamReaderからBufferedReaderを作成する
// System.in→標準入力、読み込むために上のクラスでラッップ(包む)して
// 使用する。ラップとは System.inをInputSreamReaderで包む(拡張)する
// ことを言います。
read = new BufferedReader(new InputStreamReader(System.in));
String line = "";
try {
// BufferedReader.readLineメソッドで1行読む。<br/>
// Fileなどを読み込む時にも使用する<br/>
line = read.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("入力じた文字:" + line);
}
}
「public class クラス名」全ての人がアクセスできるクラスですよ、と定義する=>パブリック・スコープ
「private class クラス名」クラスの中からのみアクセスできるクラスと定義する=>プライベート・スコープ
「class クラス名」同じパッケージ内からアクセスできるクラスと定義する=>パッケージ・スコープ
「public 返却値 メソッド名」クラスの外からもアクセスできるメソッド
「private 返却値 メソッド名」クラスの中からのみアクセスできるメソッド
フィールド変数に関して、今回は使用していません。
Systemクラスについて
標準入力、出力、Javaの強制終了などJavaシステムの
基盤的なアプリケーションの機能を実装している。
クラス 変数名 = new クラス名();という書き方では
メソッドを使用できません。→その様に実装しているからです。
#### Systemクラスの説明
クラス名:System
フィールド変数:out
フィールド変数(クラス)のメソッド:println()
※[PrintStreamクラスの詳細はJavaDoc](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html)を見ます。
```
public final class System extends Object {
/** PrintStreamというクラス */
public static final PrintStream out;
}
```
スタティックメソッドはクラスをnewしないで直接
クラス名.メソッド名の形で呼び出します。System.out.println()
の場合は
スタティックフィールドoutを直接呼び出していますので**System.out**になります。
そしてPrintStreamクラスのメソッドprintln()を使用している。というわけです。
## まとめ
Javaプログラムを動かすには「クラス」が必要で、クラスをnew
すると、オブジェクト(インスタンス)ができて、メンバメソッドが呼び出せる。
そして、クラスには「フィールド変数」と「メソッド」が定義出来て、フィールド変数、メソッドを必ずしも定義しなくてもよい。
アクセス修飾子やstaticメソッド修飾子などもあり、クラスにアクセスする方法を分けることができる。
これらの基本ルールを土台にして、プログラムを組み上げて一つのアプリケーションを作成することができる。
#### LWJGLのデモ動画
マイクラでも使っているフレームワーク**LWJGL**というものがあります。これはJava言語でできています。
関連ページ
- Java はじめて 1 〜メインメソッド〜
- Java はじめて2 〜メソッドを呼び出す〜
- Java はじめて3 〜コメントの書き方〜
- Java はじめて4〜練習問題をやってみる〜
- Java はじめて5 〜変数について〜
- Java はじめて6 〜変数について2、byte, char, boolean型〜
- Java はじめて7 〜配列とは、配列の使い方〜
- Java はじめて8 〜booleanとif~
- Java はじめて 9 〜switch文〜
- Java はじめて 10 〜ループ処理A: for文1〜
- Java はじめて 11 〜ループ処理A: for文2 拡張for文〜
- Java はじめて12 〜ループ処理B: while文〜
- Java はじめて13 〜ループ処理C: do-while文〜
- Java はじめて14 〜クラスの作り方〜
- Java はじめて15 〜クラス型変数の使い方〜
- Java はじめて16 〜クラス設計から実装〜
- Java はじめて17 〜設計後の部品を実装する1〜
- Java はじめて18 〜設計後の部品を実装する2〜
- Java はじめて19 〜コンストラクタの役割を見る〜
- Java はじめて20 〜チェック処理クラスを作る〜
- Java はじめて21 〜オブジェクト指向的分析、アプリの拡張をする〜
- Java はじめて22 〜オブジェクト指向的分析、アプリ拡張の実装とテスト〜
- Java はじめて23 〜テスト駆動型開発を行う〜
- Java はじめて24 〜JUnitでのテスト駆動型開発1〜
- Java はじめて25 〜JUnitでのテスト駆動型開発2: テストケース作成〜
- Java はじめて26 〜JUnitでのテスト駆動型開発3: クラスの実装〜
- Java はじめて27 〜JUnitでのテスト駆動型開発4: 追加修正と実装〜
- Java はじめて28 〜JUnitでのテスト駆動型開発5: ファイル出力の実装〜
- Java はじめて29 〜JUnitでのテスト駆動型開発6: ファイル読み込みのテスト〜
- Java はじめて30 〜JUnitでのテスト駆動型開発7: テストクラスの実装方法〜
- Java はじめて31 〜JUnitでのテスト駆動型開発8: 処理をつなげたテスト〜