开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java内部类

简介: Java内部类
+关注继续查看

内部类


前导知识:权限修饰符(包括default),不了解的小伙伴们可以参考一下这一篇博客:

https://yangyongli.blog.csdn.net/article/details/117806416


1.1 概述


什么是内部类?


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


成员内部类


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


定义格式:


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


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


代码举例:


class Car { //外部类
    class Engine { //内部类
    }
}


访问特点


  • 内部类可以直接访问外部类的成员,包括私有成员。


  • 外部类要访问内部类的成员,必须要建立内部类的对象。


创建内部类对象格式:


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


访问演示,代码如下:


定义类:


public class Person {
    private boolean live = true;
    class Heart {
        public void jump() {
            // 直接访问外部类成员
            if (live) {
                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();
        // 创建内部类对象
        Heart heart = p.new Heart();
        // 调用内部类方法
        heart.jump();
        // 调用外部类方法
        p.setLive(false);
        // 调用内部类方法
        heart.jump();
    }
}


输出结果:


心脏在跳动
心脏不跳了


注意


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


比如上述小案例:


Person$Heart.class


1.2 匿名内部类【重点】


匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。


开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,


  1. 定义子类


  1. 重写接口中的方法


  1. 创建子类对象


  1. 调用重写后的方法


我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。


使用前提


匿名内部类必须继承一个父类或者实现一个父接口。


使用格式


new 父类名或者接口名(){
    // 方法重写
    @Override
    public void method() {
        // 执行语句
    }
};


使用方式


以接口为例,匿名内部类的使用,代码如下:


定义接口:


public abstract class FlyAble{
    public abstract void fly();
}


创建匿名内部类,并调用:


public class InnerDemo {
    public static void main(String[] args) {
        /*
        1.等号右边:是匿名内部类,定义并创建该接口的子类对象
        2.等号左边:是多态赋值,接口类型引用指向子类对象
        */
        FlyAble f = new FlyAble(){
            public void fly() {
                System.out.println("我飞了,哈哈哈~~~");
            }
        };
        //调用 fly方法,执行重写后的方法
        f.fly();
    }
}


通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下:


public class InnerDemo2 {
    public static void main(String[] args) {
        /*
        1.等号右边:定义并创建该接口的子类对象
        2.等号左边:是多态,接口类型引用指向子类对象
        */
        FlyAble f = new FlyAble(){
            public void fly() {
                System.out.println("我飞了~~~");
            }
        };
        // 将f传递给showFly方法中
        showFly(f);
    }
    public static void showFly(FlyAble f) {
        f.fly();
    }
}


以上两步,也可以简化为一步(有点像js),代码如下:


public class InnerDemo3 {

    public static void main(String[] args) {
        /*
        创建匿名内部类,直接传递给showFly(FlyAble f)
        */
        showFly(new FlyAble(){
            public void fly() {
                System.out.println("我飞了~~~");
            }
        });
    }
    public static void showFly(FlyAble f) {
        f.fly();
    }
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JAVA内部类详解
JAVA内部类详解
17 0
Java - 内部类
Java - 内部类
8 0
你不知道的Java内部类
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
9 0
Java内部类详解
Java内部类详解     原文链接:http://www.cnblogs.com/dolphin0520/p/3811445.html   说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。
866 0
Java 中的内部类
什么是 Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。 问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!! 答:内部类的主要作用如下: 1.
782 0
java内部类
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变量 3 private int x=1; 4 //定义外部类函数 5 public void methodOut(){ 6 System.
593 0
Java内部类
基本概念 内部类:是指把一个类的声明放到另一个类的声明中,甚至是放到一个方法内部,这样的类称为 内部类。 内部类分为 命名内部类和匿名内部类: 命名内部类:就像平时声明一个类一样,有个名字。
684 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载