内部类的使用
类的内部成员之五:内部类
1、java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2、内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
3、成员内部类:
一方面,作为外部类的成员:
-调用外部类的结构
-可以被static修饰
-可以被4种不同的权限修饰
另一方面,作为一个类:
-类内可以定义属性、方法、构造器等
-类可以用final修饰,表示此类不能被继承。
-可以被abstract修饰,表示此类不能被实例化
4、重点关注如下三个问题:
-如何实例化成员内部类的对象
-如何在成员内部类中,区分调用外部类的结构
-局部内部类的使用
5、在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量的话,要求此局部变量声明为final。
jdk 7 及之前版本,要求此局部变量显式的声明为final。
jdk 8 及之后的版本,可以省略final 的声明。
总结:成员内部类和局部内部类,在编译以后,都会生成字节码文件。
格式:成员内部类:外部类$内部类名.class
局部内部类:外部类$数字 内部类名.class
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | public class InnerClassTest { public static void main(String[] args) { //创建Brain实例(静态的成员内部类) Person.Brain brain = new Person.Brain(); brain.think(); //创建bond实例(非静态的成员内部类) Person p1 = new Person(); Person.Bond bond = p1. new Bond(); bond.breakbond(); } } class Person{ int age; String name; public void eat() { System.out.println( "eat health!" ); } //静态成员内部类 static class Brain{ public void think() { System.out.println( "人需要不断思考!" );<br> System.out.println(age); //此变量会自动默认为final修饰<br> } } //非静态成员内部类 class Bond{ String name; public Bond() { } public void breakbond() { System.out.println( "be careful!" ); eat(); Person. this .eat(); //调用外部类的结构 } public void method1(String name) { System.out.println(name); //方法的形参 System.out.println( this .name); //内部类的属性 System.out.println(Person. this .name); //外部类的属性 System.out.println(age); } } public void method1() { //方法内的局部内部类 class A{ } } { //代码块内的局部内部类 class B{ } } public Person(){ //构造器内的局部内部类 class C{ } } } |
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 | //局部内部类的使用场景,实际开发过程中用的很少,看源码时会遇到。 public class InnerClassTest1 { public void method() { //局部内部类使用1:实际开发中不会用到这种返回void的内部类使用方法<br> class AA{ } } //使用2:返回一个实现了Comparable接口的类的对象 public Comparable getComparable() { //方式1:创建一个实现了Comparable接口的类:局部内部类 // class MyComparable implements Comparable{ // @Override // public int compareTo(Object o) { // return 0; // } // } // // return new MyComparable(); //方式2:创建一个实现了Comparable接口的匿名实现类的匿名对象 return new Comparable() { public int compareTo(Object o) { return 0 ; } }; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)