Javaオブジェクト向け03-オブジェクトメモリ管理、継承の意味


メモリ管理
Javaプログラムに必要なメモリは、JVMによって管理され、割り当てられます.
スタック
  • は、newから出るすべてのオブジェクト
  • を格納する.
  • メンバー変数のライフサイクル:オブジェクトの作成時にスタックに格納され、オブジェクトの回収時に
  • が一括して消去されます.
  • 参照のない対象をゴミ回収器(GC)と呼び、不定時にゴミを清掃し、ゴミを発見すると自動的に
  • を清掃する.
  • メモリ漏洩:使用しないメモリがタイムリーに解放されていない推奨:使用しないオブジェクトがnull
  • に参照をタイムリーに設定する
  • ごみ回収プロセスは透明な
  • である.
  • はシステムを呼び出す.gc()仮想マシンはできるだけ早くゴミを回収することを提案する
  • スタック
  • メソッドが実行するときのすべてのローカル変数
  • を格納するために使用される.
  • メソッドを呼び出すとそのメソッドに対応するスタックフレームが割り当てられ、スタックフレームに格納されたすべてのローカル変数メソッドが実行終了するとスタックフレームがクリアされ、ローカル変数も一括して
  • が消える.
  • ローカル変数とメンバー変数の違い:*メンバー変数:クラス内メソッドの外、newオブジェクトの場合スタックに存在し、デフォルト値がある*ローカル変数:メソッド、メソッドの場合スタックに存在し、デフォルト値がない
  • メソッド領域
  • は記憶用である.classバイトコードファイルおよび方法
  • メソッドは1つのみで、thisによってどのオブジェクトが呼び出す
  • を区別する.
    継承
  • コードの重複を回避し、コードの再利用に有利であり、extendsキーワードによって
  • を継承する.
  • 親/ベースクラス:すべての子クラスに共通する変数およびメソッドの子クラス/派生クラス:子クラス固有の変数およびメソッド
  • 継承後の子クラスは、子クラスの+親クラスのメンバー変数とメソッド
  • を有する.
  • 親クラスに複数の子クラスを持つことができます.1つの子クラスに1つの親しか継承できません.-単一継承
  • 継承伝達親-子-孫......
  • javaは、子クラスを構築する前に親クラスを構築する必要があると規定しています.親クラスの構築方法が呼び出されていない場合、デフォルトsuper()は親クラスの無参構造を調整します.子クラスが自分で調整すると、
  • はデフォルトで提供されません.
  • super呼び出し親構造は、子構造の第1文
  • に位置する必要がある.
  • 注意事項:子クラスは親の構造方法を継承することができず、継承を呼び出すだけでis aの関係に合致し、コードを再利用するためだけに
  • を継承してはいけない.
  • superキーワードは、現在のオブジェクトの親を指す
  • super用法:*super.メンバー変数名--親クラスのメンバー変数*superにアクセスします.メソッド名()————親を呼び出すメソッド*super()———————親を呼び出す構築メソッド
  • アップフォーム
  • 親タイプの参照は、サブクラスのオブジェクトTetromino a 1=new T()を指す.Tetromino a2=new J();
  • は何を注文することができて、参照するタイプの子クラスが親クラスのメンバー変数と方法を注文することができることを見て、親クラスが子クラスを出ないのは
  • です
    DeBug
  • エラーの検出を支援します.前提-コードエラーが
  • であることを知っています.
  • F 5-ステップデバッグ(メソッド内に進む)F 6-メソッドごとにデバッグ(メソッド内に入らない)F 7-メソッドF 8に戻る-次のブレークポイントにジャンプするか、
  • を終了する
    ケース
    1.格子クラスを作成する
    public class Cell {
        int row;
        int col;
        Cell(){   //      
            this(0,0);   //this           
        }
        Cell(int row,int col){  //      
            this.row=row;
            this.col=col;
        }
        String coord(){  //    
            return row+","+col;
        } 

    2.親の作成
    //  
    public class Tetromino {
        Cell[] cells;
        Tetromino(){
            cells=new Cell[4];
        }
        void drop(){    //      
            for(int i=0;i<cells.length;i++){
                cells[i].row++;
            }
        }
        void moveLeft(){   //      
            for(int i=0;i<cells.length;i++){
                cells[i].col--;
            }
        }
        void moveRight(){  //      
            for(int i=0;i<cells.length;i++){
                cells[i].col++;
            }
        }
        void print(){   //      
            for(int i=0;i<cells.length;i++){
                String str=cells[i].coord();
                System.out.println(str);
            }
        }
    }

    3.T型サブクラスを作成する
    //  
    public class T extends Tetromino{
        T(int row,int col){
            super(); //       super()           
            cells[0]=new Cell(row,col);
            cells[1]=new Cell(row,col+1);
            cells[2]=new Cell(row,col+2);
            cells[3]=new Cell(row+1,col+1);
        }
    }

    4.CellGameクラスの作成
    //         ,              
    import java.util.Scanner;
    public class CellGame {
        public static void main(String[] args) {
            /* T t=new T(2,5); //         printGraph(t); //            Tetromino a=new T(1,2);//     printGraph(a); //       */
            Scanner sc=new Scanner(System.in);
            System.out.print("              :");
            int row=sc.nextInt();
            int col=sc.nextInt();
            T t=new T(row,col);
            System.out.println("      :");
            printGraph(t);
            do{
                System.out.print("     (1.    ,2.    ,3.    ,0.  ):");
                int x=sc.nextInt();
                if(x==0){
                    System.out.println("    !");
                    break;
                }else{
                    switch(x){
                    case 1:t.drop();
                           printGraph(t);
                           break;
                    case 2:t.moveLeft();
                           printGraph(t);
                           break;
                    case 3:t.moveRight();
                           printGraph(t);
                           break;
                    default :System.out.println("    !");
                    }
                }
            }while(true);
        }
        //      
        public static void printGraph(Tetromino t){  //       ,             
            for(int i=0;i<20;i++){
                for(int j=0;j<10;j++){
                    boolean flag=false;   //         -
                    for(int k=0;k<t.cells.length;k++){
                        if(t.cells[k].row==i&&t.cells[k].col==j){
                            flag=true;   //   *
                            break;  //               
                        }
                    }
                    if(flag==true){
                        System.out.print("* ");
                    }else{
                        System.out.print("- ");
                    }
                }
                System.out.println();
            }
        }
    }