Java内部类

打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

一、内部类

内部类的概念:在一个类的内部在定义一个完整的类。如下代码:
  1. class Outer{
  2.     class Inner{
  3.         
  4.     }
  5. }
复制代码
特点:

  • 内部类在编译之后也可以生成独立的字节码文件,即上述Inner类在编码后可以生成class文件;


  • 内部类可以直接访问外部类的私有成员,而不破坏封装;
  • 内部类可为外部类提供必要的内部功能组件。
  1. public class Body {
  2.     private String name = "qqqqqq";
  3.     class Header{
  4.         public void show(){
  5.             System.out.println(name);
  6.         }
  7.     }
  8. }
复制代码
分类:成员内部类、静态内部类、局部内部类、匿名内部类。
二、成员内部类


  • 成员内部类要在类的内部定义,是与实例变量、实例方法同级别的类。
    1. //外部类
    2. public class Outer {
    3. //  实例变量
    4.     private String name = "张三";
    5.     private int age = 10;
    6.     //内部类
    7.     class Inner{
    8.         private String address = "成都";
    9.         private String phone = "12345678901";
    10. //      方法
    11.         public void show(){
    12. //            打印外部类的属性
    13.             System.out.println(name);
    14.             System.out.println(age);
    15. //            打印内部类中的属性
    16.             System.out.println(address);
    17.             System.out.println(phone);
    18.         }
    19.     }
    20.     public static void main(String[] args) {
    21.         Outer outer = new Outer();
    22.         Inner inner = outer.new Inner();
    23.         inner.show();
    24.     }
    25. }
    复制代码
  • 外部类的一个实例部门,创建内部类时,必须依赖外部类对象
    1.                 Outer outer = new Outer();
    2.         Inner inner = outer.new Inner();
    复制代码
  • 当外部类、内部类存在同名属性是,会优先访问内部类属性;内部类属性和外部类属性名字雷同,要加上外部类名.this,如下:

  • 成员内部类不能定义静态成员\(static\),但是可以定义\(static\ \ final\)​常量。

三、静态内部类


  • 不依赖外部对象,可以直接创建或通过类名访问,可以声明静态成员
​        只有内部的类才可以用static修饰,普通的类(外部类)不能用static修饰。
  1. public class Outter {
  2.     private String name = "XXX";
  3.     private int age = 10;
  4.     static class Inner{
  5.         private String add = "成都";
  6.         private String phone = "12345678910";
  7.         private static int count = 100;
  8.         public void show(){
  9. //            调用外部类的属性
  10. //            1、先创建外部类的对象
  11.             Outter outter = new Outter();
  12. //            2、调用外部类对象的属性
  13.             System.out.println(outter.name);
  14.             System.out.println(outter.age);
  15. //            调用静态内部类的属性和方法
  16.             System.out.println(add);
  17.             System.out.println(phone);
  18. //            调用静态内部类的静态属性
  19.             System.out.println(Inner.count);
  20.         }
  21.     }
  22.     public static void main(String[] args) {
  23.         Inner inner = new Inner();
  24.     }
  25. }
复制代码
静态内部类Inner和Outter是同一级别的,由于Inner是静态的,在创建Outter时,static的类也同时被创建了。
四、局部内部类

定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法中。局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身雷同,变量必须修饰为final。

  • 注意:局部内部类是在方法中定义的,所以声明局部内部类就要在方法中创建局部内部类对象。
  • 注意:在局部内部类的方法中定义的局部变量,默认局部变量为常量final,数据内容不可修改。
  • 局部内部类不能定义静态成员\(static\),但是可以定义\(static\ \ final\)常量。
  1. public class Outer {
  2.     private String name = "xxx";
  3.     private int age = 18;
  4.     public void show(){
  5. //        定义的局部变量
  6.         String address = "成都";
  7. //        局部内部类不能加任何修饰符
  8.         class Inner{
  9.             String phone = "12345678901";
  10.             String email = "qqqqqq@qq.com";
  11.             public void show2() {
  12. //                访问外部类的属性
  13.                 System.out.println(Outer.this.name);
  14.                 System.out.println(Outer.this.age);
  15. //                访问内部类的属性
  16.                 System.out.println(this.phone);
  17.                 System.out.println(this.email);
  18. //                访问局部变量,默认为常量final
  19.                 System.out.println(address);
  20.             }
  21.         }
  22. //        创建局部内部类对象
  23.         Inner inner = new Inner();
  24.         inner.show2();
  25.     }
  26.     public static void main(String[] args) {
  27.         Outer outer = new Outer();
  28.         outer.show();
  29.     }
  30. }
复制代码
五、匿名内部类

本质就是没有类名的局部内部类(一切特征都与局部内部类雷同)
必须继承一个父类或者实现一个接口
定义类、实现类、下黄建对象的语法合并,只能创建一个该类的对象。
Usb.java
  1. public interface Usb {
  2.     void service();
  3. }
复制代码
Mouse.java
  1. public class Mouse implements Usb{
  2.     @Override
  3.     public void service() {
  4.         System.out.println("鼠标已经链接");
  5.     }
  6. }
复制代码
TestUsb.java
  1. public class TestUsb {
  2.     public static void main(String[] args) {
  3. //        创建接口类型的变量
  4. //        Usb usb = new Mouse();
  5. //        usb.service();
  6. //        局部内部类
  7. //        class Fan implements Usb{
  8. //            @Override
  9. //            public void service() {
  10. //                System.out.println("连接电脑成功,电扇开始工作...");
  11. //            }
  12. //        }
  13. //
  14. //        Usb usb = new Fan();
  15. //        usb.service();
  16. //        匿名内部类
  17.         Usb usb = new Usb() {
  18.             @Override
  19.             public void service() {
  20.                 System.out.println("连接电脑成功,电扇开始工作...");
  21.             }
  22.         };
  23.         usb.service();
  24.     }
  25. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表