zoukankan      html  css  js  c++  java
  • 内部类

    内部类

    • 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类

    • 分类:成员内部类,局部内部类(包含匿名内部类)

    成员内部类

    public class Hero {//外部类
        private String name;
        float hp;
        float armor;
    
        public Hero(String name){
            this.name = name;
        }
    
        //外部类方法
        public void method(int s){
            System.out.println("外部类方法");
            new BattleScore().score(s);//使用外部类方法调用内部方法
        }
    
        public class BattleScore {//内部类
            //内部类方法
            public void score(int s){
                System.out.println(name + "的成绩是" + s);
            }
        }
    }
    
    /////////////////////////////////////////////////
    public class InnerClassMain {
        public static void main(String[] args) {
            //方法一:通过外部方法间接调用内部方法
            Hero garen = new Hero("garen");
            garen.method(100);
    
            //方法二:直接调用内部类方法
            Hero.BattleScore sore = new Hero("garen").new BattleScore();
            sore.score(100);
        }
    }
    
    • 成员内部类为外部类嵌套一个类

    • 访问成员内部类方法有两种:

    • 通过外部类间接调用内部类方法

    • 直接使用内部类方法: 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

    • 内部类成员变量访问顺序:

      public class Outer {
          int num = 30;//外部类成员变量
      
          public class Inner{
              int num = 20;
              public void method(){
                  int num = 10;
                  System.out.println(num);//输出10
                  System.out.println(this.num);//输出20
                  System.out.println(Outer.this.num);//输出30
              }
          }
      
          public static void main(String[] args) {
              Outer.Inner obj = new Outer().new Inner();
              obj.method();
          }
      }
      

    局部内部类

    • 一个类是定义在一个方法内部的,则为局部内部类
    • 只有当前所属方法才能使用,外界不能访问,要访问局部内部类要通过间接访问
    • 权限修饰符:
      • 外部类:public, (default)
      • 成员内部类:public, protected, (default), private
      • 局部内部类:不能修饰
    public class LocalInnerClass {
        //外部类方法
        public void method(){
            //局部内部类,且不能权限修饰符修饰
            class InnerClass{
                int num = 10;
                public void innerMethod(){
                    System.out.println(num);
                }
            }
            //外界不能直接访问局部内部类,需要方法内创建对象
            //通过调用方法间接访问
            InnerClass inner = new InnerClass();
            inner.innerMethod();
        }
    
        public static void main(String[] args) {
            LocalInnerClass obj = new LocalInnerClass();
            obj.method();
        }
    }
    
    • 局部内部类如果希望访问所在方法的局部变量的,那么这个局部变量必须是有效final

    匿名内部类

    • 如果接口的实现类(或者父类的子类)只需要使用唯一的一次,这种情况下可以省略该类的定义,使用匿名内部类

    • 声明一个抽象类(接口)的同时实例化它,可使代码更加简洁精练

    • 接口名称 对象名 = new 接口名称(){ //覆盖重写所有的抽象方法 };

      或者 抽象类名称 对象名 = new 抽象类名称(){ //覆盖重写所有的抽象方法 };

      public abstract class Hero {//外部类
          private String name;
          float hp;
          float armor;
      
          public Hero(String name) {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public abstract void attrack();//抽象方法
      }
      
      /////////////////////////////////////////////
      
      public class InnerClassMain {
          public static void main(String[] args) {
              
              //匿名内部类
              Hero ADHero = new Hero("garen"){
                  @Override
                  public void attrack(){
                      System.out.println(getName()+"其他攻击方法");
                  }
              };
              ADHero.attrack();
          }
      }
      
  • 相关阅读:
    Tjoi 2017 异或和
    Noi 十连测 建造记者站
    Noi 十连测 基因改造计划
    Noi 十连测 人生的经验
    NOI 十连测 Round 5 T2 运河计划
    NOI 十连测 Round 5 T1
    【ZJOI2018】迷宫
    BZOJ 十连测 day5 T3
    BZOJ 十连测 可持久化字符串
    BZOJ 十连测 二进制的世界
  • 原文地址:https://www.cnblogs.com/geqianLee/p/13154501.html
Copyright © 2011-2022 走看看