
第8章内部类与异常类 王绍卿
1 第8章内部类与异常类 王绍卿

导读 主要内容 内部类 匿名类 ● 异常类 ●】 断言 难点 异常类 2025/4/2
2025/4/2 2 导读

§8.1 内部类 ■Java支持在一个类中声明另一个类,这样的类称作内部类, 而包含内部类的类成为内部类的外嵌类。 ■内部类(成员类):定义在类中的类,可以看成是外部类的 一个成员。主要作用是将逻辑上相关的类放到一起。 例8-1 RedCowForm.java,Example8 1.java 某种类型的农场饲养了一种特殊种类的牛,但不希望其它 农场饲养这种特殊种类的牛,那么这种类型的农场就可以将 创建这种特殊种牛的类作为自己的内部类。例8-1中有一个 RedCowForm(红牛农场)类,该类中有一个名字为RedCow (红牛)的内部类。程序运行效果如图8.1所示
3 §8.1 内部类 ◼Java支持在一个类中声明另一个类,这样的类称作内部类, 而包含内部类的类成为内部类的外嵌类。 ◼内部类(成员类):定义在类中的类,可以看成是外部类的 一个成员。主要作用是将逻辑上相关的类放到一起。 例8-1 RedCowForm.java, Example8_1.java 某种类型的农场饲养了一种特殊种类的牛,但不希望其它 农场饲养这种特殊种类的牛,那么这种类型的农场就可以将 创建这种特殊种牛的类作为自己的内部类。例8-1中有一个 RedCowForm(红牛农场)类,该类中有一个名字为RedCow (红牛)的内部类。程序运行效果如图8.1所示

public class RedCowForm public class Example8_1{ String formName: public static void main(String args[]){ RedCow cow,∥内部类声明对象 RedCowForm form=new RedCowFormO RedCowForm("红牛农场"); RedCowForm(Strings) form.showCowMess(); 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);
public class RedCowForm { 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); } } } public class Example8_1 { public static void main(String args[]) { RedCowForm form = new RedCowForm("红牛农场"); form.showCowMess(); } }

例8-1 RedCowForm.java, Example8 1.java 某种类型的农场饲养了一种特殊种类的牛,但不希望其它 农场饲养这种特殊种类的牛,那么这种类型的农场就可以将 创建这种特殊种牛的类作为自己的内部类。例8-1中有一个 RedCowForm(红牛农场)类,该类中有一个名字为RedCow (红牛)的内部类。程序运行效果如图8.1所示。 C:\ch8>java Example8_1 偶是红牛,身高:150cm体重:112kg,生活在红牛农场 图8.1使用内部类
5 例8-1 RedCowForm.java, Example8_1.java 某种类型的农场饲养了一种特殊种类的牛,但不希望其它 农场饲养这种特殊种类的牛,那么这种类型的农场就可以将 创建这种特殊种牛的类作为自己的内部类。例8-1中有一个 RedCowForm(红牛农场)类,该类中有一个名字为RedCow (红牛)的内部类。程序运行效果如图8.1所示

§8.1内部类 内部类仅供它的外嵌类使用。 ■内部类的类体不可以声明类变量和类方法 ■内部类可以使用外嵌类的成员变量和成员方法 ■内部类对应的字节码文件格式是“外嵌类$内 部类名” ●如:RedCowForm$RedCow.class ■外部类访问内部类时,必须在内部类名前冠以 其所属外部类的名字才能使用;在用new创建 内部类时,也需在new前冠以对象变量
§8.1 内部类 ◼内部类仅供它的外嵌类使用。 ◼内部类的类体不可以声明类变量和类方法 ◼内部类可以使用外嵌类的成员变量和成员方法 ◼内部类对应的字节码文件格式是“外嵌类$内 部类名” ⚫如:RedCowForm$RedCow.class ◼外部类访问内部类时,必须在内部类名前冠以 其所属外部类的名字才能使用;在用new创建 内部类时,也需在new前冠以对象变量

在外部类外部访问非静态内部类: class Waif class Neif int i=3; public class test{ public static void main(String[]args){ Wai.Nei wnl new Wai().new Nei(); System.out.println("内部类中的变量i:"+wnl.i):
在外部类外部访问非静态内部类: class Wai{ class Nei{ int i=3; } } public class test{ public static void main(String[] args){ Wai.Nei wn1 = new Wai().new Nei(); System.out.println("内部类中的变量i:"+wn1.i); } }

在外部类外部访问静态内部类 class Waif static class Neif int i=3; public class test{ public static void main(String[]args){ Wai.Nei wnl new Wai.Nei(); System.out.println("内部类中的变量i:"+wnl.i);
在外部类外部访问静态内部类: class Wai{ static class Nei{ int i=3; } } public class test{ public static void main(String[] args){ Wai.Nei wn1 = new Wai.Nei(); System.out.println("内部类中的变量i:"+wn1.i); } }

P164实验1
P164 实验1

§8.2匿名类 §8.2.1和子类有关的匿名类 假如没有显式地声明一个子类,而又想用子类创建 一个对象,如何实现? Java允许我们直接使用一个类的子类的类体创建 一个子类对象。 创建子类对象时,除了使用父类的构造方法外还有 类体,此类体被认为是一个子类去掉类声明后的类体, 称作匿名类。 0
10 §8.2 匿名类 §8.2.1 和子类有关的匿名类 假如没有显式地声明一个子类,而又想用子类创建 一个对象,如何实现? Java允许我们直接使用一个类的子类的类体创建 一个子类对象。 创建子类对象时,除了使用父类的构造方法外还有 类体,此类体被认为是一个子类去掉类声明后的类体, 称作匿名类