Java教程

二十六、内部类

本文主要是介绍二十六、内部类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、概述

什么是内部类?将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类,B 则称为外部类

2、成员内部类

引入: 在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类Car 中包含发动机类Engine ,这时,Engine 就可以使用内部类来描述,定义在成员位置。

成员内部类: 定义在类中方法外的类,叫做成员内部类。

定义格式:

class 外部类{
    class 内部类{...}
    ...
}

3、成员内部类访问特点

创建内部类对象格式:外部类.内部类 对象名 = new 外部类().new 内部类();

访问演示,代码如下:

【定义类】
public class Person {
    private  boolean live = true;
    private int rate = 60
        
    public void show(){   // 外部类获取内部类变量
        Heart h = new Heart();
        h.rate;
    }    
        
    class Heart {
        private int rate = 75; 
        
        public void jump() {
            int rate = 100;
            // 直接访问外部类成员
            if (live) {
                
                System.out.println(rate);   // 方法中变量访问
                System.out.println(this.rate);  // 内部类中变量访问
                System.out.println(Person.rate); // 外部类中变量访问
                
                System.out.println("心脏在跳动");
            } else {
                System.out.println("心脏不跳了");
            }
        }
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }
}

【定义测试类】
public class InnerDemo {
    public static void main(String[] args) {
        // 创建外部类对象 
        Person p  = new Person();
        // 创建内部类对象
        Person.Heart heart = p.new Heart();
        // 调用内部类方法
        heart.jump();
        // 调用外部类方法
        p.setLive(false);
        // 调用内部类方法
        heart.jump();
    }
}
/*
输出结果:
心脏在跳动
心脏不跳了
*/

内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的 .class 文件,但是前面冠以外部类的类名和$符号。 比如:Person$Heart.class

访问特点:

  • 内部类可以直接访问外部类的成员,包括私有成员
  • 外部类访问内部类的成员,必须要建立内部类的对象
  • 局部变量直接访问;内部类用 this 访问;外部类用 类名.this 访问

4、局部内部类/匿名内部类

4.1、匿名内部类介绍

  1. 匿名内部类是一个非常特殊的内部类,从命名可以看出,匿名内部类是没有类名的,因此这个内部类只能用一次。
  2. 使用场景?匿名内部类一般用于简化代码,当要快速实现一个抽象类或者接口的抽象方法时,我们就可以使用匿名内部类来简化,可以不用专名定义一个有名类来操作。
  3. 由上述可知,要使用匿名内部类,必须要有一个父类或者父接口

4.2、定义格式

new 类名/接口(){
    //如果父类型有抽象方法,需要全部重写
}

特点分析:

  1. 该匿名内部类 {} 就是某一个类或接口的实现类(子类)
  2. 整体创建的是子类对象!!!

4.3、匿名内部类的使用

  1. 直接调用方法
  2. 作为方法参数传递
  3. 作为方法的返回值

接口:

interface Flyable{
    void fly();
}

① 直接调用方法

new Flyable(){
    @Override
    public void fly(){
        System.out.println("不知道什么在飞111111");
    }
}.fly();

② 当做方法的参数传递

public static void showFlyable(Flyable flyable){
    flyable.fly();
}
showFlyable(new Flyable(){
    @Override
    public void fly(){
        System.out.println("不知道什么在飞22222222");
    }
})

③ 当做方法的返回值使用

public static Flyable getFlyable(){
    return new Flyable(){
        @Override
        public void fly(){
            System.out.println("不知道什么在飞333333");
        }
    }
}
这篇关于二十六、内部类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!