JAVA プログラミング 入門

JAVAのプログラミングについて初歩から解説します。まずは、mainメソッド、変数、演算、if文、for文、while文、メソッド、配列など。続いて、メソッドを複数構成して、プログラムを作成(非オブジェクト指向プログラミング)、しばらく後になると思いますが、オブジェクト指向プログラミングを解説します。 クラスの構成、コンストラクター、継承、・・・、など、本格的OOP(Object Oriented Programming)を解説します。

Java: クラスの継承 toStringメソッドの継承と使い方(オーバーライド)

図Proo5_1_㏛cは「クラスの継承: toStringメソッドの継承と使い方」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。

f:id:Kurokawa_Tomio:20190629150213p:plain
図Proo5_1_src
このプログラムにはBook、ProBook、Proo5_1のクラスがある。BookがProBookに継承されている。toStringメソッドがオーバーライドされている。

toStringメソッドはそのオブジェクト独特の文字列を返す特別のメソッドである(必ずしも独特でなくてもよい)。修飾子としてpublic Stringが付き、returnで文字列を返す。
その他は、通常のメソッドと同じように親クラスから子クラスへ継承できる。

図Proo5_1_srcについて
7,8行 BookのtoStringメソッドである。

15,16行 子クラスProBookのtoStringメソッドである。superを使って親クラスのtoStringを利用している。

20行 親クラスBookのオブジェクトaを生成している。
21行 printlnメソッドは引数として文字列を要求するので、aは文字列に変換される。そのとき、aのtoStringが機能して文字列をprintlnに返している。その結果として、27行の文字列が表示されている。

22行 bは子クラスProBookのオブジェクトになる。
23行 bの文字列が表示される。結果は28行にある。

以下にソースを付加する。

/*クラスの継承 toStringメソッドの使い方*/
class Book {
	String title;int page;
	Book(String title, int page){
		this.title=title;this.page=page;
	}
	public String toString(){return "[title="+
						title+"](p="+page+")";}
}
class ProBook extends Book{ 
	int category;
	ProBook(String title, int page, int category){
		super(title,page);this.category=category;
	}
	public String toString(){return super.toString()+
						"[category="+category+"]";}
}
class Proo5_1{
	public static void main(String[] args){
		Book a=new Book("Introduction to Java",500);
		System.out.println(a);
		ProBook b=new ProBook("Introduction to C",300,1);
		System.out.println(b);
	}
}
/*
[title=Introduction to Java](p=500)
[title=Introduction to C](p=300)[category=1]
*/

JAVA PROGRAMMING 入門 TOP へ

Java: クラスの継承 Override, superの使い方

図Proo4_1_㏛cは「クラスの継承 Override, superの使い方」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。

f:id:Kurokawa_Tomio:20190628213231p:plain
図Proo4_1_src
このプログラムにはBook、ProBook、Proo4_1のクラスがある。Bookが親クラス(スーパークラス)でそれがProBook(子クラスまたはサブクラス)に継承されている。継承するには10行のようにextendsを使て親クラス名を書く。条件(後に学習)にもよるが、コンストラクタ以外は殆ど全て継承される。ProBookクラスは親のフィールドとメソッドを継承し、フィールドとしてcategory,コンストラクタとしてProBook,メソッドとしてdisplayを新しく追加している。

21行 a,bをBook型の参照変数としている。
22行 親クラスBookのオブジェクトをaに作っている。
23行 親クラスのメソッドdisplayによりaのtitleとpageを表示している。

24行 子クラスProBookのコンストラクタにより三つの引数でオブジェクトを作成している。そのとき、super(title,page)により親クラスのコンストラクタを使用している。子クラスのコンストラクタから親クラスのコンストラクタを呼ぶ場合、コンストラクターの先頭で呼ばなければならない。オブジェクトが二重にできるわけではない。従って、bは子クラスのコンストラクタによるオブジェクトとなる。

25行 bには継承したメソッドpsetがある。これは継承しただけのメソッドで親クラスのものと同じである。継承したメソッドで継承したフィールドを修正している。

26行 displayは継承した上で、更に追加として、categoryの表示ができるようにしている(15から17行)。display()は親クラスと子クラスの両方に同じ名前で存在する。その場合子クラスのdisplayは継承したメソッドが上書きされている。子クラスではオーバーライド(上書き)したメソッドだけが存在する。16行のsuperで親クラスのdisplayの機能を取り込んでいる。更に、categoryも表示できるようにしている。30,31行はオーバーライドしたメソッドdisplayにより表示されている。

子クラスのオブジェクト参照変数に親クラスのオブジェクトをセットすることはできない。21行のa,bは親クラスの参照変数であるので、どちらのオブジェクトも受けいれることができる。

一般にオブジェクトの機能はどちらのコンストラクタ(親か子か)で作られているかで働きが違ってくる。
以下はソースです。

/*クラスの継承 Override, superの使い方*/
class Book {
	String title;int page;
	void display(){System.out.println("title="+title+", page="+page);}
	void pset(String title, int page){this.title=title;this.page=page;}
	Book(String title, int page){
		this.title=title;this.page=page;
	}
}
class ProBook extends Book{
	int category;
	ProBook(String title, int page, int category){
		super(title,page);this.category=category;
	}
	void display(){
		super.display();System.out.println(" category="+category);
	}
}
public class Proo4_1{
	public static void main(String[] args){
		Book a,b;
		a=new Book("Introduction to Java",500);
		a.display();
		b=new ProBook("Introduction to C",300,1);
		b.pset("Intoduction to C++",400);
		b.display();
	}
}
//title=Introduction to Java, page=500
//title=Intoduction to C++, page=400
// category=1

JAVA PROGRAMMING 入門 TOP へ

Java: コンストラクタ---thisの使い方

Java: コンストラクタ---thisの使い方

図Proo3_1_㏛cは「コンストラクタ—-thisの使い方など」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。

f:id:Kurokawa_Tomio:20190627162413p:plain
図Proo3_1_src
このプログラムにはBookとProo3_1のクラスがある。Bookクラスにはdisplay()以外に二つのメソッドがある。どちらもBookという名前であるが、一方は引数がなく,もう一方は二つの引数がある。これらは特殊なメソッドでコンストラクタと呼ばれる。コンストラクタの名前はクラス名と同じである。コンストラクタには戻り値がない。従って、Bookの前にはintなどの修飾子が付いていない。18,20行ではコンストラクタが呼ばれている(コンストラクタの前にnewを付ける、それをnew演算子と呼ぶ)。コンストラクタを呼ぶ場合、引数の数、型、その順番が一致しているコンストラクタが呼ばれる。18行のコンストラクタコールの場合、6行の引数なしのコンストラクタが呼ばれる。20行のコールの場合、12行のコンストラクタが呼ばれる。

コンストラクタの働きはオブジェクトを作ることである。引数があってもなくて、オブジェクトのフィールドは何らかの形で初期化される。多くの場合引数で初期化される。コンストラクタの引数は一般にオブジェクトのフィールドを初期化するためのデータであることが多い。


図Proo3_1_srcについて:

18行 引数なしのコンストラクタがコールされている。6行のコンストラクタである。このコンストラクタはdefaultでフィールドを初期化している(26行参照)。

20行 引数が二つあるコンストラクタが呼ばれている。つまり、12行のコンストラクタである。その中で、this(title)により12行のコンストラクタが呼ばれている。thisとは『このクラスの中にあるコンストラクタ」を意味である。this(title)であるから、引数はString型が一つあるコンストラクタを意味する。従って、7行のコンストラクタが呼ばれる。この中でさらにthis()が呼ばれている。これは、引数のないコンストラクタを呼んでいる。つまり、6行のコンストラクタである。コンストラクタの中でコンストラクタを呼ぶ場合、最初に呼ばなければならない。何度コンストラクタを呼んでも二重、三重にオブジェクトができるわけではない。

5行 引数の名前とクラスのフィールドの名前が同じである場合、
クラスフィールドの前にthisを付けて区別する。thisを付けなくても区別できる場合は付ける必要はない。

図Proo3_1_㏛cで扱ったプログラムには働きは違うが、同じ名前の複数のコンストラクタがあった。このように引数の数、並びが違う同じ名前のコンストラクタ又はメソッドを定義することをオーバーロードという。

/*コンストラクタ--thisの使い方など*/
class Book {
	String title;int page_suu;
	void display(){System.out.println("title="+title+", page_suu="+page_suu);}
	void set_Book(int page_suu){this.page_suu=page_suu;}
	Book(){System.out.println("引数のないコンストラクタが呼ばれた");}
	Book(String title){
		this();
		System.out.println("titleが引数のコンストラクタが呼ばれた");
		this.title=title;
	}
	Book(String title, int page_suu){
		this(title);set_Book(page_suu);
	}
}
class Proo3_1{
	public static void main(String[] args){
		System.out.println("aについて");Book a=new Book();a.display();
		System.out.println("bについて");
		Book b=new Book("Introduction to Java",500);b.display();
	}
}
/*
aについて
引数のないコンストラクタが呼ばれた
title=null, page_suu=0
bについて
引数のないコンストラクタが呼ばれた
titleが引数のコンストラクタが呼ばれた
title=Introduction to Java, page_suu=500
*/

