アルゴリズムとプログラミング (Algorithms and Programming)

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
アルゴリズムとデータ構造 2011年6月13日
アルゴリズムとプログラミング (Algorithms and Programming)
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
C#とC++とオブジェクト指向 上甲 健史.
オブジェクト指向入門.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
コンパイラの解析 (3) クラスとインスタンスの初期化.
第11週:super/subクラス、継承性、メソッド再定義
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test5)】
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
独習Java ・ 5.7  静的変数と静的メソッド ・ 5.8  ローカル変数と変数のスコープ  11月20日    小笠原 一恵.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
プログラミング 2 静的変数.
Presentation transcript:

アルゴリズムとプログラミング (Algorithms and Programming) 第10回:インスタンス変数、クラス変数 インスタンス変数とクラス変数 インスタンスメソッドとクラスメソッド ローカル変数とスコープ 変数の寿命、ガーベージコレクション 講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html

インスタンス変数 インスタンス変数 これまで出てきた変数は、インスタンスごとにメモリ領域が個別に割り当てられ、別々に読み書きができた class Point { // 点クラス double x; // x座標 double y; // y座標 } これまで出てきた変数は、インスタンスごとにメモリ領域が個別に割り当てられ、別々に読み書きができた Point p1 = new Point(); Point p2 = new Point(); インスタンス変数 p1とp2はクラスは同じだが、別のインスタンスであり、それぞれ個別に変数double x, double yを持つ Point: p1 Point: p2 x: 1.5 x: 0.2 y: 2.0 y: 0.0 お互い無関係に 読み書き可能

クラス変数 クラス変数 同じクラスのどのインスタンスからでも、共通の1つの変数(=メモリ領域)を読み書きしたい場合がある クラス全体で p1からクラス変数の値を 変更すると、p2から見ても 値が変更されている!! Point: p1 Point: p2 x: 1.5 x: 0.2 y: 2.0 y: 0.0 count : count : 実体は1つ クラス全体で 共有する変数 count : 2.0 クラス変数

クラス変数の宣言 static修飾子 クラス変数へのアクセス方法: オブジェクト変数名.クラス変数名 クラス名.クラス変数名 class Point { // 点クラス double x; // x座標 double y; // y座標 public static int count; } static修飾子 クラス変数へのアクセス方法: オブジェクト変数名.クラス変数名 クラス名.クラス変数名

クラス変数の宣言と利用の例 class Point { // 点クラス double x; // x座標 double y; // y座標 //クラス変数の定義と初期化(static修飾子の有無で出力結果を比較せよ) public static int count = 0; Point( double a, double b ){ x = a; y = b; count++; } class SampleAP0801 { public static void main(String[] args){ // インスタンスが生成される前からクラス変数は存在する! System.out.println("count=" + Point.count); Point p1 = new Point(1.0,2.0); System.out.println("count=" + p1.count); Point p2 = new Point(3.0,4.0); System.out.println("count=" + p2.count); コンストラクタ count=0 count=1 count=2

クラスメソッド クラス単位で共有されるメソッド インスタンス変数にアクセス不可 インスタンスメソッドの呼び出し不可

クラスメソッドは、クラス内で定義されているのでクラスのメンバーといえるが、実体はインスタンスの外に存在する オブジェクト(実体) インスタンス1 インスタンス変数 インスタンスメソッド クラス定義 インスタンス2 クラス変数 クラスメソッド static static インスタンス3 アクセス クラスで共有 static static

public static int count = 0; public static void printValue(){ class Point { // 点クラス double x; // x座標 double y; // y座標 //クラス変数、クラスメソッドの定義 public static int count = 0; public static void printValue(){ System.out.println( "value:" + count ); } public static void printValue(int i){ System.out.println( "value:" + i ); class SampleAP0802 { public static void main(String[] args){ // インスタンスが生成される前からクラス変数、クラスメソッドは存在する! Point.count = 5 ; Point.printValue(); Point.printValue(6); Point o = new Point(); o.printValue(7); インスタンス変数 クラス変数 クラスメソッド クラスメソッド クラスメソッドの中からインスタンス変数であるx,yを参照することはできない! value:5 value:6 value:7

main()はクラスメソッドだった! main()メソッドが実行される約束になっている class ユーザ定義 { public static void main(String[] args){ 処理; } main()メソッドが実行される約束になっている

どこで宣言された変数か? 変数の3つの分類 宣言される場所 インスタンス変数 クラス変数 ローカル変数 クラス内 メソッド内

ローカル変数が見える 範囲(スコープ)と寿命 中カッコ{}で囲まれたブロックがスコープの目印 class SampleAP0803 { public static void main(String[] args){ int x = 0; for( int i = 1; i <= 10; i++) { x = x + i; } System.out.println("total = " + x ); 変数iの値をこのforブロックの外から参照することはできない 変数xの値はforブロック内からでも参照可能

変数の寿命 使い終わった変数は破棄され、使用していたメモリが解放される (ガベージコレクション) ローカル変数の寿命:ブロックの最初にメモリが確保され、ブロックの終わりで破棄される インスタンス変数の寿命:newで生成されてから、最後に参照された後、Java VM が判断したタイミング クラス変数の寿命:プログラムの開始から終了まで

バッティングしても有効 ローカル変数 class X { static int i = 100; int j = 200; SampleAP0804.java class X { static int i = 100; int j = 200; void printValue(){ System.out.println("i= " + i ); System.out.println("j= " + j ); int i = 123; int j = 456; } クラス変数 インスタンス変数 ローカル変数

変数名がバッティングした場合は ローカル変数が優先される class SampleAP0804 { SampleAP0804.java続き class SampleAP0804 { public static void main(String[] args){ X o = new X(); o.printValue(); } 実行結果 i= 100 j= 200 i= 123 j= 456 ローカル変数 クラス変数・インスタンス変数 変数名がバッティングした場合は ローカル変数が優先される バッティングしないように名前を付けるのが望ましい

値を変更しない変数(定数)の宣言 final修飾子 class X { static final int MAX = 100; final static int MIN = -100; final int DEFAULT = 10; } class SampleAP0805 { public static void main(String[] args){ System.out.println("value= " + X.MAX); System.out.println("value= " + X.MIN); X o = new X(); System.out.println( "value= " + o.DEFAULT); 値を変更しないのなら、インスタンスごとにこの定数のためにメモリを確保するのは無駄といえる→普通はクラス変数にする(static)

まとめ インスタンス変数とクラス変数 インスタンスメソッドとクラスメソッド ローカル変数とスコープ 変数の寿命、ガーベージコレクション final修飾子