Java中的4种内部类 原

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两种

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏锦小年的博客

python学习笔记2.6-集合(set)

一般来说,python中常用的数据结构是:列表(list)、字典(Dict)、元组(tuple)。但是我们常常还会看到另外一种结构:集合(set)。 个人认...

22670
来自专栏星汉技术

Scala的函数

30340
来自专栏进击的君君的前端之路

数据类型、运算符、流程控制语句

18940
来自专栏乐百川的学习频道

Golang学习笔记 数据类型和变量

数据类型 先来介绍一下Golang的数据类型。 布尔型 bool类型代表逻辑值,有真值true和假值false两种取值。 整数类型 整数类型有如下几种,这些整数...

21280
来自专栏微信公众号:Java团长

Java:类与继承

  对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础。抽象、封装、继承、多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来...

10710
来自专栏北京马哥教育

Python Re 模块最全解读: 11703 字帮你彻底掌握

re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA...

347100
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(三) 数据类型

正文之前 Java的面向对象特性太明显了。先开篇告诉你我们的对象是啥意思,然后直截了当的告诉你,每个文件都是一个类。也就是说每个文件都可以给你传出来一种对象,然...

36140
来自专栏鸿的学习笔记

Python和Scala的操作符

在聊完类和对象之后,我们要理解一件事,无论是在Scala还是Python,每一个值都是对象,在某种程度上来说,这两门语言都是更加纯粹的面向对象的语言。两者也都支...

6820
来自专栏Java帮帮-微信公众号-技术文章全总结

String中的null,以及String s;等区别详解

1、判断一个引用类型数据是否null。 用==来判断。 2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM...

38440
来自专栏V站

PHP常用系统内置函数,收藏以后别折磨自己写函数类了

16090

扫码关注云+社区

领取腾讯云代金券