JAVA PROGRAMMING 入門 TOP へ

Java: コンストラクタ--引数の扱い方

図Proo2_1_㏛cは「コンストラクタ--引数の扱い方」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。

f:id:Kurokawa_Tomio:20190626174328p:plain
図Proo2_1_src
このプログラムにはBookとProo2_1のクラスがある。Bookクラスにはdisplay()以外に二つのメソッドがある。どちらもBookという名前であるが、一方は引数がなくもう片方は二つの引数がある。これらは特殊なメソッドでコンストラクタと呼ばれる。コンストラクタの名前はクラス名と同じである。コンストラクタには戻り値がない。従って、Bookの前にはintなどの修飾子が付いていない。17,19,21行ではコンストラクタが呼ばれている。コンストラクタを呼ぶ場合、引数の数、型、その順番が一致しているコンストラクタが呼ばれる。引数が一致している場合(17,19行)、9から13行で定義されているコンストラクタが呼ばれる。引数がない場合(21行)、8行で定義されているコンストラクタが呼ばれる。
コンストラクタの働きはオブジェクトを作ることである。引数があってもなくて、オブジェクトのフィールドは何らかの形で初期化される。多くの場合引数で初期化される。

コンストラクタの引数は一般にオブジェクトのフィールドを初期化するためのデータであることが多い。例の場合、本のタイトルとページ数が引数として与えられている。19行のようにフィールドデータとして適切でない値(-300)が与えられた場合など、警告のメッセージを出すことができる。以下にソースを張り付けます。

/*コンストラクタ1*/
class Book {
	String title;
	int page_suu;
	void display(){
		System.out.println("title="+title+", page_suu="+page_suu);
	}
	Book(){title="Java 入門"; page_suu=200;}
	Book(String a, int b){
		title=a; 
		if(b<0) System.out.println("ページ数がマイナスです");
		page_suu=b;
	}
}
class Proo2_1{
	public static void main(String[] args){
		Book a=new Book("Introduction to Java",500);
		a.display();
		Book b=new Book("Introduction to C",-300);
		b.display();
		Book c=new Book();
		c.display();
	}
}
/*
title=Introduction to Java, page_suu=500
ページ数がマイナスです
title=Introduction to C, page_suu=-300
title=Java 入門, page_suu=200
*/

JAVA PROGRAMMING 入門 TOP へ

Java: 初めてのオブジェクト作成(Constructorを書かない)

図Pron1_1_㏛cは「初めてのオブジェクト作成(Constructorを書かない)」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。

f:id:Kurokawa_Tomio:20190625201814p:plain
図Pron1_1_src
クラスはオブジェクト作成のテンプレートのようなものである。オブジェクトを作成するには先ずそのテンプレートであるクラスが必要である。クラスは例えば以下のような形をしている。

class クラス名{
フィールドの宣言; ・・・・;フィールドの宣言;
メソッドの宣言;・・・;メソッドの宣言;
}

フィールドの宣言とはint, double, 配列変数、オブジェクト変数などである。
メソッドの宣言とはメソッドの定義である。オブジェクト属するメソッドとする場合はstaticを付けない。

図Pron1_1_srcの場合、BookとPron1_1がクラスである。Bookは二つのフィールドtitleとpage_suuを持っている、またメソッドdisplayを持っている。String title;によりtitle はStringタイプの参照変数となり int page_suu;によりpage_suuはint変数となる。従って、Bookはそれらのフィールドとメソッドを持つクラスである。クラスはオブジェクトを作るテンプレートである。

12行 変数aをBook型の参照変数として宣言している。
13行 new Book()によりBook型の新しいオブジェクトを作っている。このオブジェクトはBookクラスで定義している内容を持っている。それなりのメモリーが必要で、Javaのシステム内のどこかにとられ、その参照がaにセットされる。つまり、aはtitle, page_suu, dispayを持っているオブジェクトともいえる。
14行 Stringの参照変数titleに文字列”Introduction to Java”がセットされる。
15行 aのpage_suuに500がセットされる。
16行 aはBook型のオブジェクトであるのでその中にはdisplayメソッドがあり、a.dispay();のように使用できる。displayはtitle, page_suuを表示している。
17行 aと同じようにbが宣言されている。
18行 bにオブジェクトがセットされる。
19行 b.titleに文字列がセットされる。
20行 b.page_suuに300がセットされる。
21行 bの内容が表示れる。
24行 cのフィールドは明示的には初期化されていないので、defaultの値で初期化される。

