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知识库 -> Java面向对象(OOP)--内部类(成员内部类) -> 正文阅读

[Java知识库]Java面向对象(OOP)--内部类(成员内部类)

1. 内部类

很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了


1.1 内部类概述

  • 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
  • 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我可以把外边的类称为外部类,在其内部编写的类称为内部类。
  • 内部类分为四种:
    • 成员内部类
    • 静态内部类
    • 局部内部类
    • 匿名内部类

1.2 成员内部类(实例内部类、非静态内部类)

注:成员内部类中不能写静态属性和方法


1.2.1 【定义一个内部类】

//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
    private int id;

    class Inner {
        public void in() {
            System.out.println("这是内部类方法");
        }
    }

    public void out() {
        System.out.println("这是外部类方法");
    }
}

1.2.2【实例化内部类】

实例化内部类,首先需要实例化外部类,通过外部类去调用内部类

// 代码接上
class Test {
    public static void main(String[] args) {
        //实例化成员内部类分两步
        //1、实例化外部类
        Outer outObject = new Outer();
        //2、通过外部类调用内部类
        Outer.Inner inObject = outObject.new Inner();
        //测试,调用内部类中的方法
        inObject.in();//打印:这是内部类方法
    }
}

在这里插入图片描述

分析:
想想如果你要使用一个类中方法或者属性,你就必须要先有该类的一个对象,同理,一个类在另一个类的内部,那么想要使用这个内部类,就必须先要有外部类的一个实例对象,然后在通过该对象去使用内部类。


1.2.3 【成员内部类能干什么?】

  1. 访问外部类的所有属性(这里的属性包括私有的成员变量,方法)
//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
    private String id = "11923020124";

    class Inner {
        public void in() {
            System.out.println("这是内部类方法");
        }

        //内部类访问外部类私有的成员变量
        public void getId() {
            System.out.println("id: " + id);
        }

        public void useOut() {
            out();
        }
    }

    public void out() {
        System.out.println("这是外部类方法");
    }
}

class Test {


    public static void main(String[] args) {
        //实例化成员内部类分两步
        //1、实例化外部类
        Outer outObject = new Outer();
        //2、通过外部类调用内部类
        Outer.Inner inObject = outObject.new Inner();
        //测试,调用内部类中的方法
        inObject.in();//打印:这是内部类方法
        inObject.getId();
        inObject.useOut();
    }
}

在这里插入图片描述

如果内部类中的变量名和外部类的成员变量名一样,要通过创建外部类对象 "."属性来访问外部类属性,通过this.属性访问内部类成员属性

//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
    private String id = "Outer Id";

    class Inner {
        private String id = "Inner Id"; //这个id跟外部类的属性id名称一样。

        public void getInnerId() {
            System.out.println(id);//输出Inner Id,内部类中的变量会暂时将外部类的成员变量给隐藏
        }

        public void getOuterId() {
            System.out.println(Outer.this.id);//输出Outer Id,内部类中的变量会暂时将外部类的成员变量给隐藏
        }
    }

    public void out() {
        System.out.println("这是外部类方法");
    }
}

class Test {
    public static void main(String[] args) {
        //实例化成员内部类分两步
        //1、实例化外部类
        Outer outObject = new Outer();
        //2、通过外部类调用内部类
        Outer.Inner inObject = outObject.new Inner();
        //测试,调用内部类中的方法
        inObject.getInnerId();
        inObject.getOuterId();
    }
}

在这里插入图片描述

说明:

如何调用外部类的成员变量呢?通过Outer.this,因为如果想实例化内部类对象,就必须通过外部类对象,当外部类对象new出内部类对象时,会把自己(外部类对象)的引用传到了内部类中,所以内部类就可以通过Outer.this来访问外部类的属性和方法,到这里,你也就可以知道为什么内部类可以访问外部类 的属性和方法,这里由于有两个相同的属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名 不重复,那么我们在内部类中调用外部类的属性和方法时,前面就隐式的调用了Outer.this。


1.2.4 借助成员内部类,来总结内部类(包括4种内部类)的通用用法:

  1. 要想访问内部类中的内容,必须通过外部类对象来实例化内部类。
  2. 能够访问外部类所有的属性和方法,原理就是在通过外部类对象实例化内部类对象时,外部类对象把自己的引用传进了内部类,使内部类可以用通过Outer.this去调用外部类的属性和方法,一般都是隐式调用了,但是当内部类中有属性或者方法名和外部类中的属性或方法名相同的时候,就需要通过显式调用Outer.this了。


  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:01:36  更:2021-08-03 11:01:52 
 
开发: 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年5日历 -2024/5/3 21:07:23-

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