ホームページへ戻る
 

上へ戻る
 

       Java入門  その2        by  H.Y        3月 19 14:13:10 JST 2002


目次

3。オブジェクト指向
3ー1。オブジェクト指向の基本コンセプト
1)多様性(Polymorphism)
2)カプセル化(Encapsulate)
3)継承(Inheritance)
3ー2。オブジェクト(object)
3ー2。クラス(class)
1)クラスの構成要素
2)インスタンス(オブジェクト)
3)コンストラクター
4)クラス変数
5)メソッド
6)コンストラクター
3ー3。オブジェクトの宣言と作成
1)String クラス
2)NuberFormat クラス
3ー4。クラスの宣言/定義
1)クラス宣言の形式
3ー5。インスタンスの生成
3ー6。オブジェクトのコピー
3ー7。メソッドの作成
1)アクセス指定子
2)パラメータ付きメソッド
(1)引数付きメソッド
(2) main にコマンドライン引数を渡す
3) メソッドから値を返す
4) データアクセスメソッドを作成する。
3ー8。コンストラクタの作成
3ー9。パラメータ付き、コンストラクタ
3ー10。クラス作成の例題
3ー11。メンバの分類
1)静的メンバ(Static Member)
(1)静的変数(クラス変数)
(2)静的メソッド(クラスメソッド)
(3)クラス変数の実例
(4)クラスメソッドの実例
2)インスタンスメンバ
(1)インスタンス変数
(2)インスタンスメソッド
3) インスタンス変数参照の仕方
3ー12。ローカル変数
3ー13。this キーワード
1)サンプル 1
2)サンプル 2

=============================================================================

3。オブジェクト指向
3ー1。オブジェクト指向の基本コンセプト
1)多様性(Polymorphism)
1 つのインターフェイス対して、複数の実装をおこなうこと。
例えば、「ある面積を計算する」と言う基本のプログラム 1 つで、
(1) 三角形の面積を計算する
(2) 四角形の面積を計算する
(3) 円の面積を計算する
という、プログラムをすべて実装することが出来る。
Java での実際の実装の仕方には、2 つの方法がある。
(1)インターフェイスに複数の実装を行う。
(2)メソッドにさまざまな実装を行う。
2)カプセル化(Encapsulate)
クラスを作ることにより、クラス内部を外部から隠蔽することができる。
3)継承(Inheritance)
元になる親のクラスから、子のクラスは性質を引き継ぐことができる。
継承は、親から子へと何世代にも渡って行われる。
元のクラスは基本クラス。新しいクラスは派生クラス(サブクラス)と
呼ぶ。

新しいクラスは古いクラスの全ての
メソッドと
データメンバーを継承する。(インヘリテイトする。)
3ー2。オブジェクト(object)
「手続き」と「情報」を1つにしたもの。
クラスから生成した実体(インスタンス)がオブジェクト。
オブジェクトはクラスのコンストラクタが作成する。

3ー2。クラス(class)
オブジェクトをプログラムに採り入れるために記述したものがクラスである。
同じ種類のもの全てに共通な「性質」と「情報」を記述したもの。
1)クラスの構成要素
(1)メンバ変数(Field)
(2)メソッド(Method)
(3)コンストラクター (Constructor) (コンストラクタのないクラスもある。)
メンバ変数とメソッドを合わせて、「クラスのメンバ」と呼ぶ。
2)インスタンス(オブジェクト)
クラスを実態化したもの。別名オブジェクト。
それぞれに違いを持った実体(インスタンス)をクラスから生成する。
3)インスタンス変数
オブジェクトのデータメンバをインスタンス変数。
4)クラス変数
クラスの全てのオブジェクトが共有するデータ項目のことを、クラス変数と言う。
static で定義する。
5)メソッド
メソッドとはクラスに組み込まれている、手続きを記述したもの(関数)。
メソッドには、次の 2つがある。
(1)クラスメソッド
クラス共有のメソッド。
オブジェクトを作成しなくても使用できるメソッド。
(2)インスタンスメソッド
オブジェクトを作成してから使用するメソッド。
6)コンストラクター
コンストラクタは、クラスを初期化する特別なメソッド。
コンストラクターはクラス名と同一の名前を持つ。