コンストラクターについて:
Book()はコンストラクターと言われ、newを付けて呼ばれる特殊なメソッドである。このプログラムにはコンストラクターが明示的には何も定義されていない。その場合は引数のないコンストラクターが定義される。コンストラクターの名前はクラス名と同じである。引数のないコンストラクターを呼ぶとフィールは決まった値で初期化され、オブジェクトができる。数値の場合
はゼロ、booleanはfalseなどである。

30行 titleはnull(ナル)で、page_suuは0で初期化されている。nullとはこの場合、参照変数titleがどこも参照していない状態である。

GO TO Java: Understanding Classes

以下にソースを張り付けます。よかったら使ってください。

/* 最初のオブジェクトの作成(Constructorを書かない)*/
class Book {
	String title;
	int page_suu;
	void display(){
		System.out.println("title="+title+
				", page_suu="+page_suu);
	}
}
class Pron1_1{
	public static void main(String[] args){
		Book a;
		a=new Book();
		a.title="Introduction to Java";
		a.page_suu=500;
		a.display();
		Book b;
		b=new Book();
		b.title="Introduction to C";
		b.page_suu=300;
		b.display();
		Book c;
		c=new Book();
		c.display();
	}
}
/*
title=Introduction to Java, page_suu=500
title=Introduction to C, page_suu=300
title=null, page_suu=0
*/

JAVA PROGRAMMING 入門 TOP へ

数値積分による円の面積の計算

台形の面積の計算法を使って円の面積を近似する

Prog10_1_sekibunは半径1の単位円である。

f:id:Kurokawa_Tomio:20190622151803p:plain

図Prog10_1_sekibun

X軸上の二つの点A(Xi,0)B(Xi+1,0)からX軸に垂線を引き,円と交わったところをD(Xi,f(Xi)), C(Xi+1,f(Xi+1))としている。ADBCは平行であるから、四角形ABCDは台形を構成している。この台形の高さはa=Xi+1-Xiである。aを一定にしたこのような台形をn個描くとすると幅(台形の高さ)1/nとなる。ただし、最初の台形のA点は原点(0,0),二つ目の台形のA点は(1/n, 0),三つ目の台形のA点は(2/n, 0),…,最後の台形のA点は((n-1)/n, 0),B点は(n/n, 0)これらnの台形の面積の合計はnが十分に大きければ、円の面積のほぼ1/4となると考えることができる。従って、以下の ような手順での面積の近似計算をすることができる。全ての台形の面積の合計Totalは以下の式で表すことができる

f:id:Kurokawa_Tomio:20190622151928p:plain

図Prog10_1_shiki

式1はn個の台形の合計面積、式2は一つ一つの台形の面積、式3は点Aにの台形の下底の長さ、式4は台形の上底の長さ、式5は(x,0)における円上の+y座標。

Prog10_1_srcは単位円の面積を数値積分により計算するプログラムである。プログラムの末尾に実行結果が表示されています。

f:id:Kurokawa_Tomio:20190622152340p:plain

図Prog10_1_src

式1の計算手順をプログラム化したものが、図Prog10_1_srcのメソッドen_area()である。

 

Prog10_1_srcについて:

3,4行 x1,x2doubleで、nintで宣言しています。

5行 メソッドf(x)Math.sqrt(1.0-x*x)としています。これは単位円のグラフにおけるy座標に相当します。上の式5です。MathJavaが用意しているライブラリーの標準パッケージのMathクラスです。sqrtはそこにあるメソッドです。

6行 メソッドdaikei()は台形の面積の計算式に相当します。

7から16行 全ての台形(0からn-1)の合計の4倍です。

27から29行 実行結果です。

27行 n=1のとき、面積は四つの三角形の合計で2.0になります。

n=10 のとき、面積は3.10...

n=100000のとき 面積は3.141592… かなり精度が上がっています。単位円の面積はπであるから、ほぼ正しいと結果と言えるでしょう。

JAVA PROGRAMMING 入門 TOP へ

Java: 参照渡しの引数を使うメソッド: 色々な場所にあるデータとメソッド

