【Java】クラスフィールドとクラスメソッド
クラスフィールドとは
全インスタンスに共通の情報を保持する場所としてクラスフィールドと呼ばれるフィールドを宣言することができます。クラスフィールドはクラス変数と呼ばれることもあります。クラスフィールドはクラスの情報を保持する、全てのインスタンスに共通のフィールドです。クラスフィールドはstaticという修飾子が付きます。
例えば、円の面積や円周を求めたい場合、共通して円周率=3.14を使って計算しますよね。そこで定数という形でクラスフィールドを使います。
private static final double PI = 3.14; //円周率
クラスフィールドをつかって円の面積や円周を計算する方法を記述したクラスとメインメソッドのクラスを記述してみます。
public class Circle { //クラスフィールド:定数 private static final double PI = 3.14; //円周率 //フィールド private double r;//半径 //円の面積 //半径×半径×円周率の値をgetAreaに返します public double getArea(){ return this.r * this.r * PI; } //円周 //直径×円周率をgetlengthに返します。 public double getLength(){ return this.r * 2 *PI; } //getter & setter //setRの引数rをフィールドrに返します public void setR(double r) { this.r = r; } }
public class Sample { public static void main(String[] args) { //クラスCircleをインスタンス化、Circle型の変数circleに代入 Circle circle = new Circle(); //半径をセットする circle.setR(5.0); //面積を表示する System.out.println(circle.getArea()); //円周を表示させる System.out.println(circle.getLength()); } }
クラスメソッドとは
フィールドにインスタンスフィールドとクラスフィールドがあるように、メソッドにもインスタンスメソッドとクラスメソッドがあります。クラスメソッドを宣言するときにもstaticという修飾子が付けられます。
クラスメソッドは特定のインスタンスと関連付けられていません。クラスメソッドのなかで「現在のインスタンス」を示すthisやsuperを使うとコンパイルエラーになります。
インスタンスメソッドとクラスメソッドの使い分けは、現在のインスタンスの状態を調べたり、現在のインスタンスに対して処理を行ったりするメソッドはインスタンスメソッドとして宣言するのが普通です。これに対して、そのクラスのインスタンスの中からある特定のインスタンスを見つけ出すメソッドや、クラスフィールドに対して計算や処理を行うメソッドはクラスメソッドとして宣言するのが普通です。
では応用例として、前回の長方形を定義したクラスでインスタンス化された数を知りたい場合どうしたら良いでしょう。
コンストラクタはインスタン化される度に呼びだされます。コンストラクタが呼び出されたときの番号をnumberフィールドに代入します。そのためには、コンストラクタが呼び出される度にカウントした情報を保持するフィールドを宣言する必要があります。counterフィールドを全インスタンスに共通の情報を保持する場所としてクラスフィールドに設定し、クラスフィールドに対して処理を行うクラスメソッドをつかってインスタンス化された回数を調べてみます。
calss Rectangle{ //クラスフィールド //カウンターとしてクラスフィールドcounterを宣言します。 private static int counter = 0; //フィールド public int number; //コンストラクタ public Rectangle(int w,int h){ this.width = w; this.height = h; number = counter; counter++; //number = counter++;と記述することもできます。 } //インスタンスをカウントするクラスメソッド public static int getCounter(){ return counter; } //メインメソッド public static void main(String[] args) { //クラスメソッドの呼び出し:クラス名.メソッド名(引数) //クラスメソッドはインスタンスを作らなくても呼び出すことができます System.out.println("カウンターは、" + Rectangle.getCounter()); } }
【Java】コンストラクタについて
コンストラクタとは
前回はインスタンスを作成し、フィールドを読み書きする方法と、メソッドを呼び出す方法を解説しました。
ところで、毎回、長方形の大きさを設定するときnew演算子でインスタンスを作成した後、setSizeで別途呼び出す必要がありました。インスタンス化すると同時に長方形の大きさが設定できた方が楽ですよね。
Javaでは、初期化を行うためのコンストラクタという仕組みがあります。インスタンス化すると同時に、インスタンスを初期化することができます。
コンストラクタを宣言する
コンストラクタの宣言は、メソッドの宣言と似ています。メソッドと違う点は以下の2点です。
それでは実際に長方形の大きさを定義するコンストラクタを宣言してみます。
public class Rectangle{ public Rectangle(int w,int h){ this.width = w; //this.でインスタンスのフィールドを指します。 this.height = h; //Rectangle(int w,int h)の引数をフィールドに代入します。 } }
デフォルトコンストラクタ
幅も高さも指定しないでRectangleのインスタンスをつくる場合があります。そういった場合、初期設定があったほうがよい場合があります。引数を指定しないときのインスタンスの初期化を記述するのがデフォルトコンストラクタです。初期設定を(0,0)とした場合を記述してみます。
public class Rectangle{ public Rectangle(){ this(0,0); //this()はコンストラクタRectangle()を指します。 //引数でフィールドの値を指定します。 } }
コンストラクタを呼び出す
幅と高さを指定したコンストラクタを呼び出すには、次のようにします。
インスタンスの引数()に長方形の大きさを代入します。
Rectangle r2 = new Rectangle(20,2);
デフォルトコンストラクターで初期設定を定義したので、インスタンスの引数( )を空にした状態で宣言することもできます。
Rectangle r2 = new Rectangle( );
追記:this、super
スーパークラスは「スーパークラスとサブクラス」で詳しく解説します。
this が「自分の」インスタンスを指すのに対して、
super は、「スーパークラスの」インスタンスを指します。
this() は「自分の」インスタンスのコンストラクタ、
super() は「スーパークラスの」インスタンスのコンストラクタ呼び出しを表します。
完成
//長方形を定義するクラス class Rectangle{ //フィールドの宣言 //長方形の幅と高さを定義 private int width; private int height; //デフォルトコンストラクタ public Rectangle(){ this(0,0); } //コンストラクタ public Rectangle(int w,int h){ this.width = w; this.height = h; } //メソッドの宣言 /* //デフォルトコンストラクタで長方形の大きさは定義したのでコメントアウトします //1:大きさを定義するメソッド public void setSize(int w,int h){ width = w; height = h; 以下のように記述することができます。 thisはインスタンス自身を表すものです。 メソッドの宣言のなかでは、フィールドやメソッドの前にインスタンスを指定する必要はありません。 コンパイラによって自動的にthisが補完されるからです。 //this.width = w; //this.height = h; } */ //2:面積を求めるメソッド public int getArea(){ return width * height; } //メインメソッド public static void main(String[] args) { //インスタンス:フィールドへのアクセス&メソッドの呼び出し //new演算子で作成したインスタンスを、Rectangle型として宣言した変数rに代入 Rectangle r = new Rectangle(); //メソッドの呼び出し(デフォルトコンストラクターで定義した長方形値を表示) System.out.println("幅は、" + r.width); System.out.println("高さは、" + r.height); System.out.println("面積は、" + r.getArea()); System.out.println("-------------"); //新しいインスタンスr2(引数で定義した長方形の値を表示) Rectangle r2 = new Rectangle(20,2); //メソッドの呼び出し System.out.println("幅は、" + r2.width); System.out.println("高さは、" + r2.height); System.out.println("面積は、" + r2.getArea()); } }
【Java】クラスとインスタンスについて
クラスを宣言する
Javaのプログラムは全てクラスからできています。クラスを宣言することなくプログラムを組むことはできません。"こんにちは、Java"という文字列をコンソール表示させた場合にも、Helloというクラスにプログラムを記述しています。classはJavaの予約語でクラス宣言の始まりを示します。また慣習としてクラスの名前は大文字で始めます。
public class Hello { public static void main(String[] args) { System.out.println("こんにちはJava"); } }
{中括弧}で囲まれた範囲に、そのクラスが持つ「フィール」や「メソッド」を宣言します。フィールドは「情報を保存する場所」でいわば変数のようなものです。メソッドは「情報を処理する方法」でいわば関数のようなものです。フィールドとメソッドが、このクラスの性質を定めます。
public class クラス名{ フィールドの宣言 メソッドの宣言 }
フィールドとメソッド
フィールド:
「幅」と「高さ」という2つの情報をもつ「長方形」を表すクラスを例に考えます。フィールドは情報を保存する場所でいわば変数のようなものです。幅(width)は横の辺の長さ、高さ(height)は縦の辺の長さです。幅と高さはint型の整数であるとします。この2つの情報(フィールド)をもつ長方形のクラスRectangleを宣言します。
public class Rectangle{ private int width; private int height; }
メソッド:
メソッドは情報を処理する場所でいわば関数のようなものです。先程宣言した長方形を表すRectangleクラスに2つのメソッドを追加してみます。
幅と高さを設定するメソッドの名前をsetSize、面積を計算するメソッドの名前をgetAreaとします。
public class Rectangle{ //フィールドの宣言 private int width; private int height; //メソッドの宣言 //setSizeのメソッド public void setSize(int w,int h){ width = w; height = h; } //getAreaのメソッド public int getArea(){ return width * height; } }
setSizeのメソッド
voidはJavaの予約語で、このメソッドは情報処理の結果を戻り値として返さないということを表しています。voidは「空」や「無効」という意味です。
void メソッド名(){
ステートメント;
}
(int w,int h)の部分は、このメソッドの仮引数列です。{中括弧}でメソッドにある仮引数列をフィールド(width,height)の変数へ代入しています。
getAreaのメソッド
getArea()は長方形の面積を求めるメソッドです。setSizeと違い()内に仮引数列がないのは、width * heightの掛け算が面積を表しているからです。面積を計算するのに仮引数列の情報は必要ないということを表しています。
returnは、戻り値を指定し、メソッドの実行を中断・終了するJavaの予約語です。この場合フィールドで宣言したwidth * heightの掛け算の結果をgetAreaの戻り値として指定しています。
長方形を定義するRectangleクラスの完成
それでは、これまで長方形を定義してきたフィールやメソッドをRectangleというクラスにまとめてみます。
//長方形を定義するクラス(子) public class Rectangle{ //フィールドの宣言 //長方形の幅と高さを定義 private int width; private int height; //メソッドの宣言 //1:大きさを定義するメソッド public void setSize(int w,int h){ width = w; height = h; //以下のように記述することができる(this.がなくてもコンパイラで補完される) //this.width = w; //this.height = h; } //2:面積を求めるメソッド public int getArea(){ return width * height; } }
メインメソッドにインスタンスをつくる
それではクラスRectangleに定義したフィールドとメソッドをメインメソッド(public static void main(String[] args))から呼び出してみましょう。
メインメソッドには特別な役割があります。Javaプログラムを実行したときに最初に呼ばれるステートメントは、mainメソッドに記述する必要があるからです。Javaプログラムのコードは上から順に実行されるというわけではなく、mainメソッドの中に記述したステートメントが上から順に実行されます。
まずは、フィールドやメソッドを呼び出すためにインスタンスを作っておかなければなりません。Rectangleクラスのインスタンスを作るには、new演算子をつかいます。作ったインスタンスをRectangle型として宣言した変数rに代入します。
※「メソッドを呼び出すためには、インスタンスをつくっておかなければならない」と書きましたが、実は不正解です。後述する「クラスメソッド」はインスタンスを作らなくても呼び出すことができます。インスタンスを作らないと呼び出せないメソッドを「インスタンスメソッド」と呼びます。
//クラス名 変数 = new クラス名(); Rectangle r = new Rectangle();
フィールドの読み書き
新しくインスタンスができたので、フィールドに値を代入して結果を出力してみます。
r.widthのようにRectangle型の変数rとRectangleクラスのフィールド名widthをドット(.)でつないで記述します。
//インスタンス:フィールドへのアクセス&メソッドの呼び出し //new演算子で作成したインスタンスを、Rectangle型として宣言した変数rに代入 Rectangle r = new Rectangle(); //フィールドへのアクセス r.width = 123; r.height = 45; //出力 System.out.println("幅は、" + r.width); System.out.println("高さは、" + r.height);
メソッドの呼び出し
先程は、幅と高さのフィールドに値を代入しました。すでにRectangleクラスで長方形の幅と高さを設定するsetSizeというメソッドを宣言していたので、setSizeをつかって長方形の大きさ、getAreaから長方形の面積を求めてみます。
//インスタンス:フィールドへのアクセス&メソッドの呼び出し //new演算子で作成したインスタンスを、Rectangle型として宣言した変数rに代入 Rectangle r = new Rectangle(); //メソッドの呼び出し r.setSize(100, 50); //出力 System.out.println("幅は、" + r.width); System.out.println("高さは、" + r.height); System.out.println("面積は、" + r.getArea());
完成
この例題ではRectangle.javaというクラスファイルに「長方形を定義するクラス」と「メインメソッドでJavaを実行するためのクラス」の2つのクラスを1つのファイルに記述しました。効率的なプログラミングを考えたとき、実装したい機能別にクラスファイルを作成し、最終的にメインメソッドで実行したほうが便利です。そういった考えのもとオブジェクト指向を目指したプログラミングをすることができます。
次回以降、オブジェクト指向なプログラミングに必要なクラスの継承などについて簡単に解説します。
//長方形を定義するクラス public class Rectangle{ //フィールドの宣言 //長方形の幅と高さを定義 private int width; private int height; //メソッドの宣言 //1:大きさを定義するメソッド public void setSize(int w,int h){ width = w; height = h; /* 以下のように記述することができます。 thisはインスタンス自身を表すものです。 メソッドの宣言のなかでは、フィールドやメソッドの前にインスタンスを指定する必要はありません。 コンパイラによって自動的にthisが補完されるからです。 */ //this.width = w; //this.height = h; } //2:面積を求めるメソッド public int getArea(){ return width * height; } //メインメソッド public static void main(String[] args) { //インスタンス:フィールドへのアクセス&メソッドの呼び出し //new演算子で作成したインスタンスを、Rectangle型として宣言した変数rに代入 Rectangle r = new Rectangle(); /*フィールドへのアクセス r.width = 123; r.height = 45; */ //メソッドの呼び出し r.setSize(100, 50); System.out.println("幅は、" + r.width); System.out.println("高さは、" + r.height); System.out.println("面積は、" + r.getArea()); } }
出力結果 -------------- 幅は、100 高さは、50 面積は、5000
<追記>アクセス修飾子について
クラスのフィールドやメソッドにもスコープがあります。publicやprivateは「アクセス修飾子」と呼ばれるものです。publicとした場合は、すべてのクラスからアクセス可能です。privateとした場合は、それが記述されたクラスのみアクセス可能で、他のクラスからはアクセスできません。すべてをpublicにすればよいかというと、そうではありません。スコープは大きいより小さいほうが良いです。必要に応じてスコープは大きくしましょう。
【JavaScript】DOMを使ったHTML要素の参照
DOMスクリプティングで動的なアクションを与えるためには,まずHTML上に存在する要素をJavaScriptから特定できなければいけません。ここではDOMで規定されている各種手法を解説します。DOMを使ってHTMLの特定の要素を参照するために,次の三つのメソッドのいずれかを使います。
//引数で指定したIDのエレメントを配列として、すべて取り出して返す。 document.getElementById('id属性値'); //引数で指定したタグのエレメントを配列として、すべて取り出して返す。 document.getElementsByTagName('要素【タグ】名'); //引数で指定したname属性のエレメントを配列として、すべて取り出して返す document.getElementsByName('name属性値');
それでは、以下のサンプルからDOMを手掛かりに要素を取り出して操作してみます。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>DOMオブジェクト</title> </head> <body> <h2 id="titleName">DOMオブジェクト</h2> <ul> <li>ハズレ</li> <li>アタリ</li> <li>ハズレ</li> </ul> <button onclick="addElement()">要素を追加</button> <button onclick="removeElement()">要素を削除</button> <button onclick="getElementsNum()">divの要素数</button> <button onclick="replaceElement()">タイトル名の書き換え</button> <button onclick="getElementValue()">リスト名の取得</button> <div id="sample1"></div> </body> </html>
document.getElementsByTagNameの使い方
getElementsByTagNameをつかって引数にdivタグを指定することで要素数を求めます。Elementsと複数形になっているので記述する際は注意が必要です。
次は、引数で指定したliタグの2番目の要素(リストは0から始まる)を取り出してみます。要素内のテキストは,ドキュメントツリー上では,該当の要素の子要素(テキストノード)として構成されます。そのため,テキストを参照するためには,該当の要素の子要素を参照しnodeValueで要素内のデータを取り出します。
//document.getElementById //document.getElementsTagName function getElementsNum(){ //引数で指定したdiv要素を変数eleDivに代入します var eleId = document.getElementById("sample1"); var elmDiv = eleId.getElementsByTagName("div"); //eleDivの要素数をアラート alert(elmDiv.length); } function getElementValue(){ //liタグのリスト1に含まれる要素を取り出します var li = document.getElementsByTagName("li").item(1); //取り出した要素の子ノードにあるデータを取り出します var text = li.firstChild.nodeValue; alert(text); //以下の様に、記述することもできます。 //alert(document.getElementsByTagName("li").item(1).firstChild.nodeValue); } /* item:リストから番号を指定して要素を取り出す firstChild:自分の一番最初の子要素を返す nodeValue:要素内のデータを取り出す */
document.getElementByIdの使い方
document.getElementByIdではid要素を指定することができます。createElement()をつかって指定したタグ要素を作成し、appendChild()で"id=sample2"のdiv要素を子ノードに追加します。
//document.getElementById //createElement() //appendChild() function addElement(){ //divタグを作成 var element = document.createElement("div"); //プロパティを追加 element.id = "sample2"; element.innerHTML = "テスト"; element.style.backgroundColor = "black"; element.style.color = "green"; //変数objBodyに"id=sample1"を代入します var objBody = document.getElementById("sample1"); //変数elementで指定した"id=sample2"のdiv要素を"子ノードに追加します objBody.appendChild(element); }
removeChild()の使い方
addElement()で作成された"id=sample2"のdiv要素を削除します。
//removeChild() function removeElement(){ //変数elementに"id=sample1"の要素を代入します。 var element = document.getElementById("sample1"); //"id=sample1"の子ノードにある要素を削除します element.removeChild(element.childNodes.item(0)); }
innerHTMLの使い方
タイトルを「DOMオブジェクト」から「DOM(Document Object Model)」に書き換えます。
//innerHTML function replaceElement(){ title = document.getElementById("titleName"); title.innerHTML = "DOM(Document Object Model)"; }
まとめ
同じような要素が他にたくさんある場合、getElementByIdメソッドを使って要素を特定し,それに対してgetElementsByTagNameメソッドを適用します。そうすることで,要素をサーチする範囲を限定することができ,目的の要素が簡単に取り出せるようになります。
以下に、今日の内容をまとめたソースを公開しておきます。実際に動作を確認することができます。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <script type="text/javascript"> //document.getElementById //document.getElementsTagName function getElementsNum(){ var eleId = document.getElementById("sample1"); var elmDiv = eleId.getElementsByTagName("div"); alert(elmDiv.length); } function getElementValue(){ alert(document.getElementsByTagName("li").item(1).firstChild.nodeValue); } //document.getElementById //createElement() //appendChild() function addElement(){ var element = document.createElement("div"); element.id = "sample2"; element.innerHTML = "テスト"; element.style.backgroundColor = "black"; element.style.color = "green"; var objBody = document.getElementById("sample1"); objBody.appendChild(element); } //removeChild() function removeElement(){ var element = document.getElementById("sample1"); element.removeChild(element.childNodes.item(0)); } //innerHTML function replaceElement(){ title = document.getElementById("titleName"); title.innerHTML = "DOM(Document Object Model)"; } </script> <title>DOMオブジェクト</title> </head> <body> <h2 id="titleName">DOMオブジェクト</h2> <ul> <li>ハズレ</li> <li>アタリ</li> <li>ハズレ</li> </ul> <button onclick="addElement()">要素を追加</button> <button onclick="removeElement()">要素を削除</button> <button onclick="getElementsNum()">divの要素数</button> <button onclick="replaceElement()">タイトル名の書き換え</button> <button onclick="getElementValue()">リスト名の取得</button> <div id="sample1"> </div> </body> </html>
ブラウザオブジェクトについて下記のサイトにリファレンスの一覧があります。実際にサンプルを見ながら動作を確認することができます。
JavaScriptリファレンス-ブラウザ関連クラス
http://javascriptist.net/docs/js_ref_ext.html
【JavaScript】Windowオブジェクトの操作方法
新しいウィンドウを開く
open( )メソッドは新しいウィンドウを開くことができます。指定したURLのページを開いてみます。
//open("URL","ウィンドウ名(省略するときは「""」),オプション" myWin = open("http://www.google.co.jp/","new","menubar = 1"); //オブジェクトmyWinのウィンドを閉じます //myWin.close();
オプションでウィンドウの設定を変えることができます。例えば、"menubar = 1"と指定すると、メニューバーのみが表示され、メニューバー以外のバーは表示されなくなります。
オプション | 働き |
---|---|
location = "1 or 0" | ロケーションバーの表示(1)、非表示(0) |
menubar = "1 or 0" | メニューバーの表示(1)、非表示(0) |
scrollbars = "1 or 0" | スクロールバーの表示(1)、非表示(0) |
status = "1 or 0" | ステータスバーの表示(1)、非表示(0) |
toolbar = "1 or 0" | ツールバーの表示(1)、非表示(0) |
resizable = "1 or 0" | ウィンドウのサイズ変更可(1)、不可(0) |
width = "数値" | ウィンドウの幅 |
height = "数値" | ウィンドウの高さ |
※1または0を指定するオプションで1を指定すると、それ以外の値指定のないオプションは0が指定されたとみなされます。
確認ダイアログボックスを表示する
confirm( )メソッドをつかって確認ダイアログを表示させます。confrim( )の確認ダイアログに表示される「OK」ボタンを選択するとtureが返されます。function()内で条件分岐if文をつかった処理を記述してみます。
<html> <body> <h2>Windowオブジェクト</h2> <!-- リンクをクリックするとmyEventがイベント処理されます--> <a href="javascript:void(0)" onclick="myEvent()">リンク</a> <script type="text/javascript"> //myEventを関数化 function myEvent(){ //変数の宣言 var message = "Googleを開きますか?"; //条件分岐(OK → Google、キャンセル → 「キャンセルされました」) //confirm( )はOKを選択するとtureを返します if(confirm(message) == true){ open("http://www.google.co.jp/","new","menubar = 1"); }else{ alert("キャンセルしました"); } } </script> </body> </html>
文字入力ダイアログを表示する
prompt( )メソッドをつかって文字入力ダイアログを表示させます。prompt( )の文字入力に表示される「OK」ボタンを選択すると文字列が返されます。「キャンセル」ボタンを選択すると"null"が返されます。
//prompt()メソッドで文字入力ダイアログを表示する prompt("お名前は?","鈴木です");
function()内で条件分岐if文をつかった処理を記述してみます。
<html> <body> <h2>Windowオブジェクト</h2> <script type="text/javascript"> //myEventを関数化 function myEvent(){ //変数の宣言(prompt():OK→文字列を返します、キャンセル→nullを返します) var name = prompt("お名前は?",""); //条件分岐(変数nameが空でなければ入力した文字列を表示) if(name != ""){ document.write("ようこそ、" + name + "さん"); } } </script> </body> </html>
タイマーを設定・解除する
指定した時間に繰り返し処理を行うには、setInterval( )メソッドを使います。
//setInterval("実行する処理を指定","時間をミリ秒で指定します(1秒=1000ミリ秒)") myTime = setInterval("alert('5秒経過しました')",5000); //タイマーを解除するには、 //clearInterval(mytime);
Date( )オブジェクトをつかって、現在の日時を5秒毎に更新してみます。
<html> <body> <h2>Windowオブジェクト</h2> <script type="text/javascript"> now = new Date(); document.write(now); mytime = setInterval("location.reload()",5000); </script> </body> </html>
【JavaScript】for〜in文と連想配列
for〜in文
for文では、繰り返し処理の回数をカウンターで行ないました。for〜in文ではArrayの要素の数だけ処理を行います。for〜in文をつかって配列を操作してみます。
<?xml version="1.0" encoding="utf-8" ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>配列の参照</title> </head> <body> <h2>for〜in文</h2> <script type="text/javascript"> var array01 = [1,2,3]; //array01オブジェクトをつくります for(index in array01){ //array01オブジェクトのキー値を変数indexに順番に格納します document.write(array01[index] + "<br>"); } </script> </body> </html>
for〜in文をつかうことで、連想配列のキー値を知ることができます。
<?xml version="1.0" encoding="utf-8" ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>配列の参照</title> </head> <body> <h2>for〜in文</h2> <script type="text/javascript"> var array02 = {"鈴木":"25歳","田中":"28歳","近藤":"20歳"}; //array02オブジェクトを作成します for(var nameIndex in array02){ //arrya02オブジェクトのキー値を変数nameIndexに順番に格納します document.write(array02[nameIndex] + "<br>"); } </script> </body> </html>
【Java】簡単なJavaプログラムを書いてみよう
コインの表裏
前回の数学関数Math( )をつかって簡単なJavaプログラムを記述してみます。random( )メソッドを使って0以上1未満の乱数を発生させます。ここでは乱数1なら「表」、乱数2なら「裏」とします。そのため、random( )メソッドをつかって1若しくは2のいずれかの乱数が発生するようにします。
public class Sample1 { public static void main(String[] args) { double coin = Math.floor(Math.random() * 2) + 1; if(coin == 1){ System.out.println("表"); }else{ System.out.println("裏"); } } }
結果表示 -------- 表 or 裏
じゃんけんプログラム
数学関数と論理演算子をつかって「じゃんけん」プログラムを記述します。少し複雑になりますがif文をつかってrandom( )メソッドの0未満1以上の乱数の範囲に対して「グー」、「チョキ」、「パー」の出し手を与えます。
public class Sample2 { public static void main(String[] args) { //A君の出し手 double a_rand = Math.random(); //A君 int a_hand = 0; //1:グー、2:チョキ,3:パー if(a_rand < 0.33){ a_hand = 1; }else if(a_rand < 0.66){ a_hand = 2; }else{ a_hand = 3; } //B君の出し手 double b_rand = Math.random(); int b_hand = 0; //1:グー、2:チョキ,3:パー if(b_rand < 0.33){ b_hand = 1; }else if(b_rand < 0.66){ b_hand = 2; }else{ b_hand = 3; } //じゃんけん if(a_hand == 1 && b_hand ==1){ System.out.println("あいこ"); }else if(a_hand == 1 && b_hand == 2){ System.out.println("A君勝利"); }else if(a_hand == 1 && b_hand == 3){ System.out.println("B君勝利"); }else if(a_hand == 2 && b_hand == 1){ System.out.println("B君勝利"); }else if(a_hand == 2 && b_hand == 2){ System.out.println("あいこ"); }else if(a_hand == 2 && b_hand == 3){ System.out.println("A君勝利"); }else if(a_hand == 3 && b_hand == 1){ System.out.println("A君勝利"); }else if(a_hand == 3 && b_hand == 2){ System.out.println("B君勝利"); }else if(a_hand == 3 && b_hand == 3){ System.out.println("あいこ"); } } }
結果表示 -------- A君の勝利
整数の乱数をつかって処理を簡単にしてみます。
public class Sample3 { public static void main(String[] args) { double jankenComp = Math.floor(Math.random() * 3); double jankenUser = 0; if(jankenComp == jankenUser){ System.out.println("あいこ"); }else if((jankenComp +1) % 3 == jankenUser){ System.out.println("あなたの負けです"); }else{ System.out.println("あなたの勝ちです"); } //出し手の確認用 System.out.println(jankenComp); System.out.println(jankenUser); } }
結果表示 -------- あいこ 0.0 0.0