3ー3。オブジェクトの宣言と作成
1)String クラス
文字列を処理するクラスとして、String クラスと StringBuffer クラスがある。
String クラスはインスタンス化すると、文字列を操作できない。StringBuffer は、文字を追
加、挿入することができる。
String クラスは、さまざまなメソッドをもっている。テーブル参照のこと。

オブジェクトの宣言は必ずしも必要ではない。文字列リテラルのように、java がオブジェクト
を自動的に作成してくれることもある。
"こんにちは。これは文字列リテラルです。".length(); は有効である。

また、String クラスには、複数のコンストラクタがあので、初期化の仕方にも種類ができる。
引数の数とタイプで、コンストラクタを使い分けることが出来る。

// ------------- string1.java by H.Y 2001.5.5 ----------

public class string1{
public static void main(String[] args){

String s1; //String クラス のオブジェクトs1 の宣言
s1 = new String("Hello from Java !."); //オブジェクト s1 の作成と初期化
//String(String value) コンストラクタ

String s2; //String クラス オブジェクト s2 の宣言
s2 = "value of String s2"; //オブジェクト s2 の作成と初期化
System.out.println("\n s2 = " + s2);
s2 = "set again s2 for test"; //変更はできる。

String s3 = new String(); //オブジェクト s3 の宣言と作成
s3 = "value of String s3"; //オブジェクト s3 の初期化

String s4 = new String("value of String s4");
//オブジェクト s4 の宣言、作成、初期化
char c1[] = {'H', 'i', ',', 't', 'h', 'e', 'r'};
String s5 = new String(c1); //String(char[] value) コンストラクタ
String s6 = new String(c1,0,2); //String(char[] value, int offset, int count)
String s7 = new String(c1,3,4);

double d1 = 3.141592;
String s8 = String.valueOf(d1);

System.out.println(" s1=" + s1);
System.out.println(" s2=" + s2);
System.out.println(" s3=" + s3);
System.out.println(" s4=" + s4);
System.out.println(" s5=" + s5);
System.out.println(" s6=" + s6);
System.out.println(" s7=" + s7);
System.out.println(" s8=" + s8 + "\n");

}
}
-------------- 文字列の長さの取得 length メンバ変数 string2.java ------------------
public class string2{
public static void main(String[] args){
String s1 = "Hello from java world !";

System.out.println("\n \"" + s1 + "\"" + "is " + s1.length() + " characters");
System.out.println(" \"" + "Hello" + "\"" + " is " + "Hello".length() + "
characters\n");
System.out.println("リテラルの長さ = " +
"こんにちは。これは文字列リテラルです。".length() );
}
}

--------文字列を連結する concat() メソッド string3.java -----------------
public class string3{
public static void main(String[] args){
String s1 = "Hello";

String s2 = s1 + " from";
String s3 = s2 + " Java !";

String s4 = s1.concat(" from");
String s5 = s4.concat(" Java !");

System.out.println("\n" + s3);
System.out.println(s5 + "\n");
}
}

---------文字と部分文字列を取得 string4.java -------------------------
// charAt(int index) index で指定した文字をかえす
// toCharArray() 現在の文字列を、char型の配列で返す
// getChar(int srcBegin,int srcEnd,char[] dst, int dstBegin)
// srcBegin から secEnd まで 配列 dst の dstBegin へコピーする。
//substring(int bigin,int end) begin から end までの String オブジェクトを返す

public class string4{
public static void main(String[] args){
String s1 = "Hello from Java !";

char c1 = s1.charAt(0);
System.out.println("The first charactger of \"" + s1 + "\" is " + c1);

char chars1[] = s1.toCharArray();
System.out.println("The second character of \"" + s1 + "\" is " +
chars1[1]);
char chars2[] = new char[5];
s1.getChars(0, 5, chars2, 0);
System.out.println("The first five characters of \"" + s1 +
"\" are " + new String(chars2));
//new String(chars) 配列を String オブジェクへ変換
String s2 = s1.substring(6, 6+4);
System.out.println("The second four characters of \"" + s1
+ "\" are " +s2);
}
}

-----------文字列を検索、置換 string5.java ---------------------
// indexOf(int ch) 文字列での ch の位置をかえす
// replace(char old, char new) old を new に置換する
public class string5{
public static void main(String[] args){
String s1 = "I have drawn a nice drawing.";

System.out.println("\n The first occurrence of \"draw\" is " +
" at location " + s1.indexOf("draw"));
System.out.println(" The last occureence of \"draw\" is " +
"at location " + s1.lastIndexOf("draw"));
String s2 = " End, you\'re hired !";
System.out.println(s2.replace('h', 'f') + "\n");
}
}

--------- 大文字/小文字の変更 string6.java ---------------------
// toUpperCase()
// toLowerCase()
public class string6{
public static void main(String[] args){
System.out.println("\n Hello from Java !".toLowerCase());
System.out.println(" Hello from Java !".toUpperCase() + "\n");
}
}
------------------------------------------------------------
2)NuberFormat クラス
このクラスを使うと、文字列内の数値を書式化することが出来る。
参考のみ。実行する必要はない。
-------- NuberFormatクラス string7.java -----------
import java.text.*;

