通过以往的学习,我们已经知道,类可以有两种重要的成员:成员变量和方法,实际上,类还有一种成员:内部类。在一个类中定义另一个类,我们把这样的类称作内部类,包含内部类的类称作内部类的外嵌类。
内部类和外嵌类之间的关系:
1)内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
2)内部类的类体中不可以声明类变量和类方法,外嵌类的类体中可以用内部类声明对象作为外嵌类的成员。
3)内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。
因为内部类的外嵌类的成员变量在内部类中有效,所以使得内部类和外嵌类的交互十分方便。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class RedCowForm { static String formName; RedCow cow; //内部类声明对象 RedCowForm() { } RedCowForm(String s){ cow = new RedCow( 88 , 66 , 2000 ); 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 Main { public static void main(String[] args) { RedCowForm form = new RedCowForm( "dotcpp农场" ); form.showCowMess(); form.cow.speak(); } } |
运行结果如下:
1 2 | 我是小牛,身高88cm,体重66kg,生活在dotcpp农场 我是小牛,身高88cm,体重66kg,生活在dotcpp农场 |
注意:Java编译器生成的内部类的字节码文件的名字和平常的类的名字不同,内部类对应的字节码文件的名字格式是“外嵌类名$内部类名”。例如:上面例子中内部类的字节码文件的名字应该是RedCowForm$RedCow.class。
内部类可以被修饰为static内部类,static内部类是外嵌类中的一种静态数据类型,程序可以在其他类中使用static内部类来创建对象,但是,static内部类不能操作外嵌类中的实例成员变量。
好了,大家可以上机实验,消化吸收本节内容。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程