IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【JavaSE】玩转内部类--内部类的分类及其不为人知的细节 -> 正文阅读

[Java知识库]【JavaSE】玩转内部类--内部类的分类及其不为人知的细节

一、内部类的概念

内部类的是定义在另一个类中的类

一般分为:

  1. 本地内部类
  2. 实例内部类
  3. 静态内部类
  4. 匿名内部类

二、内部类的分类

1.本地内部类

定义在方法当中的类。

public class TestDemo {
    public void func(){
        class  Test{
            public int a;
        }
        //缺点:只能在当前方法中使用——本地内部类,定义在方法内部的类
    }

本地内部类,我们用得比较少,我们写本地内部类的时候一定要谨慎。

同时,本地内部类有一个很大的缺点:只能在当前方法中使用。

2.实例内部类

实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。

简单示例如下:

public class OuterClass {
    class InnerClass {
        // 实例内部类
    }
}

上面的InnerClass就是实力内部类了。

实例内部类的注意事项有以下几点,我们通过实例来一一了解:

  1. 在实例内部类中不能定义一个静态的成员变量,如果非要定义,只能定义一个静态常量,也就是用final修饰。
class OuterClass{//定义了一个普通类
    //实例内部类,可以把他当作外部类的一个普通实例的成员
    class InnerClass{
        public int data4=4;
        private int data5 = 5;
        //public static int data6 = 6; //err,不能定义静态成员变量,因为如果一个东西是静态的,它是属于类的,不属于对象的
        //加final就可以,因为加了final,它就变成了一个静态常量
        public static final int data6 = 6;
        }
     }
  1. 我们如何实例化 实例内部类的对象?

外部类名.内部类名 变量 = 外部类对象的引用.new 内部类();

class OuterClass{//定义了一个普通类
    //实例内部类,可以把他当作外部类的一个普通实例的成员
    class InnerClass{
        public int data4=4;
        private int data5 = 5;
        //public static int data6 = 6; //err,不能定义静态成员变量,因为如果一个东西是静态的,它是属于类的,不属于对象的
        //加final就可以,因为加了final,它就变成了一个静态常量
        public static final int data6 = 6;
        }
     }

public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        //OuterClass.InnerClass innerClass = new OuterClass.InnerClass();//ERR ,直接new是不能编译通过
        //需要外部类对象的引用才能实例化一个内部类对象
        OuterClass.InnerClass innerClass =  outerClass.new InnerClass();
    }
  1. 实例内部类当中,如果包含了和外部类同名的成员变量,我们如何在实例内部类中访问?

我们可以通过外部类的this来访问。注意:我们实例内部类当中包含了两个this,一个是外部类的this,一个是内部类的this。

//实例内部类
class OuterClass{//定义了一个普通类
    public int data1= 1;

    //实例内部类,可以把他当作外部类的一个普通实例的成员
    class InnerClass{
        public int data1=999;
        public InnerClass(){
            System.out.println("不带参数的内部类构造方法");
        }
        public void test(){
            System.out.println(OuterClass.this.data1);//1
            System.out.println(this.data1);//999
        }

    }
}


public class TestDemo {
    public static void main(String[] args) {
    //创建内部类对象分两步,1:
        OuterClass outerClass = new OuterClass();
//2.实例化一个内部类对象
        OuterClass.InnerClass innerClass =  outerClass.new InnerClass();
        innerClass.test();
    }
}

在这里插入图片描述

3.静态内部类

实例内部类是指用 static 修饰的内部类

public class OuterClass {
    static class InnerClass {
        // 静态内部类
    }
}

静态内部类的一些问题:

  1. 如何访问外部类的普通成员变量?

静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。

 class OuterClass2{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    //静态内部类
    static class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

        //写一个构造方法
        public OuterClass2 out;
        public InnerClass(OuterClass2 out){
            this.out = out;
        }

        public void test(){
            //System.out.println(data1); //err
            System.out.println(out.data1);
            //System.out.println(data2);//err
            //System.out.println(new OuterClass2().data2); //由于是私有的,访问不了,要访问,只能提供get()和set()方法了
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("InnerClass::test()");
        }
    }
  1. 如何实例化静态成员变量?

外部类名.内部类名 变量 =new 外部类对象的引用.内部类(变量);

public static void main(String[] args) {
//这里有两步 
//1.实例化外部类类对象
        OuterClass2 outerClass2 = new OuterClass2();
//2.通过外部类对象的引用实例化一个内部类对象
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(outerClass2);
        innerClass.test();
    }

打印结果:

在这里插入图片描述

3.匿名内部类

名内部类就是一个没有显式的名字的内部类。
匿名内部类没有类名,因此就不可能有构造函数,不能创建对象。

语法一:

new 实现接口()
{
    //匿名内部类类体部分
}

语法二:

new 父类构造器(实参列表)
{
  //匿名内部类类体部分
}

实例:

class Test{
    public void test(){
        System.out.println("test()haha!");
    }
}

public class TestDemo2 {
    public static void main(String[] args) {
        new Test(){
            @Override
            public void test(){
                System.out.println("我是重写的test方法");
            }
        }.test();//调用test()方法
    }

就是定义了一个类Test,在类里定义了一个test方法。调用他的实例方法test()。

然后调用它的test()方法。

在调用test()方法的同时,重写了test()方法,所以打印结果为:我是重写的test方法。

输出结果:
在这里插入图片描述
所以,匿名内部类的最大好处就是可以简化我们代码的书写。


总结

为什么需要使用内部类呢? 其主要原因有以下三点:
?内部类方法可以访问该类定义所在的作用域中的数据, 包括私有的数据。

?内部类可以对同一个包中的其他类隐藏起来。

?当想要定义一个回调函数且不想编写大量代码时,使用匿名 (anonymous) 内部类比较便捷。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:59:56  更:2022-03-11 22:03:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:50:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码