public class string7{
public static void main(String[] args){
double value = 1.23456789;
NumberFormat nf = NumberFormat.getNumberInstance();

nf.setMaximumFractionDigits(6);

String s = nf.format(value);

System.out.println("\n " + s + "\n");
}
}
----------------------------------------------------------

3ー4。クラスの宣言/定義
1)クラス宣言の形式
[アクセス指定子] class クラス名 [extends] [implements ....] {
//メンバ変数(Field)
<型> <変数名> = 値;
//コンストラクタ(Constructor)
<クラス名>(パラメータ){
処理;
}
//メソッド(Method)
変数 = <メソッド名>(引数) {
処理;
}
}
[ ] は無い場合がある。
クラス定義には全てが含まれているわけではなく、メンバ変数のみのクラスもある。
次の class printer はメソッドのみのクラスの例である。
---------- print.java -----------------------------------------------------
class printer{
public void print(){
System.out.println("JABA からこんにちは! print class のテストです。");
}
}

public class print{
public static void main(String[] args){
printer pt = new printer(); //インスタンスの生成
pt.print(); //実行

//(new printer()).print(); //生成と実行を同時
}
}
--------------------------------------------------------------------
この printer クラスのオブジェクトの print メソッドで表示を実行している。

3ー5。インスタンスの生成
作成したクラスをプログラムで使用するには、インスタンス(オブジェクト)を作成しなけれ
ばならない。インスタンスを作成することを、「インスタンス化」と呼ぶ。インスタンスの生
成には new 演算子を使う。
[書式] クラス名 変数名 = new クラス名();

右辺のクラス名は、このクラスのコンストラクタを呼び出している。クラス名とコンストラク
タは同じ名前である。変数名はオブジェクトを参照する変数で、生成されたオブジェクトへの
参照がわたされる。これは、オブジェクトのポインタがわたされているのと同じである。しか
し、Java では、このポインタを直接操作することはできない。
上の print.java の例では pt がオブジェクトの参照変数であり、オブジェクト pt とも
言う。

3ー6。オブジェクトのコピー
1 つのオブジェクトを、複数の変数が参照することが出来る。
printer pt1 = new printer(); //オブジェクトの生成
printer pt2 = pt1; //オブジェクトのコピー
この場合、pt2 もまた pt1 と同じオブジェクトを参照している。
pt1.print();
pt2.print();
上の 2 つのステートメントは、同じことを実行する。

