zoukankan      html  css  js  c++  java
  • Java内部类概述

    Java内部类概述

    成员内部类

    1. 就像外部类总的一个成员,可以访问外部类中的所有参数和方法,但是外部类不能直接访问内部类的参数和方法

    2. 成员内部类也可以设定访问权限修饰符,private、public、protected,缺省

    3. 在成员内部类中不能有静态参数和静态方法

    4. 成员内部类的实例化需要借助外部类的实例来实例,即

      Outer.Inner inner=new Outer().new Inner();
      

    局部内部类

    1. 顾名思义,这是在方法或者作用域中的类,所以不能有public、private等访问控制符修饰

    匿名内部类

    1. 匿名内部类是一种没有具体类名的类,但是是一种用的较多的内部类

    2. 匿名内部类可以用于实现接口,继承类,并且实现其中的方法,例如

      public class Outter3 {
          public static void main(String[] args) {
              Animal animal = new Animal() {   //实现了接口Animal的匿名内部类
                  @Override
                  public String xiaoLaoFu() {
                      return "dai";
                  }
              };
              System.out.println(animal.xiaoLaoFu());
      
              Temp2 temp2 = new Temp2() {    //匿名内部类继承Temp2
                  @Override
                  public String method3() {
                      return "被重写了的方法";
                  }
              };
              System.out.println(temp2.method3());
          }
      }
      
      interface Animal {
          String xiaoLaoFu();
      }
      
      class Temp2 {
          public String method3() {
              return "temp2中的方法";
          }
      }
      
      1. 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承类和实现的接口中的方法重写。

    静态内部类

    1. 静态内部类与成员内部类类似,但是其是static修饰的,所以同样的,静态内部类类似于外部类中的静态变量一样,可以直接访问外类类中的静态属性

    2. 静态内部类的实例化不需要借助于外部类实例:

      class Outter4 {
          static String dabenxiang = "快跑呀";
      
          String dazhuzhu = "白花花";
      
          //静态内部类
          static class Inner4 {
      
              public void method() {
                  System.out.println("静态内部类可以直接访问外部类中的静态变量:" + dabenxiang);
                  //  System.out.println(dazhuzhu);  // 访问不到
                  System.out.println("静态内部类中的方法!");
              }
          }
      
          public static void main(String[] args) {
              //静态内部类的实例化
              Inner4 inner4 = new Inner4();
              inner4.method();
              Outter4.Inner4 inner41 = new Outter4.Inner4();
          }
      }
      
      //    在其他类中实例化静态内部类
      class Temp {
          public static void main(String[] args) {
              Outter4.Inner4 inner4 = new Outter4.Inner4();
              inner4.method();
      
          }
      }
      

    内部类的使用场景和好处

    1. 使得多继承的解决方案变得完整,每个内部类都能独立的继承和实现接口,并且无论外部类是否已经继承或实现接口
    2. 可以将存在一定逻辑关系的类组织在一起,同时可以对外界隐藏,例如事件驱动程序,线程运行
    成员内部类也可以被继承,当成员内部类被继承的时候,其引用方式必须为 Outter.Inner,并且构造器中必须有指向外部类对象的引用,并通过这个引用调用super() :
    class WithInner {
        class Inner{
             
        }
    }
    class InheritInner extends WithInner.Inner {
          
        // InheritInner() 是不能通过编译的,一定要加上形参
        InheritInner(WithInner wi) {
            wi.super(); //必须有这句调用
        }
      
        public static void main(String[] args) {
            WithInner wi = new WithInner();
            InheritInner obj = new InheritInner(wi);
        }
    }
    
  • 相关阅读:
    git使用教程2-更新github上代码
    git使用教程-本地代码上传到github
    【Mac系统 + Git】之上传项目代码到github上以及删除某个文件夹
    【Mac + Appium + Python3.6学习(五)】之常用的Android自动化测试API总结
    【Mac + Python + Selenium】之PyCharm配置Selenium自动化
    appium自动化常用API
    【Mac + Appium + Python3.6学习(四)】之常用的IOS自动化测试API总结
    ubuntu指令大全
    Win10上安装双系统(win10+ubuntu)
    C语言共用体的作用
  • 原文地址:https://www.cnblogs.com/zwwang/p/15089864.html
Copyright © 2011-2022 走看看