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

    1.内部类的概念与分类

     =======================================================================================================

    2.成员内部类的定义

     

     

     =============================================================================================================

    3.成员内部类的使用

    Body.java

    package cn.itcast.day11.demo03;

    public class Body { // 外部类

    public class Heart { // 成员内部类

    // 内部类的方法
    public void beat() {
    System.out.println("心脏跳动:蹦蹦蹦!");
    System.out.println("我叫:" + name); // 正确写法!
    }

    }

    // 外部类的成员变量
    private String name;

    // 外部类的方法
    public void methodBody() {
    System.out.println("外部类的方法");
    new Heart().beat();
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }

    ----------------------------------------------------------------------------------------------------

    Demo01InnerClass.java

    package cn.itcast.day11.demo03;

    /*
    如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
    例如:身体和心脏的关系。又如:汽车和发动机的关系。

    分类:
    1. 成员内部类
    2. 局部内部类(包含匿名内部类)

    成员内部类的定义格式:
    修饰符 class 外部类名称 {
    修饰符 class 内部类名称 {
    // ...
    }
    // ...
    }

    注意:内用外,随意访问;外用内,需要内部类对象。

    ==========================
    如何使用成员内部类?有两种方式:
    1. 间接方式:在外部类的方法当中,使用内部类;然后main只是调用外部类的方法。
    2. 直接方式,公式:
    类名称 对象名 = new 类名称();
    【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】
    */
    public class Demo01InnerClass {

    public static void main(String[] args) {
    Body body = new Body(); // 外部类的对象
    // 通过外部类的对象,调用外部类的方法,里面间接在使用内部类Heart
    body.methodBody();
    System.out.println("=====================");

    // 按照公式写:
    Body.Heart heart = new Body().new Heart();
    heart.beat();
    }

    }

     

    ============================================================================================================= 

     4.内部类的同名变量访问

     =========================================================================================================================

    5.局部内部类定义

     

     注意:局部内部类,只有当前所属的方法才能使用它,出了这个方法外面就不能用了

    ==============================================================================================================

    6.局部内部类的final问题

     

     =============================================================================================================

     7.匿名内部类

     =======================================================================================================================

    8.匿名内部类的注意事项

     MyInterface.java

    package cn.itcast.day11.demo05;

    public interface MyInterface {

    void method1(); // 抽象方法

    void method2();

    }

    --------------------------------------------------------------------------------------------------------------------------------------------

    DemoMain.java

    package cn.itcast.day11.demo05;

    /*
    如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,
    那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】。

    匿名内部类的定义格式:
    接口名称 对象名 = new 接口名称() {
    // 覆盖重写所有抽象方法
    };

    对格式“new 接口名称() {...}”进行解析:
    1. new代表创建对象的动作
    2. 接口名称就是匿名内部类需要实现哪个接口
    3. {...}这才是匿名内部类的内容

    另外还要注意几点问题:
    1. 匿名内部类,在【创建对象】的时候,只能使用唯一一次。
    如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
    2. 匿名对象,在【调用方法】的时候,只能调用唯一一次。
    如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
    3. 匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】
    强调:匿名内部类和匿名对象不是一回事!!!
    */
    public class DemoMain {

    public static void main(String[] args) {
    // MyInterface obj = new MyInterfaceImpl();
    // obj.method();

    // MyInterface some = new MyInterface(); // 错误写法!

    // 使用匿名内部类,但不是匿名对象,对象名称就叫objA
    MyInterface objA = new MyInterface() {
    @Override
    public void method1() {
    System.out.println("匿名内部类实现了方法!111-A");
    }

    @Override
    public void method2() {
    System.out.println("匿名内部类实现了方法!222-A");
    }
    };
    objA.method1();
    objA.method2();
    System.out.println("=================");

    // 使用了匿名内部类,而且省略了对象名称,也是匿名对象
    new MyInterface() {
    @Override
    public void method1() {
    System.out.println("匿名内部类实现了方法!111-B");
    }

    @Override
    public void method2() {
    System.out.println("匿名内部类实现了方法!222-B");
    }
    }.method1();
    // 因为匿名对象无法调用第二次方法,所以需要再创建一个匿名内部类的匿名对象
    new MyInterface() {
    @Override
    public void method1() {
    System.out.println("匿名内部类实现了方法!111-B");
    }

    @Override
    public void method2() {
    System.out.println("匿名内部类实现了方法!222-B");
    }
    }.method2();
    }

    }

     ==================================================================================================

    9.类作为成员变量类型

    Weapon.java

    package cn.itcast.day11.demo06;

    public class Weapon {

    private String code; // 武器的代号

    public Weapon() {
    }

    public Weapon(String code) {
    this.code = code;
    }

    public String getCode() {
    return code;
    }

    public void setCode(String code) {
    this.code = code;
    }
    }

    -------------------------------------------------------------------------------------------------------------------------------------

    Hero.java

    package cn.itcast.day11.demo06;

    // 游戏当中的英雄角色类
    public class Hero {

    private String name; // 英雄的名字
    private int age; // 英雄的年龄
    private Weapon weapon; // 英雄的武器  // 注意Weapon为一个类

    public Hero() {
    }

    public Hero(String name, int age, Weapon weapon) {
    this.name = name;
    this.age = age;
    this.weapon = weapon;
    }

    public void attack() {
    System.out.println("年龄为" + age + "的" + name + "用" + weapon.getCode() + "攻击敌方。");
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public Weapon getWeapon() {
    return weapon;
    }

    public void setWeapon(Weapon weapon) {
    this.weapon = weapon;
    }
    }

    ---------------------------------------------------------------------------------------------------------------------

    DemoMain.java

    package cn.itcast.day11.demo06;

    public class DemoMain {

    public static void main(String[] args) {
    // 创建一个英雄角色
    Hero hero = new Hero();
    // 为英雄起一个名字,并且设置年龄
    hero.setName("盖伦");
    hero.setAge(20);

    // 创建一个武器对象
    Weapon weapon = new Weapon("AK-47");
    // 为英雄配备武器
    hero.setWeapon(weapon);

    // 年龄为20的盖伦用多兰剑攻击敌方。
    hero.attack();
    }

    }

    ==========================================================================================================

    10.接口作为成员变量类型

    Skill.java  //注意:这是一个接口

    package cn.itcast.day11.demo07;

    public interface Skill {

    void use(); // 释放技能的抽象方法

    }

    -------------------------------------------------------------------------------------

    Hero.java

    package cn.itcast.day11.demo07;

    public class Hero {

    private String name; // 英雄的名称
    private Skill skill; // 英雄的技能   //Skill为一个接口

    public Hero() {
    }

    public Hero(String name, Skill skill) {
    this.name = name;
    this.skill = skill;
    }

    public void attack() {
    System.out.println("我叫" + name + ",开始施放技能:");
    skill.use(); // 调用接口中的抽象方法
    System.out.println("施放技能完成。");
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public Skill getSkill() {
    return skill;
    }

    public void setSkill(Skill skill) {
    this.skill = skill;
    }
    }

    ---------------------------------------------------------------------------------------------------------------------------------

    DemoGame.java

    package cn.itcast.day11.demo07;

    public class DemoGame {

    public static void main(String[] args) {
    Hero hero = new Hero();
    hero.setName("艾希"); // 设置英雄的名称

    // 设置英雄技能
    // hero.setSkill(new SkillImpl()); // 使用单独定义的实现类

    // 还可以改成使用匿名内部类
    // Skill skill = new Skill() {
    // @Override
    // public void use() {
    // System.out.println("Pia~pia~pia~");
    // }
    // };
    // hero.setSkill(skill);

    // 进一步简化,同时使用匿名内部类和匿名对象
    hero.setSkill(new Skill() {
    @Override
    public void use() {
    System.out.println("Biu~Pia~Biu~Pia~");
    }
    });

    hero.attack();
    }

    }

    ============================================================================================================

    11.接口作为方法的参数和或返回值

    注意:List为一个接口

  • 相关阅读:
    SpringMVC日期类型转换问题三大处理方法归纳
    java 生成execl下载
    阿里maven仓库地址 和 oschina maven仓库地址
    hibernate基础学习
    学习struts2
    Linux下的/dev/sr0
    Oracle 19c(19.3) 单机数据库静默安装
    [转]Oracle 19C的下载和安装部署(图形安装和静默安装)
    CDH entropy was available 问题解决
    CDH当中NFS GATEWAY实例启动失败
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12402781.html
Copyright © 2011-2022 走看看