3ー7。メソッドの作成
メソッドとは、制御を渡し、そのコードを実行できるコードブロックのことである。クラス内
でメソッドを作成する方法は次の通り。

access class classname [extends...] [impliment...] {
[access] [static] type method1 (parameter_list){ //メソッド 1
........
}
.
.
[access] [static] type methodN (parameter_list){ //メソッド N
........
}
}
access はアクセス指定子、type は返り値の型である。
例として print.java では public void print() がある。public static void main()もメソッ
ドである。
1)クラスメンバのアクセス指定子
(1)public: public なクラスメンバは、そのプログラムのどこからでも、アクセスできる。
(2)private: private なクラスメンバは、このクラスの内部からのみ、アクセスできる。
(3)protected: protected なクラスメンバは、
同じクラス、そのクラスと同じパッケージ内の他のクラスや、
そのクラスから派生したクラスから、アクセスできる。
(4)指定子無し:同じクラス、そのクラスと同じパッケージ内の他のクラスからアクセスできる。
------------------------------------------------------------------------
場所 | private | 無し | protected | public |
------------------------------------------------------------------------
同じクラス | OK | OK | OK | OK |
同じパッケージ内のサブクラス | | OK | OK | OK |
同じパッケージ内の非サブクラス | | OK | OK | OK |
他のパッケージ内のサブクラス | | | OK | OK |
他のパッケージ内の非サブクラス | | | | OK |
------------------------------------------------------------------------

クラスの修飾子は、final,abstract と、次の2つのアクセス指定子がある。
(1)public
(2)無し

2)パラメータ付きメソッド
(1)引数付きメソッド
------------------ print2.java ----------------------------------

//------ class printer definition ----------
class printer{
public void print(String s){ //Method
System.out.println("\n " + s + "\n");
}
}
//----- class print definition -----------
public class print2{
public static void main(String[] args){
printer printer1 = new printer(); //インスタンスを作る
printer1.print("こんにちは。引数付きメソッドのてすとですねん。");
//メソッド print() に String型のオブジェクトをわたしている。
}
}

(2) main にコマンドライン引数を渡す
--------------------- main1.java -----------------------------
public class main1{
public static void main(String[] args){
System.out.println("\n Command line arguments....");

for(int i = 0; i< args.length ; i++){
System.out.println(" Argument " + i + " = " + args[i]);
}
System.out.println("\n");
}
}
コマンドは含まれない
------------------------------------------------------------
[実行]
java main1 これはコマンドライン引数のテストです。
----------------- 結果 ---------------------------
Command line arguments....
Argument 0 = これはコマンドライン引数のテストです。 まだありまっせ
Argument 1 = まだありまっせ

3) メソッドから値を返す
-------------------- kaeru.java -------------------------------
class calculater{
int addem(int data1, int data2){
return(data1 + data2);
}
}

public class kaeru{
public static void main(String[] args){
calculater calc = new calculater();
System.out.println("\n addem(2, 5) = " + calc.addem(2, 5) + "\n");
}
}
----------------------------------------------------------------
[課題]
kaeru2.java を作る (コマンドラインから data1,data2を入力)

4) データアクセスメソッドを作成する。
クラス内の メンバー変数 data_string は、private なので他のクラスからは、アクセス
できない。そこでこの data_string にアクセスするための方法として、public なメソッド
access1() を作成する。 data_string には、他のクラスからは、access1()を経由して
アクセスする。
------------- access1.java ------------------------------------------
class data{
private String data_string = "\n Hello from Java !\n";

public String getData(){
return data_string;
}
}

public class access1{
public static void main(String[] args){
System.out.println( (new data() ).getData());
}
}
------------------------------------------------------------------

3ー8。コンストラクタの作成
コンストラクタは、クラスのインスタンスを初期化するのが目的である。
クラスのコンストラクタは、クラス名と同じ名前のメソッドを追加すればよい。
だたし、アクセス指定子や、戻り値の型は指定しない。
------------------ const1.java -------------------------------
class data {
private String data_string;

//これがコンストラクタ
data() {
data_string = "こんにちは。コンストラクタの例題です。"; //初期化
}

public String getData(){
return data_string;
}
}

