zoukankan      html  css  js  c++  java
  • Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

    Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

    内部类的主要作用:使用内部类可以减少命名冲突。

    定义位置:一个内部类可以定义在一个类中,也可以在一个方法中,甚至在一个表达式中。

    广义上讲,内部类分为四种:

    静态内部类(static inner classes)

    成员内部类(member inner classes)

    局部内部类(local inner classes)

    匿名内部类(anonymous inner classes)

     

    1、静态内部类(static inner classes)

    最简单的内部类。

    只能访问外部类的静态成员变量与静态方法。

    生成静态内部类对象的方法:

    OuterClass.InnerClass inner = new OuterClass.InnerClass();

    相关使用例子:静态内部类

     1 class StaticInner{
    
     2     private static int a = 1;
    
     3     /**
    
     4    * 静态内部类
    
     5    * 生成的类名:StaticInner$InnerClass
    
     6    */
    
     7     public static class InnerClass{
    
     8         //静态内部类可以声明静态的成员变量,其他的内部类不可以
    
     9         private static int b = 1;
    
    10         public void execute(){
    
    11             //静态内部类只能访问静态程序
    
    12             System.out.println(a + b);
    
    13         }
    
    14     }
    
    15 }
    
    //main方法中使用:
    
    16 public static void main(String[] args) {
    
    17     //创建静态内部类
    
    18     StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
    
    19     innerClass.execute();
    
    20 }

    2、成员内部类(member inner classes):

    成员内部类可以访问外部类的静态与非静态的方法和成员变量。

    生成成员内部类对象的方法:

    OuterClass.InnerClass inner = new OuterClass().new InnerClass();

    在局部内部类中访问外部类的成员变量的方法:

    OuterClass.this.a;

     相关使用例子:成员内部类

     1 class MemberInner{
    
     2     private int a = 1;
    
     4     public void execute(){
    
     5         //在外部类中创建成员内部类
    
     6         InnerClass innerClass = this.new InnerClass();
    
     7     }
    
     9     /**
    
    10  * 成员内部类
    
    11  */
    
    12     public class InnerClass{
    
    14         //内部类可以创建与外部类同名的成员变量
    
    15         private int a = 2; 
    
    17         public void execute(){
    
    18             //this引用的是内部类
    
    19              System.out.println(this.a);
    
    20             //在内部了中使用外部类的成员变量的方法
    
    21             System.out.println(MemberInner.this.a);
    
    22         }
    
    23     }
    
    24 }
    
    //在main方法中使用:
    
    1 public static void main(String[] args) {
    
    2     //创建成员内部类
    
    3     MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
    
    4     innerClass.execute();
    
    5 }

    3、局部内部类(local inner classes):

    类似于局部变量,不能定义为public,protected,private或者static类型。

    定义方法中,只能方法中声明为final类型的变量。

    相关使用例子:局部内部类

     1 class LocalInner{
    
     3     public void execute(){
    
     4         final int a = 1;
    
     5      /**
    
     6      创建局部内部类
    
     7      */
    
     8         class InnerClass{
    
     9             public void execute(){
    
    10                 System.out.println("LocalInner Class”);
    
    12                 //局部内部类只能访问final类型的变量
    
    13                 System.out.println(a);
    
    14             }
    
    15         }
    
    16         //只能在所在方法区域创建
    
    17         new InnerClass().execute();
    
    18     }
    
    19 }
    
    //在main方法中使用:
    
    1 public static void main(String[] args) {
    
    2     //外部不能直接创建局部内部类
    
    3     LocalInner localInner = new LocalInner();
    
    4     localInner.execute();
    
    5 }

    4、匿名内部类(anonymous inner classes):

    匿名内部类没有类名,没有class关键字也没有extends和implements等关键字修饰。

    匿名内部类会隐式地继承一个父类或实现一个接口。

    相关使用例子:匿名内部类

     1 public static void main(String[] args) {
    
     2     AnonymousInnerClassTest test = new AnonymousInnerClassTest();
    
     4     /**
    
     5  * 创建匿名内部类
    
     6  * 生成的类名:AnonymousInnerClassTest$1
    
     7  */
    
     8     test.print(new Date(){
    
     9         //重写toString()方法
    
    10         @Override
    
    11         public String toString() {
    
    12             return "Hello world.";
    
    13         }
    
    14     });
    
    16     JButton button = new JButton();
    
    18     /**
    
    19  * 创建匿名内部类
    
    20  * 该匿名内部类实现ActionListener接口
    
    21  * 生成的类名:AnonymousInnerClassTest$1
    
    22  */
    
    23     button.addActionListener(new ActionListener(){
    
    24         //实现接口中的方法
    
    25         @Override
    
    26         public void actionPerformed(ActionEvent e) {
    
    27             System.out.println("使用匿名内部类实现ActionListener接口");
    
    28         }
    
    29     });
    
    30 }
    
    32 public void print(Date date){
    
    33     System.out.println(date);
    
    34 }
  • 相关阅读:
    AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目
    在CentOS部署AspNetCore网站
    使用Docker发布Asp.Net Core程序到Linux
    Window环境下使用多个Git账号(github,gitee,gitlab,gogs等)
    在.netcore webapi项目中使用后台任务工具Hangfire
    WebApi 全局异常与局部异常
    eclipse中jsp页面Invalid location of tag 解决办法分析小结
    win7 64位机ODBC的数据源DSN添加和移除问题
    jsp页面has already been called for this response错误解决方法。
    解决java图形界面label中文乱码
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4915287.html
Copyright © 2011-2022 走看看