• java 内部类


    一、基础

    1、概念

    内部类:在类内部中定义类

    2、分类

    a、成员内部类

    b、局部内部类(匿名内部类)

    二、成员内部类(类比成员方法和成员变量)

    1、语法

    package cn.wt.day11.demon;
    
    public class Outer {
    
        // 成员内部类
        public class Inner{
            // 成员内部类 成员方法
            public void innerMethod(){
                System.out.println("内部类 成员方法");
            }
        }
    
        // 外部类 成员方法
        public void outerMethod(){
            System.out.println("外部类 成员方法");
        }
    }

    注意:

    a、外部类的修饰词可以使用public和不写

    b、成员内部类可以使用public protected (default) private

    2、使用成员内部类

    a、间接使用

     语法

    在外部类成员方法中,将内部类实例化,并使用内部类成员方法

    例子

     1 package cn.wt.day11.demon;
     2 
     3 public class Outer {
     4 
     5     // 成员内部类
     6     public class Inner{
     7         // 成员内部类 成员方法
     8         public void innerMethod(){
     9             System.out.println("内部类 成员方法");
    10         }
    11     }
    12 
    13     // 外部类 成员方法
    14     public void outerMethod(){
    15         System.out.println("外部类 成员方法");
    16         new Inner().innerMethod();
    17     }
    18 }
    Outer.java
     1 package cn.wt.day11.demon;
     2 
     3 public class Demon {
     4     public static void main(String[] args) {
     5         Outer outer = new Outer();
     6         outer.outerMethod();
     7 //        外部类 成员方法
     8 //        内部类 成员方法
     9     }
    10 }
    Demon.java

    b、直接使用

    语法

    外部类名称.内部类名称 对象 = new 外部类名称().new 内部类名称();

    例子

     1 package cn.wt.day11.demon;
     2 
     3 public class Outer {
     4 
     5     // 成员内部类
     6     public class Inner{
     7         // 成员内部类 成员方法
     8         public void innerMethod(){
     9             System.out.println("内部类 成员方法");
    10         }
    11     }
    12 
    13     // 外部类 成员方法
    14     public void outerMethod(){
    15         System.out.println("外部类 成员方法");
    16     }
    17 }
    Outer.java
     1 package cn.wt.day11.demon;
     2 
     3 public class Demon {
     4     public static void main(String[] args) {
     5         Outer outer = new Outer();
     6         outer.outerMethod();
     7         // 直接使用 成员内部类的方法
     8         Outer.Inner inner = new Outer().new Inner();
     9         inner.innerMethod();
    10     }
    11 }
    Demon.java

     3、同名变量的使用

    a、内部类成员方法局部变量

    语句:变量

    b、内部类成员方法

    语法:this.变量

    c、外部类成员方法

    语法:外部类.this.变量

    例子

     1 package cn.wt.day11.demon;
     2 
     3 
     4 public class Outer {
     5     int num = 10;
     6     // 成员内部类
     7     public class Inner{
     8         int num = 20;
     9         // 成员内部类 成员方法
    10         public void innerMethod(){
    11             int num = 30;
    12             System.out.println("内部类 成员方法");
    13             System.out.println(num);
    14             System.out.println(this.num);
    15             System.out.println(Outer.this.num);
    16         }
    17     }
    18 
    19     // 外部类 成员方法
    20     public void outerMethod(){
    21         System.out.println("外部类 成员方法");
    22         new Inner().innerMethod();
    23     }
    24 }
    Outer.java
    1 package cn.wt.day11.demon;
    2 
    3 public class Demon {
    4     public static void main(String[] args) {
    5         Outer.Inner inner = new Outer().new Inner();
    6         inner.innerMethod();
    7     }
    8 }
    Demon.java

    三、局部成员方法

    在方法中定义类,这个类叫做局部内部类

    1、语法

    package cn.wt.day11.demon02;
    
    public class Outer {
        public void outerMethod(){
            // 局部内部类
            class Inner{
                public void innerMethod(){
    
                }
            }
        }
    }

    注意:局部内部类的修饰符为 无

    2、使用

     1 package cn.wt.day11.demon02;
     2 
     3 public class Outer {
     4     public void outerMethod(){
     5         // 局部内部类
     6         class Inner{
     7             public void innerMethod(){
     8                 System.out.println("局部内部类 内部方法");
     9             }
    10         }
    11         new Inner().innerMethod();
    12     }
    13 }
    Outer.java
    1 package cn.wt.day11.demon02;
    2 
    3 public class Demon {
    4     public static void main(String[] args) {
    5         Outer outer = new Outer();
    6         outer.outerMethod();
    7     }
    8 }
    Demon.java

    注意:内部类的方法可以使用内部类的成员变量(该成员变量不可变)

    四、匿名内部类

    1、语法

    抽象类(接口)名称 obj = new 抽象类(接口){
            对抽象方法进行overrider  
    }

    注意:

    匿名内部类是局部内部类的一种

    可以与匿名对象共同使用

    2、例子

     抽象类

    1 package cn.wt.day11.demon03;
    2 
    3 public abstract class Person {
    4     public abstract void show();
    5 
    6     public abstract void anotherMethod();
    7 }
    Person.java
     1 package cn.wt.day11.demon03;
     2 
     3 public class demon {
     4     public static void main(String[] args) {
     5         // 匿名内部类
     6         Person person = new Person() {
     7             @Override
     8             public void show() {
     9                 System.out.println("抽象类的匿名内部类");
    10             }
    11 
    12             @Override
    13             public void anotherMethod() {
    14                 System.out.println("使用另一个方法");
    15             }
    16         };
    17         person.show();
    18         person.anotherMethod();
    19         // 匿名对象 和 匿名内部类一起使用
    20         new Person(){
    21             @Override
    22             public void show() {
    23                 System.out.println("匿名对象的匿名内部类");
    24             }
    25 
    26             @Override
    27             public void anotherMethod() {
    28                 System.out.println("匿名对象的另一个方法");
    29             }
    30         }.show();
    31     }
    32 }
    demon.java

    接口

    1 package cn.wt.day11.demon03;
    2 
    3 public interface Hero {
    4     public abstract void show();
    5 
    6     public abstract void attack();
    7 }
    Hero.java
     1 package cn.wt.day11.demon03;
     2 
     3 public class Demon01 {
     4     public static void main(String[] args) {
     5         // 接口的匿名内部类
     6         Hero hero = new Hero() {
     7             @Override
     8             public void show() {
     9                 System.out.println("我是盗贼");
    10             }
    11 
    12             @Override
    13             public void attack() {
    14                 System.out.println("我用打击攻击敌人");
    15             }
    16         };
    17         hero.show();
    18         hero.attack();
    19         // 接口匿名内部类 + 匿名对象
    20         new Hero(){
    21             @Override
    22             public void show() {
    23                 System.out.println("匿名对象,我是射击猎");
    24             }
    25 
    26             @Override
    27             public void attack() {
    28                 System.out.println("好几年没玩了,忘记武器叫什么名字了");
    29             }
    30         }.attack();
    31     }
    32 }
    Demon01.java

    五、类做为成员变量

     1 package cn.wt.day11.demon04;
     2 
     3 public class Hero {
     4     private String name;
     5     private int age;
     6     private Weaper weaper;
     7 
     8     public Hero() {
     9     }
    10 
    11     public Hero(String name, int age, Weaper weaper) {
    12         this.name = name;
    13         this.age = age;
    14         this.weaper = weaper;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 
    33     public Weaper getWeaper() {
    34         return weaper;
    35     }
    36 
    37     public void setWeaper(Weaper weaper) {
    38         this.weaper = weaper;
    39     }
    40 
    41     public void show(){
    42         System.out.println(this.name + ",今年" + this.age + "岁,拿着" + this.weaper.getNickname());
    43     }
    44 }
    Hero.java
     1 package cn.wt.day11.demon04;
     2 
     3 public class Weaper {
     4     private String nickname;
     5 
     6     public Weaper() {
     7     }
     8 
     9     public Weaper(String nickname) {
    10         this.nickname = nickname;
    11     }
    12 
    13     public String getNickname() {
    14         return nickname;
    15     }
    16 
    17     public void setNickname(String nickname) {
    18         this.nickname = nickname;
    19     }
    20 }
    Weaper.java
     1 package cn.wt.day11.demon04;
     2 
     3 public class Demon {
     4     public static void main(String[] args) {
     5         Hero hero = new Hero();
     6         hero.setName("哪吒");
     7         hero.setAge(3);
     8         hero.setWeaper(new Weaper("浑天绫"));
     9         hero.show();
    10     }
    11 }
    Demon.java

    六、接口做为成员变量

     1 package cn.wt.day11.demon05;
     2 
     3 public class Hero {
     4     private String name;
     5     private Attack attack;
     6 
     7     public Hero() {
     8     }
     9 
    10     public Hero(String name, Attack attack) {
    11         this.name = name;
    12         this.attack = attack;
    13     }
    14 
    15     public String getName() {
    16         return name;
    17     }
    18 
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22 
    23     public Attack getAttack() {
    24         return attack;
    25     }
    26 
    27     public void setAttack(Attack attack) {
    28         this.attack = attack;
    29     }
    30 
    31     public void show(){
    32         System.out.println(this.name + "攻击的拟声词");
    33         // 注意:调用接口的抽象方法
    34         this.attack.attack();
    35     }
    36 }
    Hero.java
    1 package cn.wt.day11.demon05;
    2 
    3 public interface Attack {
    4     public abstract void attack();
    5 }
    Attack.java
     1 package cn.wt.day11.demon05;
     2 
     3 public class Demon {
     4     public static void main(String[] args) {
     5         Hero hero = new Hero();
     6         hero.setName("艾希");
     7         hero.setAttack(new Attack() {
     8             @Override
     9             public void attack() {
    10                 System.out.println("棒棒棒");
    11             }
    12         });
    13         hero.show();
    14     }
    15 }
    Demon.java
  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    获取项目版本号与设置引导页的判断条件
    [iOS]简单的APP引导页的实现 (Swift)
    iOS
    文顶顶 iOS开发UI篇—UITabBarController简单介绍 iOS开发UI篇—UITabBarController简单介绍
    Swift开源项目精选
    Fuel 5.1安装openstack I版本号环境
  • 原文地址:https://www.cnblogs.com/wt7018/p/12232632.html
Copyright © 2020-2023  润新知