public class const1{
public static void main(String argv[]){
System.out.println( (new data()).getData() );
}
}

3ー9。パラメータ付き、コンストラクタ
コンストラクタにパラメータを渡して、オブジェクトを初期化する。
---------------- const2.java -------------------------------------
class data{
private String data_string;

data(String s){ //コンストラクタ
data_string = s;
}

public String getData(){ //メソッド
return data_string;
}
}

public class const2{
public static void main(String[] args){
System.out.println( (new data("\n コンストラクタに渡します。\n")).getData());
}
}
-----------------------------------------------------------------------
3ー10。クラス作成の例題
-method push - と -method pop- の部分を作成して、完成させる。
/* ---------- stack_test.java -------------------------------------
push to statck as 0,1,2,3,4,5,6,7,8,9
and then pop by H.Y 2002.3.18
-------------------------------------------------------------------*/
class stack{
private int stack_data[];
private int stack_ptr;

stack(int size){ //constructor
stack_data = new int[size];
stack_ptr = -1;
}

public int pop(){
if(stack_ptr ==-1)
return 0;
else
return stack_data[stack_ptr--];
}

public int push(int push_this){
if(stack_ptr >= 99)
return 0;
else{
stack_data[++stack_ptr] = push_this;
return 1;
}
}
}

public class stack_test{
public static void main(String[] args){
int i, popped_value;
stack stack1 = new stack(100);

System.out.println("\n Pushing values now ...");

for(i=0; i < 10; i++){
- method push ---
- print out index i and stack value--
}

System.out.println("\n Popping values now......");
for(i=0; i< 10; i++){
- method pop ----
- print out index i and stack value ----
}
}
}
---------------------------------------------------------------

3ー11。メンバの分類
クラスは、メンバ変数、メソッドと言ったメンバで構成されている。このメンバを 2 つに
分類することができる。
「静的メンバ」と「インスタンスメンバ」がある。
1)静的メンバ(Static Member)
静的メンバは static キーワードをつける。
public static void main() は 静的メソッド(クラスメソッド)である。
(1)静的変数(クラス変数)
静的変数は、クラスに対して定義されている変数である。インスタンス化で生成された
オブジェクトの全てで共通に使える変数である。別の言い方をすると、オブジェクトとは
無関係に存在できる変数でもある。
[呼び出し方は]
クラス名.変数名; Math.PI
[作成の仕方]
[アクセス指定子] static データ方 変数名;
(2)静的メソッド(クラスメソッド)
クラスに対して定義されたメソッドである。メソッドを呼び出すのに、インスタンス化
の必要は無い。
[呼び出し方]
クラス名.メソッド名(引数); System.out.println(Math.PI);
[作成の仕方]
[アクセス指定子] static 返り値のデータ型 メソッド名(引数リスト){
.....
}
(3)クラス変数の実例
------クラス変数の定義と参照のサンプル class_val.java -------------------
class data{
public static int intdata1 = 2;
public static int intdata2;
public static int intdata3;

static{
intdata2 = intdata1 * 2;
}
}

public class class_val{
public static void main(String[] args){
data a, b; //オブジェクトの 宣言

a = new data();
b = new data();

System.out.println("\n a.intdata2 = " + a.intdata2);
System.out.println(" b.intdata2 = " + b.intdata2);

a.intdata3 = 8;
System.out.println(" new a.intdata3 = " + a.intdata3);
System.out.println(" new b.intdata3 = " + b.intdata3 + "\n");

}
}
--------- 実行結果 -------------------
a.intdata2 = 4
b.intdata2 = 4 //a.intdata2 と同じ
new a.intdata3 = 8
new b.intdata3 = 8 //a.intdata3 と同じ

----------- class_val2.java --------------------------------------------
//クラス変数を呼び出すために、クラスのインスタンスを作成する必要はない。
//クラス変数は、クラスに対して呼び出す。

