Java2实用教程(第五版)/第七章

第七章例题

例子1

1.源代码:

package diqizhang;

public class RedCowForm {

       static String formName;

       RedCow cow;//内部类声明对象

       RedCowForm(){

       }

       RedCowForm(String s){

              cow=new RedCow(150,112,5000);

              formName=s;

       }

       public void showCowMess() {

              cow.speak();

       }

       class RedCow{//内部类的声明

              String cowName="红牛";

              int height,weight,price;

              RedCow(int h,int w,int p){

                     height=h;

                     weight=w;

                     price=p;

              }

              void speak() {

                     System.out.println("偶是"+cowName+",身高:"+height+"cm 体重:"+weight+"kg,生活在"+formName);

              }

       }//内部类结束

}//外嵌类结束

package diqizhang;

public class Example7_1 {

public static void main(String args[]) {

       RedCowForm form=new RedCowForm("红牛农场");

       form.showCowMess();

       form.cow.speak();

}

}

2.运行结果:

例子2

1.源代码:

package diqizhang;

abstract class OutputAlphabet {

       public abstract void output();

}

package diqizhang;

public class OutputEnglish extends OutputAlphabet{

       public void output() {

              for(char c='a';c<='z';c++) {

                     System.out.printf("%3c",c);

              }

       }

}

package diqizhang;

public class ShowBoard {

       void showMess(OutputAlphabet show) {//参数showOutputAlphabet类型的对象

              show.output();

       }

}

package diqizhang;

public class Example7_2 {

       public static void main(String args[]) {

              ShowBoard board=new ShowBoard();

              board.showMess(new OutputEnglish());//向参数传递OutputAlphabet的子类OutputEnglish的对象

              board.showMess(new OutputAlphabet()//向参数传递OutputAlphabet的匿名子类的对象

              {public void output() {

                     for(char c='α';c<='ω';c++)//输出希腊字母

                            System.out.printf("%3c",c);

              }

              }

              );

       }

}

2.运行结果:

例子3

1.源代码:

package diqizhang;

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() {  //和接口SpeakHello有关的匿名类

                     public void speak() {

                            System.out.println("hello,you are welcome!");

                     }

              });

              machine.turnOn(new SpeakHello() {//和接口SpeakHello有关的匿名类

                     public void speak() {

                            System.out.println("你好,欢迎光临!");

                     }

              });

       }

}

2.运行结果:

例子4

1.源代码:

package diqizhang;

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());

              }

       }

}

2.运行结果:

例子5

1.源代码:

package diqizhang;

public class BankException extends Exception{

       String message;

       public BankException(int m,int n) {

              message="入账资金"+m+"是负数或支出"+n+"是正数,不符合系统要求.";

       }

       public String warnMess() {

              return message;

       }

}

package diqizhang;

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;

       }

}

package diqizhang;

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());

       }

}

2.运行结果:

例子6

1.源代码:

package diqizhang;

import java.util.Scanner;

public class Example7_6 {

       public static void main(String args[]) {

              int []score= {-120,98,89,120,99};

              int sum=0;

              for(int number:score) {

                     assert number>=0:"负数不能是成绩";

                     sum=sum+number;

              }

              System.out.println("总成绩:"+sum);

       }

}

2.运行结果:

例子7

1.源代码:

package diqizhang;

public class DangerException extends Exception{

       final String message="超重";

       public String warnMess() {

              return message;

       }

}

package diqizhang;

public class CargoBoat {

       int realContent;//装载的重量

       int maxContent;//最大装载量

       public void setMaxContent(int c) {

              maxContent=c;

       }

       public void loading(int m)throws DangerException{

              realContent +=m;

              if(realContent>maxContent) {

                     realContent -=m;

                     throw new DangerException();

              }

              System.out.println("目前装载了"+realContent+"吨货物");

       }

}

package diqizhang;

public class Example7_7 {

public static void main(String args[]) {

       CargoBoat ship=new CargoBoat();

       ship.setMaxContent(1000);

       int m=600;

       try {

              ship.loading(m);

              m=400;

              ship.loading(m);

              m=367;

              ship.loading(m);

              m=555;

              ship.loading(m);

       }

       catch(DangerException e) {

              System.out.println(e.warnMess());

              System.out.println("无法再装载重量是"+m+"吨的集装箱");

       }

       finally {

              System.out.printf("货船将正点启航");

       }

}

}

2.运行结果:

总结:

1.内部类

①类除了可以有成员变量和方法外,还可以拥有一种成员:内部类。

②在一个类中定义另一个类,这样的类称为内部类,包含内部类的类称为内部类的外嵌类。

③内部类和外嵌类的关系:

外嵌类的成员变量在内部类仍然有效,内部类中的方法也可以调用外嵌类中的方法。

内部类的类体中不可以声明类变量和类方法。

外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。

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

④内部类对应的字节码文件的名字格式是“’外嵌类名$内部类名”

⑤内部类可以被修饰为static内部类,static内部类是外嵌类中的一种静态数据类型,这样一来,程序就可以在其他类中使用static内部类来创建对象。但是static内部类不能操作外嵌类的实例成员变量。

⑥非内部类不可以是static类。

2.匿名类

①JAVA允许直接使用一个类的子类的类体创建一个子类对象,创建子类对象时,除了使用父类的构造方法外还有子类去掉类声明后的类体,称为匿名类。

②匿名类特点:

匿名类可以继承父类的方法也可以重写父类的方法。

匿名类一定是内部类。

匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体不可以声明static成员变量和方法。

③JAVA允许直接用接口名和应该类体创建一个匿名对象,类体被认为是实现接口的类去掉类声明后的类体,被称为匿名类。

3.异常类

①JAVA使用throw关键字抛出一个Exception子类的实例来表示异常发生。

②允许方法调用过程中抛出异常对象,终止当前方法的继续执行。

③使用try-catch语句来处理异常。将可能出现异常的操作方法放入try语句中,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出异常对象,那么try部分将立刻结束执行。,转向执行相应的catch语句。

④可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。一个方法在声明时可以使用throws关键字声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致该方法结束执行。    

4.断言

①断言语句一般用于不准备通过捕获异常来处理的错误,例如,当发生某个错误时,要求程序必须立即停止执行。

②使用关键字assert声明一条断言语句,有两种格式

assert booleanExpression;

assert booleanExpression: messageException;(值是false时,程序停止执行,输出 messageException表达式的值。

5.finally语句

语法格式:

try();

catch(ExceptionSubClass e){}

finally{}

执行机制:在执行try-catch语句后,执行finally语句(无论try是否异常都执行)。

特殊情况:

①如果try-catch语句中执行return语句,那么finally语句还会被执行。

②try-catch语句中执行了System.exit(0); ,则不执行finally语句。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值