第六章と第七章学習ノート

6747 ワード

一、教材学習内容(6.言い訳と実現&7.内部類と異常)
1、interfaceを使用してインタフェースを定義し、インタフェース体に定数の宣言と抽象的な方法の2つの部分を含む
interface Printable{
final int Max=100; //     int Max=100
void add(); //     public abstract void add()
}

2、インタフェースの実装(抽象的な方法)は、このインタフェースを実装したクラスのメソッド書き換えに依存し、特に、クラス書き換えのメソッドの前にpublicで明らかに修飾し(通常のクラスメソッドはデフォルトで友好的なクラス)、abstract修飾子を除去しなければならない.
3、インタフェースを定義する際、インタフェースにpublicキーワードを付けると、このようなインタフェースはpublicインタフェースであり、publicインタフェースはいずれのクラスでも実現できる.1つのインタフェースにpublic修飾を加えなければ、友好的な言い訳と呼ばれ、友好的な言い訳は、そのインタフェースと同じパケット内のクラスで実現され得る.
4、親がインタフェースを実装した場合、サブクラスは自然にインタフェースを実装し、サブクラスはキーワードimpltements宣言を明示的に使用してこのインタフェースを実装する必要はありません.
5、インタフェースも継承できます.
6、インタフェースコールバック:あるインタフェースを実現したクラスが作成した対線参照をそのインタフェースが宣言したインタフェース変数に付与することができ、そのインタフェース変数はそのクラスによって実現されたインタフェース方法を使用することができる.(インタフェース変数はクラス内の他の非インタフェースメソッドを呼び出すことができません)
7.インタフェースは、抽象的な方法で表される重要な行為準則を抽象化することができる.インタフェースの考え方は、いくつかのクラスに同じメソッド名を要求することができるが、メソッドの具体的な実装は異なることができるということである.
8、インタフェースとマルチステート:インタフェースが生み出すマルチステート性とは、あるインタフェースを実現する際に異なるクラスが異なる実現方式を有することができ、インタフェース変数はインタフェースメソッドをコールバックする際に多様な形態を有することを意味する.
9、Javaはあるクラスで別のクラスを定義することをサポートし、このようなクラスは内部クラスと呼ばれ、内部クラスを含むクラスは内部クラスの外嵌クラスと呼ばれている.
特に、この2つのクラスの間には以下の関係がある:1)内部クラスの埋め込みクラスのメンバー変数は内部クラスで依然として有効であり、内部クラスのメソッドは埋め込みクラスのメソッドを呼び出すこともできる.
2)内部クラスのクラス体ではクラス変数とクラスメソッドを宣言することはできません(static,ここでは内部クラスが必ずしも外嵌クラスと同時に創立されるとは限らないことを示します).外部埋め込みクラスのクラスボディでは、外部埋め込みクラスのメンバーとしてオブジェクトを内部クラスで宣言できます.
3)内部クラスはその外部埋め込みクラスのみで使用され、他のクラスはあるクラスの内部クラスでオブジェクトを宣言することはできません.
10.内部クラスはstatic修飾子によって修飾することができ、特にstatic内部クラスは、外部埋め込みクラスのインスタンスメンバー変数を操作することができない.
11、サブクラスオブジェクトを作成する場合、親の構造方法のほかに、サブクラスがクラス宣言を削除したクラスとみなされるクラス体があり、匿名クラスと呼ばれる.
特に、匿名クラスには、以下のような特徴がある
1)匿名クラスは親のメソッドを継承することも親のメソッドを書き換えることもできます
2)匿名クラスを使用する場合は,必ずあるクラスで直接匿名クラスを使用してオブジェクトを作成するので,匿名クラスは必ず内部クラスである.
3)匿名クラスは埋め込みクラスのメンバー変数とメソッドにアクセスでき、匿名クラスのクラス体でstaticメンバー変数とメソッドを宣言できない(内部クラス定義と同じ)
4)内部クラスはサブクラスであるがクラス名がないため,内部クラスでオブジェクトを作成する際に親クラスの構築方法を直接使用する.
public class Example7_2 {
   public static void main(String args[]) {
       ShowBoard board=new ShowBoard();
       board.showMess(new OutputEnglish());  //     OutputAlphabet     
       board.showMess(new OutputAlphabet()  
                                                            //     OutputAlphabet       
                       {  public void output() 
                          {  for(char c='α';c<='ω';c++)  //      
                               System.out.printf("%3c",c); 
                          }  
                       }
                     );
   } 
}

abstract class OutputAlphabet {
   public abstract void output();
}

public class OutputEnglish extends OutputAlphabet {
   public void output() {
      for(char c='a';c<='z';c++) {
         System.out.printf("%3c",c);
      }  
   } 
}


public class ShowBoard {
   void showMess(OutputAlphabet show) {
     show.output();   
   } 
}



12、インタフェースに関する匿名クラス:インタフェースコールバックを利用してインタフェースクラスの書き換え方法.
interface SpeakHello {
     void speak();
}
class  HelloMachine {
   public void turnOn(SpeakHello hello) {
       hello.speak();
   }
}
public class Example7_3 {
   public static void main(String args[]) {
      HelloMachine machine = new HelloMachine();
      machine.turnOn( new SpeakHello(){
                          public void speak() {
                             System.out.println("hello,you are welcome!");
                          }
                      } 
                    ); 
      machine.turnOn( new SpeakHello(){
                          public void speak() {
                              System.out.println("  ,    !");
                          }
                      } 
                    ); 
   } 
}

13、異常クラス:Javaはthrowキーワードを使ってExceptionサブクラスの例を出して異常発を表す.メソッド呼び出し中に例外オブジェクトが発生した場合、現在のメソッドの続行を終了できます.
14、try-catch文:try部分の文は異常を投げ出すことを担当し、catch部分の文は異常を処理することを担当し、特にcatchパラメータの中の異常クラスはすべてExceptionのあるサブクラスであり、try部分で発生する可能性のある異常を示し、これらのサブクラスの間に親子が関系を継承することはできない.
public class Example7_4 {
   public static void main(String args[ ]) {
      int n = 0,m = 0,t = 1000;
      try{  m = Integer.parseInt("8888");
            n = Integer.parseInt("ab89"); //    ,  catch
            t = 7777;  //t       
      }
      catch(NumberFormatException e) {
            System.out.println("    :"+e.getMessage());
      }
      System.out.println("n="+n+",m="+m+",t="+t);
      try{  System.out.println("    I/O  !");
            throw new java.io.IOException("     ");
            //System.out.println("              ,       ,      ");
      }
      catch(java.io.IOException e) {
            System.out.println("    :"+e.getMessage());
      }
   }
}

15、Exceptionクラスを拡張して自分の異常クラスを定義し、プログラムの必要に応じてどのような方法でこのような異常を発生するかを規定することができる.1つのメソッドは、宣言時にthrowsキーを使用して、生成するいくつかの例外を宣言し、そのメソッドのメソッドボディに、対応する例外クラスでオブジェクトを作成し、throwキーで例外オブジェクトを放出して、メソッドのビーム実行をもたらす異常を生成する操作を具体的に与えることができます.
16、throw(例外が発生したオブジェクトを投げ出す)とthrows(発生したいくつかの例外を宣言する)は異なるキーワードです.
17、
public class Example7_5 {
   public static void main(String args[]) {
      Bank bank=new Bank();
      try{  bank.income(200,-100);
            bank.income(300,-100);
            bank.income(400,-100);
            System.out.printf("     %d 
",bank.getMoney()); bank.income(200, 100); bank.income(99999,-100); } catch(BankException e) { System.out.println(" :"); System.out.println(e.warnMess()); } System.out.printf(" %d
",bank.getMoney()); } }
public class Bank {
    private int money;
    public void income(int in,int out) throws BankException {
       if(in<=0||out>=0||in+out<=0) {
          throw new BankException(in,out); //      ,      
       }
       int netIncome=in+out;
       System.out.printf("          :%d 
",netIncome); money=money+netIncome; } public int getMoney() { return money; } }
public class BankException extends Exception {
   String message;
   public BankException(int m,int n) {
       message="    "+m+"      "+n+"   ,       .";
   }
   public String warnMess() {
       return message;
   }
} 

16、finally文はcatch後に必ず実行します!
17、異常クラスまとめ:Javaはtry-catch文を使用して異常を処理し、発生する可能性のある異常操作をtry部分に置き、try部分のあるメソッド呼び出しで異常が発生した場合、try部分はすぐに実行を停止し、対応するcatch操作に移行する.
 
 
二、教材学習における問題と解決過程
しばらく
 
三、コードデバッグ中の問題
しばらく
 
四、思考と悟りを学ぶ
しばらく