Prog9_4_cは「参照渡しの引数を使うメソッド: 色々な場所にあるデータとメソッド」の説明のための例である。このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190621173653p:plain

図Prog9_4_src



Prog9_4_srcで注目すべきことは、このソースプログラムには二つのクラスが宣言されていることであります。一つはクラスD、もう一つはProg9_4である。今回の主なテーマは別のクラスにある配列とメソッドを扱うことです。クラスDにはdという配列と、メソッドgがある。例えば、これらを別のクラスProg9_4から使うことです。このクラスProg9_4には配列bがあり、またメソッドfがある。これらもProg9_4の中にあるmainから使うことにします。

 

Prog9_4_srcについて:

 

3行:クラスDの中の配列dの定義:

4から8行:クラスDの中のメソッドgの定義

3番目の引数は配列であります。このメソッドは配列のデータの和を計算して返しています。

 

11: クラスProg9_4の中の配列bの定義:

12から16:メソッドfの定義:

3番目の引数は配列です。このメソッドは配列のデータの和を計算して返しています。これはgと全く同じである。

 

17から25:メソッドmainの定義

18行 mnの定義と初期化

19 行 配列aが定義され、初期化されています。

 

20 行 メソッドfが配列aを引数として呼ばれています。fでは配列のデータを計算して返し、20行で表示しています(45)。

 

21mainにある配列aのデータをmainの外にあるが、クラスProg9_4内にある配列bと別のクラスD内にある配列dにコピーしています。配列dはクラスProg9_4外にあるので、D.dで指定しなければなりません。つまり、クラス名.配列名となります。

 

22行 クラスD内にあるメソッドgD.gにより読んでいます。クラス外のメソッドであるからです。

 

24行 D内にあるメソッドgD.gにより、さらに配列dD.dにより使用しています。つまり、クラス外にあるメソッドも配列(或いは変数)もそのクラス名を付けて指定しなければなりません。

JAVA PROGRAMMING 入門 TOP へ

Java: 参照渡しの引数を使うメソッド

Prog9_3_cは「参照渡しの引数を使うメソッド」の説明のための例である。このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190620162202p:plain

図Prog9_3_src

今週のお題「おとうさん」



Prog9_3_srcmainメソッドの外で定義されているメソッドと変数や配列は全てstaticであり、Prog9_3クラスの中で宣言されています。このよにクラス内に書かれたメソッドや配列を定義すると,それらはそのクラス内に書かれたメソッドから見えます。

 

Prog9_3_srcについて:

3行:配列bの定義

4行:int bの定義

5から11: メソッドfの定義

引数として、intだけでなく、配列も定義されています。配列を引数とする場合その受け渡しは「値渡し」でなく、「参照渡し」になります。値ではなく、参照が渡されるのです。このメソッドの機能は配列tmからnまでの和を計算し返すことです。

12から18行:mainメソッド:

intmnが定義されています。更に配列aが定義され初期化されています。これらはmainの中だけで有効な変数や配列です(ローカル変数)。

15:  メソッドfが呼ばれています。mainからfmnは値がコピーされます。aは配列であるので、aの参照がメソッドftへコピーされます。このようにすると、メソッドfの中で、tという配列名でmainの配列aを参照することができます(書き込むこともできる)。ここでは配列のindex0から9まで値の和を計算して、返し、表示しています(45)。

16: 配列aの値が、配列bへコピーされます。注意すべき点は配列bmainの外で定義されているということです。このようにmainの外で定義されていても、それらの変数や配列にメソッドからアクセスすることができます。

17: 配列bの参照をメソッドfに渡して、そのデータを使うことができます。

ここでstaticで定義したメソッド、配列、変数は全てclass Prog9_3の中のことです。これらはクラス Prog9_3に属するクラス変数、クラスメソッドと言われるものです。これらはオブジェクトを作らなくても、クラスの中で定義するだけで、使えます。オブジェクト指向プログラミングを学習するとクラスに属するメソッドや変数とオブジェクトに属するメソッドや変数の違いを理解できます。

非オブジェクト指向プログラミングではローカル以外は全てstaticで定義する必要があります。C言語ではオブジェクトを作成しませんが、それと同じようなプログラミングということになります。

JAVA PROGRAMMING 入門 TOP へ

Java: メソッドからメソッドを呼び出す

Prog9_2_cは「メソッドからメソッドを呼び出す」の説明のための例である。このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190619194648p:plain

図Prog9_2_src

今週のお題「おとうさん」

Prog9_2_srcで定義されているメソッドは全てstaticであります。このような方法で多数のメソッドでプログラムを構成すれば複雑な大きなプログラムも作成することが可能です。

Prog9_2_srcについて:

3から7行:メソッドf1

引数で受け取った整数nにより1からnまでの整数の合計を計算し、戻しています。

 

8から12行:メソッドf2

引数で受け取った整数nにより1からnまでの整数の平方の合計を計算し、戻しています。

 

13から20行: メソッドp

引数で受け取った整数x,nを使って、x=1のときf1(n)の計算をして、返しています。x=2のときf2(n) の計算をして、返しています。x1,2以外のとき-1を返しています。このメソッドからメソッドf1, f2を呼び出しています。

 

21から24行: メソッドmain

System.out.printlnの中で、p(1,10)p(2,3)を実行して、それぞれ戻り値を表示しています。図Prog9_2_srcの行27,28を参照。このメソッドからメソッドpを二か所で呼び出しています。

JAVA PROGRAMMING 入門 TOP へ

Java: 引数なしメソッド と 値渡しの引数を持つメソッド

Prog9_1_cは「引数なしメソッド と 値渡しの引数のメソッド」の説明のための例である。このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190619114119p:plain

図Prog9_1_src



JAVAは本来オブジェクト指向のプログラミング言語であるが、現在まで学習したプログラミング(プログラマーがオブジェクトを設計しない)はオブジェクト指向のプログラミングではありません(非オブジェクト指向プログラミング)。今までオブジェクトがなくても実行できるメソッドを書いてきました。mainメソッドです。これはオブジェクトなしで直ちに実行できました。メソッドがオブジェクトなしで実行可能であるためにはmainメソッドのように修飾子として、staticがついている必要があります。ここでは、メソッドについて学習しますが、非オブジェクト指向のプログラムを作るためには全てのメソッドの修飾子をstaticにする必要があります。図Prog9_1_srcで定義されているメソッドは全てstaticであります。

 

staticメソッドは以下の形をしています。

 

static 戻り値の型 メソッド名(引数1,…,引数n){

 本体文;

return 戻り値;

}

 

戻り値の型は図Prog9_1_srcではint又はvoidとなっています(3,6,13)intであればメソッドが終了するときにreturnで値を返さなければなりませんが、その値の型がintでなけらばなりません。すなわち、両者は型が一致する必要ががあります。voidの場合はreturn文は必要ありません。または、値なしでreturn;と書きます。

 

3から5行:メソッド名はkです。引数はありません。このメソッドは単にメッセージを表示するだけです。実行するときはk();と書きます(14)。メソッドの実行が終わると、メソッドが呼ばれたところに帰ります(14行)。

 

6から12行:メソッド名はfです。引数は二つ宣言されています。どちらもint型です。このメソッドは15行目(printlnの中)から呼び出されています。println文は、まず”f(m,n)=”と表示しようとします(まだ表示しません)。続いて、mainfmn の値をメソッドfの引数、それぞれmnにコピーします(値を渡しているので「値渡しの引数」と言われます。)。7行目が実行され、sが初期化されます。続いて、8から9行目が実行され、sに整数mからnまでの和が加算されます。このsreturn sにより、15行のf(m,n)の所に返されます。更にこの値(整数55)が文字列に変換されて、文字列”f(m,n)=”に連結され、”f(m,n)=55”となり、表示されます。

 

mainメソッドでは変数m,nが使用され、メソッドfの実引数として使われています。このm,nの値がメソッドfの仮引数m,nにコピーされます。実引数と仮引数は両方とも名前がm,nですが、両者は全く別の変数です。mainm, nはメソッドfm, nとは全く別の変数です。

 

 

値渡し:

引数が基本データタイプの場合,「値渡し」が行われます。

基本データタイプとは、int, short, long, float, double, byte, char, booleanです。

値渡しの場合、引数に関して、呼び出し側には影響は及びません。引数はメソッドに向かってコピーされるだけですから。仮にメソッド側で引数の値を変更しても、呼び出し側に戻って来たときその変更は呼び出し側に何の影響も与えません。

JAVA PROGRAMMING 入門 TOP へ

Java: 配列の初期化、多次元配列

Java: 配列の初期化、多次元配列

Prog8_3_cは配列の初期化や多次元配列の説明のための例である.このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190617175042p:plain

図Prog8_3_src

今週のお題「おとうさん」



多次元配列の宣言は,例えば、以下の形をしています.

二次元配列:

int a; a=new int[2][3];

int a; a=new int[2][3];

 

上記の二つは同じである。int 3つ連なったものが2つあると考えられます。

 

三次元配列:

double[] b; b=new double[3][4][5];

この場合だと、double5つ連なったものが4つありさらにそれが3つあると考えられます。

Java Array in English

Prog8_3_cについて:

4行目: 配列変数aが宣言され、3(0, 1, 2)の整数で初期化しています。整数の数が3つであるので、配列の大きさは3になります。内容は24行目に表示されています。

5行目:3つの整数列が2つあるので、配列b2*3の構造になります。

6行目:配列cの構造は2*3です。bと同じです。

8行目:a.lengthは配列aの大きさ(長さ)です。

13行目:b[j].lengthb[j]の長さです。つまり2です。

14行目:配列bと配列cは同じ構造で、しかも同じ内容に設定されます。

25,26行:その内容が表示されています。bcは全く同じです。

JAVA PROGRAMMING 入門 TOP へ

 

Java: do while, 配列2、配列変数

Java: do while, 配列2、配列変数

 

Prog8_2_cdo whileの繰り返しと配列の続きの説明のための例である.このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190617145042p:plain

図Prog8_2_src



do while文は例えば以下の形をしています.

 

do {

本体文

}while(条件);

 

先ずdoのブロック内の本体文が一回実行される。次に条件か評価され、成立しておれば、本体文が再度実行され、条件が成立しなくなるまで繰り返される。注意すべき点は本体文は1度以上実行されることであります。

Prog8_2_do_while_flowchartを参照。

f:id:Kurokawa_Tomio:20190617145131p:plain

図Prog8_2_do_while_flowchart

今週のお題「おとうさん」

Prog8_2_cについて:

4, 5行、int a;int b;は同じ働きの宣言です。

6行目はint c[];によりbと同じ形の配列変数cを宣言し、c=b;によりcという配列変数でもbと同じように扱えるようにしています。すなわち、同じ一つの配列を配列b, 配列cとして扱えるようにしているということです。

7から12行は配列a,配列bに同じ値をセットしています。

14から17行で配列a, bの内容を表示しています。配列cは配列bと同じはずです。

JAVA PROGRAMMING 入門 TOP へ

 

Java: while: 繰り返し, 配列1

Java: while: 繰り返し, 配列1

 

Prog8_1_srcwhile: 繰り返し, 配列の説明のための例である.このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190617111421p:plain

図Prog8_1_src



while文は例えば以下の形をしています.

 

while(条件){

本体文

}

 

条件が最初に評価される。その条件が成り立てば、本体文が実行され、再度条件が評価される。条件が成り立たなくなるまで繰り返される。注意すべき点は、最初に条件が評価されるので、それが可能なように準備しておかなければならない。例えば、条件がi<5などの場合、iに何か値が設定されていなければならない。したがって、while文に入る前に、i=0;などの設定が必要である。また、条件の評価が繰り返し毎に行われるので、条件がいつかは、成立しないようになっていなけばならない。例えば、本体文の最後で、i++;などが必要である。Prog8_1_for_flowchartを参照。

f:id:Kurokawa_Tomio:20190617111814p:plain

図Prog8_1_flowchart

Prog8_1_srcについて:

 

4行目、int[] a;aintの配列変数であることを宣言しています。つまり、

aint型の変数が一列(一次元)に並んでいるメモリのアドレスとなる変数であることを意味します。

 

5行目のa=new int[5];。これが意味することは、どこかに、int型の一次元メモリが五つ準備される。そして、aにその先頭アドレスがセットされる。さらに0, 1, 2, 3, 4の番号を付けられる。それぞれのメモリは例えば、a[0], a[3]などにより指定して、その中に整数値を入れたり、またはそこから、データを引き出すことができるようになります。図Prog8_1_arrayを見てください。aからでている矢印はaが配列メモリの先頭アドレスを示していることを意味します。

f:id:Kurokawa_Tomio:20190617112015p:plain

図Prog8_1_array

今週のお題「おとうさん」



6,7行目はiを宣言して、1をセットしている。これは、次にくるwhile文の制御のためです。

 

8行目でi<5i5より小さいかどうかをチェックしています。そうであれば、a[i]=i;で配列のi番目にiの値を入れます。次に、i++;i1を加えて、while文に戻ります。再度i<5をチェック、i<5が成立しなくなるまで

繰り返します。これにより、0から4までの値がその順番で、配列aにセットされます。

 

