第七章例题
例子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) {//参数show是OutputAlphabet类型的对象
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语句。