文档章节

Java中的4种内部类

吴伟祥
 吴伟祥
发布于 2017/08/17 16:32
字数 975
阅读 7
收藏 0

Java的四种内部类包括如下:

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

 

1. 成员内部类:作为类的成员,存在于某个类的内部。
  成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。

public class Outter1 {
    private static int a = 1;
    private int b = 3;

    private static void test1() {
        System.out.println("调用外部类的静态方法");
    }

    private void test2() {
        System.out.println("调用外部类的非静态方法");
    }

    class Inner {
        void test() {
            System.out.println("在成员内部类的方法中");
            test1();//调用外部类的静态方法
            test2();//调用外部类的非静态方法
            System.out.println(a + b);//访问外部类的静态成员变量和非静态成员变量
        }
    }

    public static void main(String[] args) {
        //Inner in=new Inner();成员内部类的对象不能直接创建,会报错
        Outter1 out = new Outter1();//先创建外部类的对象
        Inner in = out.new Inner();//注意:!!成员内部类的对象必须通过外部类的对象创建
        in.test();
    }
}

Console:
在成员内部类的方法中
调用外部类的静态方法
调用外部类的非静态方法
4

 

2.静态内部类:作为类的静态成员,存在于某个类的内部。
  静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,可以直接创建静态内部类的对象。静态内部类可以引用外部类的静态成员变量和静态方法,但不能引用外部类的普通成员。

public class Outter {
    static int a=1;
    int b=5;
    static void test(){
        System.out.println("外部类的静态方法");
    }
    static class Inner{
        public void test2(){
            System.out.println("a的值为"+a);;//直接引用外部类的静态成员变量
            test();//直接引用外部类的静态方法
            //b++;试图引用外部类的非静态成员变量,不能通过编译
            System.out.println("静态内部类的方法");
        }
    }
    public static void main(String[] args) {
        Inner in=new Inner();//静态内部类的对象可以直接创建,无需先创建外部类的对象
        in.test2();
    }
}

 

3.局部内部类:存在于某个方法的内部。
  局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存中删除。
  必须注意:如果局部内部类中要使用他所在方法中的局部变量,那么就需要将这个局部变量定义为final的。

public class Outter2 {
    int a = 10;
    public void test() {
        final int c = 5;
        System.out.println("在外部类的方法中");
        class Inner {
            int b = 20;
            void test1() {
                System.out.println("局部内部类的方法中");
                System.out.println(c);//注意:如果局部内部类中要使用他所在方法中的局部变量,那么就需要将这个局部变量定义为final的。
            }
        }
        Inner inner = new Inner();
        inner.test1();
    }

    public static void main(String[] args) {
        Outter2 outter = new Outter2();
        outter.test();
    }
}

 

4.匿名内部类:存在于某个类的内部,但是无类名的类。

  匿名内部类的定义与对象的创建合并在一起,匿名内部类一般通过如下形式定义,并且在定义的同时进行对象的实例化。

 

              new 类或者接口的名字(){

      //匿名内部类的主体,大括号中是匿名内部类的主体,这个主体就是类或者接口的实现,如果是类,那么匿名内部类是该类的子类,如果是接口,匿名内部类需要完成接口的实现。

             }

class Person {
    public void show(Message message) {
        message.show();
    }
}

class Message {
    public void show() {
        System.out.println("在Message类中");
    }
}

public class Outter3 {
    public static void main(String[] args) {
        Person person = new Person();
        person.show(new Message() {
            public void show() {
                System.out.println("在匿名内部类中");
            }
        });
    }
}

 java中绝大多数情况下,类的访问修饰符只有public和默认这两种,但也有例外。静态内部类和成员内部类还可以有protected和private两种

© 著作权归作者所有

吴伟祥

吴伟祥

粉丝 31
博文 483
码字总数 284123
作品 0
泉州
后端工程师
私信 提问
【Scala】Scala高级使用技巧之一

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/82110617 1、Scaladoc的使用 Scaladoc是Scala的API文档,包含了Scala所有的A...

魏晓蕾
2018/08/27
0
0
强引用、软引用、弱引用、虚引用的概念

强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: 1 2 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存...

天王盖地虎626
06/19
34
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
在 Java 中初始化 List 的五种方法

在 Java 中初始化 的五种方法 1.构造 后使用 初始化 2.使用 双括号语法 3.使用 4. 使用 (JDK8) 5. 使用 (JDK9) 参考 在 Java 中初始化 的五种方法 Java 中经常需要使用到 List,下面简单介...

yzbyzz
2018/12/05
0
0
Java入门需掌握的30个基本概念

(1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。 (2)分布...

风一样
2011/08/03
38
0

没有更多内容

加载失败,请刷新页面

加载更多

排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
29分钟前
3
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部