14から17行は同じようなwhile文により配列の中身を表示しています。23行から27行を見てください。

JAVA PROGRAMMING 入門 TOP へ

Java: 二重のfor文 、break文、 continue文 、printf

Java: 二重のfor文 、break文、 continue文 、printf

 

Prog7_2_c二重のfor文、 break文、 continue文、 printfの説明のための例である.このプログラムの最後にコメントで実行結果が示されています。

f:id:Kurokawa_Tomio:20190615180550p:plain

図Prog7_2_src

今週のお題「おとうさん」



二重のfor文は例えば以下の形をしています。

 

for(11;12;13){

……

for(21;22;23){

}

……

}

 

外のfor文の一つ一つについて、内側のfor文が実行される。もし、外側の繰り返しがnで、内側の繰り返しがmであれば、文はm*n回実行される。

内側のforは外のforにネストしていると言える。

 

Prog7_2_cについて:

このプログラムは九九の表を作ろうとしているプログラムであるが、

continue;break;を入れて、わざと完全な表を作らないようにしている。5行目は,i=3のとき、それ以下を実行しないで、直ちに4行目のi++を実行している。すなわち外側の制御変数i1進めている。したがって、実行結果の1617行の間にi=3に関する行がなくなっている。すなわち、continue;はそのループ内で、繰り返しを強制的に1つ進める働きがある。7行目のbreak;はそのループ(内側)を直ちに終わらせ、10行目に進む。従って、実行結果にはどの行にもj=8,9の列がなくなっている。

まとめると、

break; ます。 break;が存在する最も内側のループをただちに抜ける。

continue; 最も内側の繰り返しをただちに一つ進める。

 

8行目のprintfに関して:

C言語のprintf関数と同じである。すなわち、値を表示するとき、フォーマットを決めてプリントするということです。整数にはdの記号を使い、桁、すなわち、プリント・ポジションの数を%の後の数字で指定しています。%4dの場合は桁数は最大4として、整数を表示、ただし、桁数が少なければ、左側にペースを付加することを意味する。このスペースも含めて4桁であることを意味します。

10行目の¥nは改行を意味する。

 

その他、実数などの小数点を付けて表示することもできる。後程、機会があれば説明します。

JAVA PROGRAMMING 入門 TOP へ

 

JAVAの基本とCompilerのインストール

JAVAはオブジェクトを作ることなく大きな複雑なプログラムを書くことができる。C言語でプログラムを書くようにすればよい。それにはJAVAの基本と作成するプログラムは全てstaticとして設計すればよい。

先ずは、無料コンパイラーをインストールすることから始めましょう。

 

1.OpenJDKをダウンロードして、インストールする。

http://jdk.java.netにアクセスし、以下のように表示される。

 

Ready for Use JDK12

 

JDK12(番号が大きくなっている可能性あり)をクリックし、自分のパソコンのOSに対応するものをダウンロードする。

 

例えばwindows /x64を選んび zip(sha 256)をクリック、するとzipファイルがダウンロードされる。

例えば、openjdk-12.0.1_win...zip

 

ダブルクリックして、それを解凍、jdk-12.0.1のようなディレクトリーがでる。それを適当な場所にコピーする。

 

例えば

C:\Program Files\java

 

2.Pathの設定:

Windows10では以下のようにクリックして行き、

スタート、Window システムツール、コントロールパネル、システム、システムの詳細設定、環境変数

 

システム環境変数の枠内でPathをクリック(Pathがある場合)、編集をクリック、JDKをインストールしたディレクトリーに\bin;を追加したものを設定する。上へを数回クリックして、設定したディレクトリーをTOPに持ってくる。OKをクリック。システム環境変数のPath(先ほど見たもの)に今設置したディレクトリーが追加されていることを確認する。例えば

 

C:\Program Files\java\jdk-12.0.1\bin

 

*このbinの中にJAVAコンパイラーがあります。

/は¥と同じである。

 

システム環境変数の枠内でPathクリック(Pathがない場合)

新規をクックして、以下を設定する。

変数名 Path

変数値 JDKをインストールしたディレクトリーに\bin;を追加したもの

 

例えば

変数名 Path

変数値 C:\Program Files\java\jdk-12.0.1\bin 

 

これでプログラムを作る準備ができたことになります。

 

これから後のプログラムの作成は本ブログ(JAVA PROGRAMMING)の「最初のプログラム」のページに進んでください。

  Java 最初のプログラム

JAVA PROGRAMMING 入門 TOP へ