内部类与异常类

 1 public class Example8_1 {
 2     public static void main(String args[]){
 3         RedCowForm form=new RedCowForm("红牛农场");
 4         form.showMess();
 5     }
 6 }
 7 
 8 class RedCowForm{//农场
 9     String formName;
10     RedCow cow;  //内部类声明对象
11     RedCowForm(){}
12     RedCowForm(String s){
13         cow=new RedCow(150,112,5000);
14         formName=s;
15     }
16     public void showMess(){
17         cow.speak();
18     }
19     class RedCow{//内部类
20         String cowName="红牛";
21         double height,weight,price;
22         RedCow(double i,double j,double k){
23             height=i;
24             weight=j;
25             price=k;
26         }
27         public void speak(){
28             System.out.println("偶是"+cowName+"身高:"+height+"cm,体重:"+weight+"kg,生活在"+formName);//formName是内部类调用外嵌套类的常量(变量也可以)
29         }
30     }
31 }
1、内部类
 1 //用户程序中的一个对象需要调用方法:f(A a){},该方法的参数类型是A类,用户希望向该方法传递A的子类对象,但系统没有符合要求的子类,那么用户可以在编写代码时考虑匿名类
 2 public class Example8_2 {//输出英文字母表和希腊字母表
 3     public static void main(String args[]){
 4         showBoard board=new showBoard();
 5         board.showMess(new EnglishAlphabet());//使用子类输出英文字母表
 6         System.out.println("");
 7         board.showMess(new inputAlphabet(){//定义内部类输出希腊字母表
 8             public void input(){
 9                 for(char i='α';i<='ω';i++){
10                     System.out.printf("%3c", i);
11                     if(((int)i-(int)'α')%5==4)System.out.println("");
12                 }
13             }
14         }
15         );
16     }
17 }
18 
19 class showBoard{
20     public void showMess(inputAlphabet show){
21         show.input();
22     }
23 }
24 abstract class inputAlphabet{//输出字母表抽象类
25     public abstract void input();
26 }
27 
28 class EnglishAlphabet extends inputAlphabet{//英文字母表子类
29     public void input(){
30         for(int i=(int)'a';i<='z';i++){
31             System.out.printf("%3c",i);
32             if(((int)i-(int)'a')%5==4)System.out.println("");
33         }
34     }
35 }
2、匿名类(子类)—使用匿名类输出希腊字母
 1 //假设Computable是一个接口,java 允许直接用接口名和一个类体创建一个匿名对象,该类体被认为是实现了该接口的类去掉声明后的类体,称作匿名类,new Computable(){实现了接口匿名类的类体}
 2 public class Example8_3 {
 3     public static void main(String args[]){
 4         HelloMachine machine=new HelloMachine();
 5         machine.turnOn(new SpeakHello(){//实现了SpeakHello接口的类去掉声明后的类体
 6             public void speak(){
 7                 System.out.println("Hello,you are welcom!");
 8             }
 9         });
10                 machine.turnOn(new SpeakHello(){//同上
11                     public void speak(){
12                         System.out.println("你好,欢迎光临!");
13                     }
14                 });        
15     }
16 }
17     interface SpeakHello{//接口
18         void speak();
19     }
20     class HelloMachine{
21         public void turnOn(SpeakHello hello){
22             hello.speak();
23         }
24     }
3、和接口有关的匿名类
 1 //try-catch语句
 2 public class Example8_4 {
 3     public static void main(String args[]){
 4         CargoBoard ship=new CargoBoard();
 5         ship.setMaxContent(1000);
 6         int m=600;
 7         try{
 8         ship.loading(m);
 9         m=400;
10         ship.loading(m);
11         m=300;
12         ship.loading(m);
13         m=555;
14         ship.loading(m);
15         }
16         catch(DangerException e){
17             System.out.println(e.warnMess());
18             System.out.println("无法再装载重量为"+m+"的货物");
19         }
20         finally{
21             System.out.println("货船正点起航");
22         }
23         System.out.println("最终装了"+(ship.realContent-m)+"吨货物");
24     }
25 }
26 class DangerException extends Exception{
27     final String message="超重";
28     public String warnMess(){
29         return message;
30     }
31 }
32 class CargoBoard{
33     int realContent;//装载的重量
34     int maxContent;//最大装载量
35     public void setMaxContent(int c){
36         maxContent=c;
37     }
38     public void loading(int m)throws DangerException{
39         realContent+=m;
40         if(realContent>maxContent)throw new DangerException();
41         System.out.println("目前装载了"+realContent+"吨货物");
42     }
43 }
4、finally子语句
 1 public class Example8_5 {
 2     public static void main(String args[]){
 3         Bank bank=new Bank();
 4         try{
 5         bank.income(200,-100);
 6         bank.income(300,-100);
 7         bank.income(400,-100);
 8         System.out.println("银行目前有"+bank.money);
 9         bank.income(200,100);//发生BankException异常,转去执行catch
10         bank.income(9999,-100);//没有机会被执行    
11         }
12         catch(BankException e){
13             System.out.println(e.warnMess());
14         }
15         System.out.println("目前银行有"+bank.money+"元");
16     }
17 }
18 
19 class BankException extends Exception{
20     String message;
21     public BankException(int m,int n){
22         message="入账资金"+m+"是负数或支出"+n+"是正数,不符合要求";
23     }
24     public String warnMess(){
25         return message;
26     }
27 }
28 class Bank{
29     int money;
30     public void income(int in,int out)throws BankException{
31         if(in<0||out>0)throw new BankException(in,out);
32         int netIncome=in+out;
33         System.out.println("本次计算的纯收入:"+netIncome);
34         money+=netIncome;
35     }
36     public int getMoney(){
37         return money;
38     }
39 }
5、自定义异常类
 1 //断言assert
 2 //表达式 :assert booleanException:messageException;如果booleanException为false,程序停止运行并输出messageException
 3 //当使用java解释器直接运行应用程序时,默认为关闭断言语句,在调试程序时可以使用-ea(enableassertions),如:java -ea Example8_6
 4 //用Eclipse运行则用下面方法启动断言语句:Run as——>Run configurations——>Agumenets页签——>VM arguments文本框中加上终中断开启(-ea或-enableassertions)。
 5 import java.util.Scanner;
 6 public class Example8_6 {
 7     public static void main(String args[]){
 8         int[] score={-120,98,89,120,99};
 9         int sum=0;
10         for(int number:score){
11             assert  number>0:"负数不能是成绩";
12             sum+=number;
13         }
14         System.out.println("总成绩"+sum);
15     }
16 }
6、断言(assert)

 

posted @ 2017-03-10 19:06  Major^-^  阅读(321)  评论(0编辑  收藏  举报