class data{
public static int intdata1 = 2;
public static int intdata2;

static{
intdata2 = intdata1 * 2;
}
}

public class class_val{
public static void main(String[] args){
System.out.println("\n data.intdata1 = " + data.intdata1);
System.out.println(" data.intdata2 = " + data.intdata2);
}
}
----------- 実行結果 -------------------
data.intdata1 = 2
data.intdata2 = 4

(4)クラスメソッドの実例
static の付いたメソッドで、オブジェクトを作成しなくても使用できる。
----------------------------- class_method.java ------------------------
class calculator{
static int addem(int data1 , int data2){
return(data1 + data2);
}
}

public class class_method{
public static void main(String[] args){
System.out.println("\n addem(2,9) = " + calculator.addem(2, 9) + "\n");
}
}

2)インスタンスメンバ
(1)インスタンス変数
インスタンス変数は、クラス内に定義されているので、インスタンス毎に生成される。
インスタンス変数の呼び出しは、オブジェクトに対して行う。
[呼び出し方]
オブジェクト名.変数名;
[作成の仕方]
[アクセス指定子] データ方 変数名;
(2)インスタンスメソッド
インスタンスメソッドは,オブジェクトに対して呼び出す。
[呼び出し方]
オブジェクト参照変数.メソッド名(引数リスト);
[作成の仕方]
[アクセス指定子] 返り値のデータ方 メソッド名(引数リスト){
.......
}

3) インスタンス変数の参照
2つのコンストラクタで初期化する。
---------- Two_const.java ---------------------------------
class data{
private String data_string;//メンバ変数(field)

data(char[] c){ //Constructor no.1
data_string = new String(c);
}

data(String s){ //Constructor no.2
data_string = s;
}

public String getData(){ //Method
return data_string;
}
}

public class Two_const{
public static void main(String args[]){
data d1;
data d2;
String sh = "2番目のコンストラクタ";

d1 = new data("1番目のコンストラクタ");
d2 = new data(sh);

System.out.println("d1 =" + d1.getData() + " d2 = " + d2.getData() );
}
}

3ー12。ローカル変数
メンバ変数として、クラス変数とインスタンス変数を説明した。これ以外に、メソッド内
に作成する「ローカル変数」がある。この変数はメソッド内でのみ有効である。
-------------- 例 -----------------------------
class test {
static int data1 = 100; //クラス変数
int data2 = 10; //インスタンス変数

void test() {
int i = 123; //ローカル変数

System.out.println("ローカル変数=" + i);
}
}

3ー13。this キーワード
現在のオブジェクトへの参照に this キーワードを使用すると、便利な場合がある。
1)サンプル 1
---------------- this_obj1.java ------------------------------------
class this_obj1 {
public static void main(String argvs[]){
ClassThis obj = new ClassThis();
obj.ShowStr();
}
}

class ClassThis {
int a = 10;
int b = 20;

public void ShowStr() {
System.out.println(" a in ClassThis : " + this.a); // + a でも可
System.out.println(" b in ClassThis : " + this.b); // + b でも可
}
}
------------ 実行結果 --------------
a in ClassThis : 10
b in ClassThis : 20
2)サンプル 2
------------------- this_obj2.java ---------------------------------
p.print メソッドを呼び出すと、現在のオブジェクトへの参照が p.printメソッドに
渡される。
現在のオブジェクトは、クラス型Dataで,メッセージ "...." で初期化されたオブジェクト
である。
class Data{
private String data_string;

Data(String s){ //コンストラクタ
data_string = s;
}

public String getData(){
return data_string;
}

public void printData(){
printer p = new printer();
p.print(this);
}

class printer{
void print(Data d){
System.out.println(d.getData());
}
}
}
public class this_obj2{
public static void main(String[] args){
(new Data("\n このメッセージを、コンストラクタに渡します。!\n"
) ).printData();
}
}
--------- 実行結果 -----------------
このメッセージを、コンストラクタに渡します。 !