首页 > 其他分享 >内部类

内部类

时间:2023-08-23 15:07:53浏览次数:16  
标签:内部 void public 匿名 new class

什么是内部类

将一个类A定义在一个类B里面,类A就称为内部类,类B称为外部类

内部类的分类

  • 成员内部类
  • 局部内部类
  • 匿名内部类

成员内部类

描述事物时,一个事物内部还包含其他事物,可以使用内部类这种结构。

成员内部类格式

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

成员内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 外部类要访问内部类的成员,必须要建立内部类的对象。

创建内部类对象格式

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

代码演示

  • 定义类
public class Person {

    private boolean live;

    public void setLive(boolean live) {
        this.live = live;
    }
    //内部类
    class Heart{
        public void jump(){
            
            //内部类可以直接访问外部类的成员,包括私有
            if (live){
                System.out.println("跳动");
            }else{
                System.out.println("停止跳动");
            }
        }
    }
}
  • 测试类
public class InnerDemo {
    public static void main(String[] args) {       
        //创建外部类对象
        Person p = new Person();
        p.setLive(true);

        //创建内部类对象
        Person.Heart heart = p.new Heart();

        //调用内部类方法
        heart.jump();
    }
}

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

局部内部类

什么是局部内部类

将一个类定义在一个方法中,该类就称之为是局部内部类

如何使用局部内部类

只能在该方法内部使用局部内部类

代码演示

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
    }
}

public class Outer {
    
    public void show(){
        // 局部内部类
        class Inner{
            public void method(){
                System.out.println("Inner 局部内部类的method方法执行了....");
            }
        }

        // 在外部类的方法内使用局部内部类
        Inner inner = new Inner();
        inner.method();
    }
}

匿名内部类

内部类的简化写法。本质是一个带具体实现的父类或者父接口的匿名的子类对象。 开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,

定义子类 实现接口
重写接口中的方法 
创建子类对象 
调用重写后的方法

使用匿名内部类的前提

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

匿名内部类的格式

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

匿名内部类的使用

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

定义接口

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

方式一 创建匿名内部类,并调用

public class InnerDemo {
    public static void main(String[] args) {
        //直接new接口,无需写实现类来实现接口
        new FlyAble(){
           //直接实现方法
            public void fly() {
                System.out.println("飞~~~");
            }
        }.fly();
    }
}

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

public class InnerDemo2 {
    public static void main(String[] args) {
        FlyAble f = new FlyAble(){
            //直接重写抽象方法
            public void fly(){
                System.out.println("我要飞,飞啊,飞,01");
            }
            @Override
            public void fly2() {
                System.out.println("我要飞,飞啊,飞,02");
            }
        };
        f.fly();
        f.fly2();
    }
}

方式三 匿名内部类调用

public class InnerDemo3 {
    public static void main(String[] args) {
        showFly(new FlyAble() {
            @Override
            public void fly() {
                System.out.println("~~~~~~~~~~~~~~~");
            }
            @Override
            public void fly2() {
                System.out.println("----------------");
            }
        });
    }
    public static void showFly(FlyAble f){
        f.fly();
        f.fly2();
    }
}

匿名内部类好处:就是可以不用再写一个实现类来实现接口,可以直接使用

标签:内部,void,public,匿名,new,class
From: https://blog.51cto.com/u_16228964/7202813

相关文章

  • 标准款iPhone15配色方案曝光,内部硬件设计更为紧凑
    #01iPhone15内部元件今年iPhone15系列的保密工作苹果做得依然比较差,现在距离新机发布还剩下三周左右的时间,继USB-C接口元器件实物后,现在又有一些iPhone15内部元件遭到曝光。▲USB-C与Lightning接口对比爆料者MajinBu在X(原Twitter)平台分享了几张据称是iPhone15......
  • 制作一个内部的 zabbix-agent 快速部署脚本
    下载官方的基础agent部署包官方地址:点击到达curl-Ohttps://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.36/zabbix_agent-5.0.36-linux-3.0-i386-static.tar.gz编写install脚本#!/bin/bash##变量定义#脚本所在路径BASE_DIR=$(cd$(dirname$0);pwd)#Zabbix......
  • 【数据结构】排序 内部排序算法的比较和应用
    1.简单复习一下前面学到的排序算法三种插入排序:直接插入:依次将后面无序序列中头部的元素插入前面的有序序列中(找到插入位置,这个位置后面的元素一律后移)折半插入:相比直接插入只是用折半查找的方式查找插入位置,元素的移动操作不变希尔排序:把相隔一定步长d的元素放入一个子表......
  • SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter
    WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口,重写了一些方法,也就是默认对SpringMvc进行了一些配置:该静态类上有个**@Import**注解:@Import(EnableWebMvcConfiguration.class)它的父类DelegatingWebMvcConfiguration,通过注入......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • new对象时内部做了什么?
    1.创建一个新对象;2.该对象执行[[Prototype]](即__proto__)链接;3.将构造函数的作用域赋值给新对象(this指向该新对象);4.执行构造函数中的代码(给该对象添加属性、方法);5.若无显式返回对象或函数,才返回新对象。 functionnewFn(fn,...args){//1.创建一个新对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......