クラスの使い方
2014年2月8日:Java
プログラムは関数と変数により構成されます。
よって、関数と変数をまとめたものがあると何かと便利です。
この関数と変数をまとめたものがクラスです。
例えば、ボタンを考えてみましょう。ボタンには
【変数】ボタンの大きさ、文字、色
【関数】ボタンを押したときの動作
が必要です。これらの変数や関数をまとめたものを準備しておけば、ボタンを複数作る際に便利です。ボタンの大きさや文字、動作を変えるだけで簡単にボタンを作成できます。
牛乳クラスをつくる
クラスの例として、牛乳クラスを作ってみます。では、変数として
- 牛乳の量:int ryou
を入れることにします。そして、関数として
- 牛乳を供給する:void in(int)
- 牛乳を飲む:void drink(int)
とします。では作ってみます。
class Milk { //変数 private int ryou; //コンストラクタ public Milk(int x) { ryou=x; } //メソッド public void in(int x) { ryou=ryou+x; } public void out(int x) { if(ryou-x<0) { System.out.println("量がたりません"); }else { ryou=ryou-x; } } }
まず、牛乳の量を表す変数ryouを
private int ryou;
と定義しています。ここで現れるprivateはクラス内でしか変数でアクセスできないことを意味しています。
クラス外でもアクセスできるようにしたい場合は
public int ryou;
とします。
つぎに、
public Milk(int x)
でコンストラクタを定義しています。コンストラクタとは、クラスを定義した際に実行される命令のことです。
ここでは、Milkクラスを定義すると牛乳の量がxとして導入されます。
あとは、メソッドの定義です。inもoutもpublicなのでクラス外からアクセスできます。
そして、inでryouを増やし、outで指定したryouを減らします。そして、もしもryouが足りないなら「量がたりません」と表示させます。
牛乳クラスを使ってみる
では、作成した牛乳クラスを使用してみます。
以下のようにプログラムをつくります。
class Milk { //変数 private int ryou; //コンストラクタ public Milk(int x) { ryou=x; } //メソッド public void in(int x) { ryou=ryou+x; } public void out(int x) { if(ryou-x<0) { System.out.println("量がたりません"); }else { ryou=ryou-x; } } } class Test { public static void main(String[] args) { Milk m=new Milk(10); m.in(5); m.out(13); m.out(5); } }
これを実行すると
量がたりません
と表示されます。このプログラムでは
Milk m=new Milk(10);
で牛乳クラスを導入しています。クラスの導入の仕方は
クラス名 変数名=new クラス名();
です。クラスを定義するとコンストラクタが実行されます。この場合、ryouに10が入ります。ちなみにryouはprivateなので
m.ryou=20;
という命令は使えません。publicにすれば使用できます。
そして、
m.in(5);
で牛乳を5入れてryouが15になります。そして、
m.out(13);
でryuoが13へり2になります。最後に
m.out(5);
では量が足りないので「量がたりません」と表示されます。
牛乳クラスを拡張する-継承という考え方-
牛乳クラスにさらに牛乳の種類を追加できるようにします。
ふつうに牛乳に変数を追加すればいいのですが、ここでは牛乳クラスを拡張した牛乳2クラスを作成してみます。
もともとあったクラスを拡張することを、クラスを継承するといいます。
そして、拡張する元のクラスを「スーパークラス」、拡張したクラスを「サブクラス」といいます。
サブクラスは以下のように宣言します。
class サブクラス名 extends スーパークラス名 { サブクラスのメンバ サブクラスのコンストラクタ }
では、牛乳2クラスをつくります。
class Milk { //変数 private int ryou; //コンストラクタ public Milk(int x) { ryou=x; } //メソッド public void in(int x) { ryou=ryou+x; } public void out(int x) { if(ryou-x<0) { System.out.println("量がたりません"); }else { ryou=ryou-x; } } } class Milk2 extends Milk { private String syurui; public Milk2(int x,String ss) { //Milkのコンストラクタを実行 super(x); syurui=ss; } public void show() { System.out.println(syurui+"です"); } } class Test { public static void main(String[] args) { Milk2 m=new Milk2(10,"牛"); m.in(5); m.out(13); m.out(5); m.show(); } }
これを実行すると
種類が足りません
牛です
となります。
Milk2のコンストラクタの
super(x);
でMilkのコンストラクタを行っています。もしも、superで指定しないと、自動的にMilkのコンストラクタがMilk2のコンストラクタの前にはじまります。
ただし、今回はMilkのコンストラクタが引数を持つので省略はできません。
あと、
スーパークラスのコンストラクタはサブクラスの先頭で行わなくてはなりません。
あとは、メンバとして
private String syurui;
をいれており、
public show()
で種類の内容を表示できるようにしています。
牛乳の量をわかるようにする-protectedの使いどころ-
Milkクラスでは牛乳の量を表示できるメソッドがないので、表示できるようにします。
ただし、
private int ryou;
となっているので、外部はもちろんのこと、サブクラスMilk2からでさえもryouへアクセスすることはできません。
そこで
protected int ryou;
としてやります。
protectedなら、外部からアクセスできないけどサブクラスからはアクセスできます。
これを使って、サブクラスからryouを取得して表示するメソッドをつくります。
以下のようにプログラムをつくります。
class Milk { //変数 protected int ryou; //変更 //コンストラクタ public Milk(int x) { ryou=x; } //メソッド public void in(int x) { ryou=ryou+x; } public void out(int x) { if(ryou-x<0) { System.out.println("量がたりません"); }else { ryou=ryou-x; } } } class Milk2 extends Milk { private String syurui; public Milk2(int x,String ss) { //Milkのコンストラクタを実行 super(x); syurui=ss; } public void show() { System.out.println(syurui+"です"); } //追加 public void show_milk() { System.out.println("量:"+ryou); } } class Test { public static void main(String[] args) { Milk2 m=new Milk2(10,"牛"); m.in(5); m.out(13); m.out(5); m.show(); m.show_milk(); } }
これにより
量がたりません
牛です
量:2
と表示されます。
ファイルを分割する-クラスごとにファイルをつくる-
一つのファイルにたくさんのクラスがあると混乱します。
クラスを整理するために以下のようにファイルをクラスごとに分割します。
Testクラス->test.java
class Test { public static void main(String[] args) { Milk2 m=new Milk2(10,"牛"); m.in(5); m.out(13); m.out(5); m.show(); m.show_milk(); } }
Milkクラス->Milk.java
class Milk { //変数 protected int ryou; //変更 //コンストラクタ public Milk(int x) { ryou=x; } //メソッド public void in(int x) { ryou=ryou+x; } public void out(int x) { if(ryou-x<0) { System.out.println("量がたりません"); }else { ryou=ryou-x; } } }
Milk2クラス->Mil2.java
class Milk2 extends Milk { private String syurui; public Milk2(int x,String ss) { //Milkのコンストラクタを実行 super(x); syurui=ss; } public void show() { System.out.println(syurui+"です"); } //追加 public void show_milk() { System.out.println("量:"+ryou); } }
以上のように
クラスは分割してファイルに保存できます。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー