第六章与第七章学习笔记

一、教材学习内容(6.借口与实现&7.内部类和异常)

1、使用interface定义一个接口,接口体中包含常量的声明和抽象方法两个部分

interface Printable{
final int Max=100; //这里等同于int Max=100
void add(); //这里等同于public abstract void add()
}

2、接口的实现(抽象方法)依赖于实现了此接口的类的方法重写,特别地,类重写的方法前一定要明显地用public修饰(普通类方法默认为友好类)并且去掉abstract修饰符。

3、定义接口时,若interface前加上public关键字,就称这样的接口是一个public接口,public接口可以被任何一个类实现。若一个接口不加上public修饰,就称作友好借口,友好借口可以被与该接口在同一包中的类实现。

4、如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必在显式地使用关键字impltements声明实现这个接口。

5、接口也可被继承。

6、接口回调:可以把实现了某一接口的类创建的对线引用赋值给该接口声明的接口变量,那么该接口变量就可以使用被该类实现的接口方法。(接口变量无法调用类中其他的非接口方法)

7、接口可以抽象出重要的行为准则,该行为准则用抽象方法表示。接口的思想在于他可以要求某些类有相同的方法名称,但方法的具体实现可以不同。

8、接口与多态:接口产生的多态性就是指不同的类在实现某一接口时可以具有不同的实现方式,那么接口变量在回调接口方法时就具有多种形态。

9、Java支持一个类中定义另一个类,这样的类被称为内部类,而包含内部类的类被称为内部类的外嵌类。

特别地,此两类间有以下的关系:
1)内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类的方法。

2)内部类的类体中不可以声明类变量和类方法(static,此处告诉我们内部类并不一定与外嵌类同时创立)。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。

3)内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。

10、内部类可以被static修饰符修饰(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类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。一个方法在声明时可以使用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元\n",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元\n",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元\n",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操作。

二、教材学习中的问题和解决过程

暂无

三、代码调试过程中的问题

暂无

四、学习思考和感悟

暂无

猜你喜欢

转载自blog.csdn.net/Huangxu_MIKU/article/details/83713664
今日推荐