新しくブログを開設しました。

Webエンジニアがデザイナーになってみる。


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

新しくブログを開設しました。

Webエンジニアがデザイナーになってみる。


■ローカル変数とは?変数のスコープ?

・ローカル変数って
メソッドの内部で宣言され、そのメソッドの実行中にしか存在しません
ブロック{}のはじめで作成され、ブロック{}の終わりで破棄されます
また、複数のメソッドで、同じ名前のローカル変数をしようすることもできます。
名前は同じでも、まったく違うものです

次回、メソッドが呼び出されたときには以前代入されていた変数の値は残っていません

Example!!

class MyObject{
static short s = 400; //静的変数
int i = 200; //インスタンス変数

void test(){
System.out.println("s = " + s);
System.out.println("i = " + i);
short s = 300; //←これローカル変数
int i = 100; //←これもローカル変数
double d = 1E100; //←これも
System.out.println("s = " + s);
System.out.println("i = " + i);
System.out.println("d = " + d);
}
}

class LocalVariables{
public static void main(String args[]){
MyObject myObject = new MyObject();
myobject.test();
}
}


*実行結果※
s = 400
i = 200
s = 300
i = 100
d = 1.0E100




・変数のスコープって
その変数に直接アクセスできるプログラム内の範囲のこと
つまりその変数の有効範囲です
なので、先ほど話した「ローカル変数のスコープ」「メソッド」ってことになります


class Saiken{
void test(){
for (int j = 0; j < 5; j++){
int k = 100;
System.out.println("j = " + j + "; k = " + k);
k = k + 100;
}
}
}

class VariableScope{
public static void main(String args[]){
Saiken s new Saiken();
s.test();
}
}


※実行結果
j = 0; k = 100
j = 1; k = 100
j = 2; k = 100
j = 3; k = 100
j = 4; k = 100


変数 j のスコープは、forループ全体
変数 k のスコープは、宣言の場所からループの終端まで
そのため、変数kは値が変化していません







■メソッドのオーバーロードとは?

基本はコンストラクタと同様です
メソッドのオーバーロードとは、名前が同じだがシグネチャが異なるメソッドが複数あるってこと
※シグネチャとはメソッドとパラメータのデータ型のリストを合わせたもの

ここで問題
もし名前とシグネチャが同じものが複数あった場合どうなるのか?

どちらを使うのか判断できなくなり、コンパイル時にエラーメッセージが出力されます!


たとえばplintln()メソッドについて
plintln()メソッドにはオーバーロードされたものがいくつかあり
それぞれ別データ型を引数として受け取ります

データ型ごとに違うメソッドを使用するなんてめんどーですよね?
1つのメソッドで複数のデータ型をまかなえる
それがメソッドのオーバーロードです


Example!!

class Point3D{
double x;
double y;
double z;


Point3D(double x){
this(x,0,0)
}

Point3D(double x, double y){
this(x,y,0);
}

Point3D(double x, double y, double z){
this.x = x;
this.y = y;
this.z = z;
}

void move(double x){
this.x = x;
}

void move(double x, double y){
this.x = x;
this.y = y;
}

void move(double x, double y, double z){
this.x = x;
this.y = y;
this.z = z;
}
}

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

Point3D p = new Point3D(1.1, 3.4, -2.8);
p.move(5);
system.out.plintln("p.x = " + p.x);
system.out.plintln("p.y = " + p.y);
system.out.plintln("p.z = " + p.z);
p.move(6, 6);
system.out.plintln("p.x = " + p.x);
system.out.plintln("p.y = " + p.y);
system.out.plintln("p.z = " + p.z);
p.move(7, 7, 7);
system.out.plintln("p.x = " + p.x);
system.out.plintln("p.y = " + p.y);
system.out.plintln("p.z = " + p.z);
}
}


*実行結果*
p.x = 5.0
p.y = 3.4
p.z = -2.8
p.x = 6.0
p.y = 6.0
p.z = -2.8
p.x = 7.0
p.y = 7.0
p.z = 7.0



■引数の引き渡し

先ほど、変数は宣言するメソッドの外部では使用できないと話しましたが

配列やオブジェクトを引数として渡す時はどうなるでしょうか?

配列やオブジェクトを引数として渡す場合は、簡単に言うとメソッド外部からでも使用できるんです。

とりあえずプログラムをみてみましょー


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

//変数の初期化
int i = 5;
int j[] = {1,2,3,4,5};
StringBuffer sb = new StringBuffer("abcde");

//変数の表示
 display(i, j, sb);

 //メソッド呼び出し
 a(i, j , sb);

//再度変数の表示
display(i, j ,sb);
}

static void a(int i, int j[], StringBuffer sb){
 i = 7;
 j[0] = 11;
 sb.append("fghij");
}

static void display(int i, int j[], StringBuffer sb){
 system.out.println(i);
 for (int index = 0; index < j.length; index++)
  System.out.print(j[index] + " ");
 System.out.println("");
 System.out.println(sb);
}
}


*実行結果*
5
1 2 3 4
abcde
5
11 2 3 4
abcdefghij


となります
変数は変化してませんよね?
けれども配列とオブジェクトはしっかり引数が渡されて値が変化するんです

なぜかとゆーと
基本データ型はメソッドに引数のコピーを渡します
なので、コピーをいくら変更してもメソッドの外部にはわかりません

しかし
配列やオブジェクトはそれ自身がコピーされて渡されるのでなく、参照のコピーが渡されます
そのため、メソッドの外部からでも値の変更がわかります



次にイレギュラーVersion?

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

//変数の初期化
int x[] = { 11, 12, 13, 14, 15 };

//変数を表示
display(x);

//メソッド呼び出し
change(x);

//再度変数表示
display(x);
}

public static void change(int x[]){
int y[] = {21, 22, 23, 24, 25};
x = y;
}

public static void display(int x[]){
for ( int i = 0; i < x.length; i++)
  System.out.print(x[i] + " ");
System.out.println("");
}
}

*実行結果*
11 12 13 14 15
11 12 13 14 15

2個目のプログラムでは同じ値が表示されています



理由はchange()メソッドでは引数のコピーを変更しますが
この変更はmain()メソッドにはわからないからです
※ここで宣言している配列を代入しているから?
そのため、display()メソッドで後に表示させても同じ値が表示されます
スポンサーサイト

テーマ:web制作 - ジャンル:コンピュータ

<<若槻千夏のマーボー豆腐は飲み物です | ホーム | geotargeting使ってみました>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://kanamehackday.blog17.fc2.com/tb.php/36-c8d9d347
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。