private/JavaBronze/Study/7days_support
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[private/JavaBronze/Study]]
*7日目のサポート [#y23ddee9]
#contents
** メモリの領域 [#e55f2332]
+ コンピュータの動きについて~
メモリの領域の話をする前にコンピュータがそもそもどのよう...
確認したい。~
&ref(7days1.png);~
コンピュータを大まかに分解すると上記の図ようになります。~
++ ''CPU''~
人間の脳のようなもので、他の機器(スピーカ、モニター)な...
++ ''メモリ''~
CPUの記憶は非常に小さい為、CPUの代わりに記憶しておく領域...
人間でいうところの寝たら忘れてしまうのと同じようなもので...
++ ''HDD''~
メモリよりもより多くの記憶があり、電源が落ちても記憶が消...
※メモリなんか用意せず、HDDだけで良いのではないかと思うか...
HDDは、メモリに比べて、記憶を取りだすのが非常に遅いという...
その為、間にメモリを用意し、なるべく遅くならないようにし...
~
~
プログラムは以下のように動作します。~
&ref(7days2.png);~
HDDにあるプログラムを一度、メモリにコピーし、CPUが命令を...
+ メモリ管理~
HDDの記憶領域よりもメモリの記憶領域は少ない為、メモリは効...
その為、メモリ内では、使用する用途によって領域を分けてい...
++ ''スタック領域''~
変数の値やアドレスなどのサイズがわかっている値を格納する...
++ ''ヒープ領域''~
使用するメモリが未確定(インスタンスなど)で動的にメモリを...
~
メモリはアドレスと記憶領域で管理されている~
|アドレス|領域|h
|0x001||
|0x002||
|0x003||
|0x004||
|0x005||
|0x006||
|0x007||
|0x008||
|0x009||
|・・・||
※アドレスは、家の住所、記憶領域は家の情報(住んでる人の名...
~
''スタック領域''では、変数やメソッド情報を順番に格納し、...
ex)~
#highlighter(java,number){{
public class Java20 {
public static void main(String args[]) {
int i = 2;
int h = twice(i);
int q = twice(h);
System.out.println(q);
}
static int twice(int x) {
int g = x ;
int n = g * 2;
return n;
}
}
}}~
4行目実行時のメモリ内
|アドレス|領域|h
|0x001|i = 2|
|0x002|twice(i)|
|0x003||
|0x004||
|・・・||
4行目の処理での12行目の処理~
|アドレス|領域|h
|0x001|i = 2|
|0x002|twice(i)|
|0x003|x = 2|
|0x004|g = 2|
|0x005|n = 4|
|0x006||
|・・・||
4行目の処理での12行目の処理が終わって変数に代入後~
使用しない為、twiceメソッドで使用したローカル変数は全て解...
また、メソッド呼出し情報も解放される。~
|アドレス|領域|h
|0x001|i = 2|
|0x002|h = 4|
|0x003||
|・・・||
スタック領域ではこのように後入れたものが先に開放されてい...
~
''ヒープ領域''では必要な分をその場でメモリを確保します。...
ex)~
#highlighter(java,number){{
class SubClass{
int y;
SubClass() {
y = 10;
}
SubClass(int x ) {
y = x;
}
protected int outInt() {
return y;
}
}
public class Java21 {
public static void main(String args[]) {
SubClass obj = new SubClass();
SubClass ob2;
ob2 = new SubClass(5);
obj = null;
System.out.println(ob2.outInt());
}
}
}}
17行目実行時
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = 0x100|
|~|0x002|ob2 = null|
|~|0x003||
||・・・||
|ヒープ|0x100|y = 10|
|~|0x101|outInt()|
||・・・||
18行目実行時
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = 0x100|
|~|0x002|ob2 = 0x102|
|~|0x003||
||・・・||
|ヒープ|0x100|y = 10|
|~|0x101|outInt()|
|~|0x102|y = 5|
|~|0x103|outInt()|
19行目実行時、スタック領域のobj変数の参照先アドレスがnull...
参照先のアドレスがどこからも参照されなくなったため、~
ガベージコレクションによりメモリが解放される。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = null|
|~|0x002|ob2 = 0x102|
|~|0x003||
||・・・||
|ヒープ|0x100||
|~|0x101||
|~|0x102|y = 5|
|~|0x103|outInt()|
** staticについて [#a134c0a1]
+ staticについて~
static修飾子が付けられたメソッドは''クラスメソッド''~
static修飾子が付けられた変数は''クラス変数''~
と呼ばれ、インスタンス生成しなくても使用することが出来ま...
それは、JVMがクラスファイル(ソースをコンパイルしたもの)...
メモリ領域に保持する為です。~
&ref(7days3.png);~
|使用領域|アドレス|記憶領域|h
|スタック|0x001||
|~|0x002||
|~|0x003||
||・・・||
|ヒープ|0x100||
|~|0x101||
|~|0x102||
|~|0x103||
|パーマメント|0x200|class情報|
|~|0x201|static変数|
|~|0x202|staticメソッド|
|~|0x203||
逆に非staticメソッドはまだメモリに保持されていない為、呼...
その為、''staticメソッドが呼び出せるのはstaticメソッドの...
しかし、インスタンス化した後は、メモリ上に保持される為、...
またstatic変数は、インスタンス毎に作成されない為(クラスを...
ex)~
#highlighter(java,number){{
class SubClass{
static int y;
SubClass() {
y = 10;
}
SubClass(int x ) {
y = x;
}
protected int outInt() {
return y;
}
}
public class Java23 {
public static void main(String args[]) {
SubClass obj = new SubClass();
SubClass ob2 = new SubClass(5);
System.out.println(obj.outInt());
System.out.println(ob2.outInt());
}
}
}}
通常であれば、10と5が出力されますが、static変数の為、~
後に設定した値が優先されます。~
&ref(7days4.png);~
** 参照型 [#k289d59e]
+参照型について~
参照型は、値を直接保持せず、値を指し示すアドレスを保持し...
※非参照型は、あの人の家の名前はサザエさんとデータを保持す...
参照型は、大阪府大阪市の3-4-5の人の名前という持ち方をする...
ex)~
#highlighter(java,number){{
public class Java24{
public static void main(String[] args){
int[] a = new int[]{1,2,3};
int[] b = a;
b[0] = 5;
System.out.println(a[0]);
int[] c = {10,11};
b = c;
b[0] = 20;
System.out.println(a[0]);
}
}
}}
3行目の状態でaには、値が設定されるのではなく~
値を参照するためのアドレスが設定されます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002||
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 1|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
4行目では、値を渡すのではなく参照する為のアドレスをコピー...
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x100|
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 1|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
5行目では、参照先の0番目の値を5に書き換えます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x100|
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
6行目では、bの参照先とaの参照先が同じため、bが書き換えた...
5が出力されます。~
~
7~8行目では、新しくcの配列が作成され参照先をbにコピーし...
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x103|
|~|0x003|c=0x103|
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103|int[0] = 10|
|~|0x104|int[1] = 11|
|~|0x105||
9行目では、参照先の0番目を20に書き換えます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x103|
|~|0x003|c=0x103|
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103|int[0] = 20|
|~|0x104|int[1] = 11|
|~|0x105||
10行目ではaの参照先の0番目を出力なので、5が出力されます。~
&ref(7days5.png);~
終了行:
[[private/JavaBronze/Study]]
*7日目のサポート [#y23ddee9]
#contents
** メモリの領域 [#e55f2332]
+ コンピュータの動きについて~
メモリの領域の話をする前にコンピュータがそもそもどのよう...
確認したい。~
&ref(7days1.png);~
コンピュータを大まかに分解すると上記の図ようになります。~
++ ''CPU''~
人間の脳のようなもので、他の機器(スピーカ、モニター)な...
++ ''メモリ''~
CPUの記憶は非常に小さい為、CPUの代わりに記憶しておく領域...
人間でいうところの寝たら忘れてしまうのと同じようなもので...
++ ''HDD''~
メモリよりもより多くの記憶があり、電源が落ちても記憶が消...
※メモリなんか用意せず、HDDだけで良いのではないかと思うか...
HDDは、メモリに比べて、記憶を取りだすのが非常に遅いという...
その為、間にメモリを用意し、なるべく遅くならないようにし...
~
~
プログラムは以下のように動作します。~
&ref(7days2.png);~
HDDにあるプログラムを一度、メモリにコピーし、CPUが命令を...
+ メモリ管理~
HDDの記憶領域よりもメモリの記憶領域は少ない為、メモリは効...
その為、メモリ内では、使用する用途によって領域を分けてい...
++ ''スタック領域''~
変数の値やアドレスなどのサイズがわかっている値を格納する...
++ ''ヒープ領域''~
使用するメモリが未確定(インスタンスなど)で動的にメモリを...
~
メモリはアドレスと記憶領域で管理されている~
|アドレス|領域|h
|0x001||
|0x002||
|0x003||
|0x004||
|0x005||
|0x006||
|0x007||
|0x008||
|0x009||
|・・・||
※アドレスは、家の住所、記憶領域は家の情報(住んでる人の名...
~
''スタック領域''では、変数やメソッド情報を順番に格納し、...
ex)~
#highlighter(java,number){{
public class Java20 {
public static void main(String args[]) {
int i = 2;
int h = twice(i);
int q = twice(h);
System.out.println(q);
}
static int twice(int x) {
int g = x ;
int n = g * 2;
return n;
}
}
}}~
4行目実行時のメモリ内
|アドレス|領域|h
|0x001|i = 2|
|0x002|twice(i)|
|0x003||
|0x004||
|・・・||
4行目の処理での12行目の処理~
|アドレス|領域|h
|0x001|i = 2|
|0x002|twice(i)|
|0x003|x = 2|
|0x004|g = 2|
|0x005|n = 4|
|0x006||
|・・・||
4行目の処理での12行目の処理が終わって変数に代入後~
使用しない為、twiceメソッドで使用したローカル変数は全て解...
また、メソッド呼出し情報も解放される。~
|アドレス|領域|h
|0x001|i = 2|
|0x002|h = 4|
|0x003||
|・・・||
スタック領域ではこのように後入れたものが先に開放されてい...
~
''ヒープ領域''では必要な分をその場でメモリを確保します。...
ex)~
#highlighter(java,number){{
class SubClass{
int y;
SubClass() {
y = 10;
}
SubClass(int x ) {
y = x;
}
protected int outInt() {
return y;
}
}
public class Java21 {
public static void main(String args[]) {
SubClass obj = new SubClass();
SubClass ob2;
ob2 = new SubClass(5);
obj = null;
System.out.println(ob2.outInt());
}
}
}}
17行目実行時
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = 0x100|
|~|0x002|ob2 = null|
|~|0x003||
||・・・||
|ヒープ|0x100|y = 10|
|~|0x101|outInt()|
||・・・||
18行目実行時
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = 0x100|
|~|0x002|ob2 = 0x102|
|~|0x003||
||・・・||
|ヒープ|0x100|y = 10|
|~|0x101|outInt()|
|~|0x102|y = 5|
|~|0x103|outInt()|
19行目実行時、スタック領域のobj変数の参照先アドレスがnull...
参照先のアドレスがどこからも参照されなくなったため、~
ガベージコレクションによりメモリが解放される。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|obj = null|
|~|0x002|ob2 = 0x102|
|~|0x003||
||・・・||
|ヒープ|0x100||
|~|0x101||
|~|0x102|y = 5|
|~|0x103|outInt()|
** staticについて [#a134c0a1]
+ staticについて~
static修飾子が付けられたメソッドは''クラスメソッド''~
static修飾子が付けられた変数は''クラス変数''~
と呼ばれ、インスタンス生成しなくても使用することが出来ま...
それは、JVMがクラスファイル(ソースをコンパイルしたもの)...
メモリ領域に保持する為です。~
&ref(7days3.png);~
|使用領域|アドレス|記憶領域|h
|スタック|0x001||
|~|0x002||
|~|0x003||
||・・・||
|ヒープ|0x100||
|~|0x101||
|~|0x102||
|~|0x103||
|パーマメント|0x200|class情報|
|~|0x201|static変数|
|~|0x202|staticメソッド|
|~|0x203||
逆に非staticメソッドはまだメモリに保持されていない為、呼...
その為、''staticメソッドが呼び出せるのはstaticメソッドの...
しかし、インスタンス化した後は、メモリ上に保持される為、...
またstatic変数は、インスタンス毎に作成されない為(クラスを...
ex)~
#highlighter(java,number){{
class SubClass{
static int y;
SubClass() {
y = 10;
}
SubClass(int x ) {
y = x;
}
protected int outInt() {
return y;
}
}
public class Java23 {
public static void main(String args[]) {
SubClass obj = new SubClass();
SubClass ob2 = new SubClass(5);
System.out.println(obj.outInt());
System.out.println(ob2.outInt());
}
}
}}
通常であれば、10と5が出力されますが、static変数の為、~
後に設定した値が優先されます。~
&ref(7days4.png);~
** 参照型 [#k289d59e]
+参照型について~
参照型は、値を直接保持せず、値を指し示すアドレスを保持し...
※非参照型は、あの人の家の名前はサザエさんとデータを保持す...
参照型は、大阪府大阪市の3-4-5の人の名前という持ち方をする...
ex)~
#highlighter(java,number){{
public class Java24{
public static void main(String[] args){
int[] a = new int[]{1,2,3};
int[] b = a;
b[0] = 5;
System.out.println(a[0]);
int[] c = {10,11};
b = c;
b[0] = 20;
System.out.println(a[0]);
}
}
}}
3行目の状態でaには、値が設定されるのではなく~
値を参照するためのアドレスが設定されます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002||
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 1|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
4行目では、値を渡すのではなく参照する為のアドレスをコピー...
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x100|
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 1|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
5行目では、参照先の0番目の値を5に書き換えます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x100|
|~|0x003||
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103||
6行目では、bの参照先とaの参照先が同じため、bが書き換えた...
5が出力されます。~
~
7~8行目では、新しくcの配列が作成され参照先をbにコピーし...
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x103|
|~|0x003|c=0x103|
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103|int[0] = 10|
|~|0x104|int[1] = 11|
|~|0x105||
9行目では、参照先の0番目を20に書き換えます。
|使用領域|アドレス|記憶領域|h
|スタック|0x001|a=0x100|
|~|0x002|b=0x103|
|~|0x003|c=0x103|
||・・・||
|ヒープ|0x100|int[0] = 5|
|~|0x101|int[1] = 2|
|~|0x102|int[2] = 3|
|~|0x103|int[0] = 20|
|~|0x104|int[1] = 11|
|~|0x105||
10行目ではaの参照先の0番目を出力なので、5が出力されます。~
&ref(7days5.png);~
ページ名: