0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

static定义内部类

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-10 16:08 次阅读

1. static定义内部类

1.1 static定义内部类

如果说现在内部类上使用了static定义,那么这个内部类就变成了“外部类”,static定义的都是独立于类的结构,所以该类结构就相当于是一个独立的程序类了。需要注意,static定义的不管是类还是方法只能够访问static成员, 所以static定义的内部类只能够访问外部内中的static属性和方法

public class Outer {
    private static final String MSG = "哈哈";
    static class Inner{
        public void print(){
            System.out.println(Outer.MSG);
        }
    }
}

这个时候的Inner类是一个独立类 ,如果此时要想实例化Inner类对象,只需要根据“ 外部类.内部类 ”的结构实例化对象即可

格式如下 外部类.内部类 内部类对象 = new 外部类.内部类()

这个时候类名称带有“.”

我们现在实例化static内部类对象

public class Test {
    public static void main(String[] args) {
       Outer.Inner in = new Outer.Inner();
       in.print();
    }
}

输出结果是“haha”

所以以后如果发现类名称上提供有“.”,首先应该立刻想到这是一个内部类的结构,如果可以直接进行实例化,则应该立刻认识到这是一个static定义的内部类,但是static定义内部类的形式来讲并不常用, static定义内部接口的形式最为常用

1.2 static定义内部接口

上代码,注意内部接口IMessage和IChannel

public interface IMessageWarp {
    static interface  IMessage{
        public String getContent();
    }
 
    static interface IChannel{
        public boolean connect();  //消息的发送通道
    }
 
 
    //消息发送
    public static void send(IMessage msg,IChannel channel){
        if(channel.connect()){
            System.out.println(msg.getContent());
        }else{
            System.out.println("消息通道无法建立");
        }
    };   
}
public class DefaultMessage implements IMessageWarp.IMessage {
    @Override
    public String getContent() {
        return "哈哈";
    }
}
public class NetChannel implements IMessageWarp.IChannel{
    @Override
    public boolean connect() {
        return true;
    }
}
public class Test {
    public static void main(String[] args) {
        IMessageWarp.send(new DefaultMessage() , new NetChannel());
    }
}

之所以使用static定义的内部接口,主要是因为这些操作时属于一组相关的定义,有了外部接口之后可以更加明确的表述出这些接口的主要目的

2.方法中定义内部类

内部类可以在任意的结构中定义,这就包括了:类中、方法中、代码块中。但在方法中定义内部类的情况比较多。

public class Outer {
    private String msg = "haha";
    public void fun (long time){
        class Inner {    //内部类
            public void print(){
                System.out.println(Outer.this.msg);
                System.out.println(time);
            }
        }
        new Inner().print();    //方法中直接实例化内部类对象
    }
}
public class Test {
    public static void main(String[] args) {
        new Outer().fun(2390239023L);
    }
}

输出:haha 和 2390239023

此时在fun()方法内部提供有Inner内部类的定义,并且发现内部类可以直接访问外部类中的私有属性也可以直接访问方法中的参数,但对于方法中的参数直接访问时从JDK1.8开始支持的。而在JDK1.8之前**,如果方法中定义的内部类要想访问方法中的参数则参数前必须追加final。**

之所以取消这样的限制是为了扩展函数式编程准备的

3.匿名内部类

匿名类是一种简化的内部类的处理形式,其主要是在抽象类和接口的子类上使用的。

接口和抽象类是一样的

public interface IMessage {
    public void send(String str);
}
public class MessageImpl implements IMessage {
    @Override
    public void send(String str) {
        System.out.println(str);
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage msg = new MessageImpl();
        msg.send("哈哈");
 
    }
}

如果说现在IMessage接口中的MessageImpl子类只使用唯一的一次,那么是否还有必要将其定义为单独的类?那么在这样的要求下就发现这个时候定义的子类是有些多余了,所以就可以利用内部类的形式来解决此问题

public interface IMessage {
    public void send(String str);
}
public class Test {
    public static void main(String[] args) {
        IMessage msg = new IMessage() {
           @Override
            public void send(String str) {    //匿名内部类
                System.out.println(str);
            }
        };
        msg.send("哈哈");
    }
}

匿名内部类不一定要在抽象类或接口上,但只有在抽象类和接口上才有意义。有些时候为了更加方的体现出匿名内部类的使用,往往可以利用静态方法做一个内部类的匿名内部类实现

在接口中直接定义匿名内部类

public interface IMessage {
    public void send(String str);
}
public interface IMessage {
    public void send(String str);
 
    public static IMessage getInstance(){
        return new IMessage() {
            @Override
            public void send(String str) {
                System.out.println(str);
            }
        };
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage.getInstance().send("哈哈");
    }
}

与内部类相比匿名内部类只是一个没有名字的只能够使用一次的,并且结构固定的一个子类。

4.总结:

好了,内部类的使用就介绍完了,大家可以收藏起来,工作中肯定用得到。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8580

    浏览量

    151046
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81009
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10366
收藏 人收藏

    评论

    相关推荐

    ARM之静态变量简析

    静态变量的值可以一直保持到程序结束,使用关键字static可以将变量声明为静态的:static int x ;static float y;根据声明的位置不同,静态变量也可以分为内部类
    发表于 04-24 09:27

    接口、内部类和Java API基础

    理解接口的作用,理解接口和实现接口的类的关系,掌握声明接口、一个类实现多个接口的声明和使用方法。理解内嵌类型的概念,掌握声明内部类的方法。熟悉Java语言包和实用包中的常用类。
    发表于 11-23 11:52 0次下载

    java中static的作用及常见的误区

    。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。 这段话虽
    发表于 09-27 10:44 0次下载
    java中<b class='flag-5'>static</b>的作用及常见的误区

    java内部类分析详解

    可以将一个类的定义放在另一个类的定义内部,这就是内部类内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过
    发表于 09-27 14:59 0次下载

    java内部类怎么写

    一。内部类基础 二。深入理解内部类 三。内部类的使用场景和好处 四。常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正。 一。内部
    发表于 09-27 16:15 0次下载
    java<b class='flag-5'>内部类</b>怎么写

    java中static关键字的作用

    列举了一些面试笔试中常见的关于static的考题。 以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三。常见的笔试面试题 一.static关键字的用
    发表于 09-27 17:12 0次下载

    基于static变量来实现一个模块的封装

    static变量的一个显著的作用就是可以实现一个模块的封装。 static存储类别的特性决定了static声明的全局变量只能被本源文件的函数引用。当在一个源文件中定义一个
    的头像 发表于 01-05 10:54 5549次阅读
    基于<b class='flag-5'>static</b>变量来实现一个模块的封装

    为什么C++单例模式不能直接全部使用static变量和static函数呢?

    通过getInstance()函数获取单例对象,这种模式的关键之处不是在于强迫你用函数来获取对象。关键之处是让static对象定义在函数内部,变成局部static变量。看下这种实现方式
    的头像 发表于 06-05 14:14 1567次阅读

    Java内部类持有外部类导致内存泄露的原因以及其解决方案

    简介 为什么要持有外部类 实例:持有外部类 实例:不持有外部类 实例:内存泄露 不会内存泄露的方案 简介 「说明」 本文介绍 Java 内部类持有外
    的头像 发表于 10-08 16:32 973次阅读

    JAVA中static、final、static final如何区分

    当我们在使用java写类的属性时总会用到很多的类型去修饰它,比如字符串String,整数型int,但是我们偶尔也会遇到 static、final、static final,那么他们的区别是什么呢?
    的头像 发表于 02-14 14:55 1190次阅读
    JAVA中<b class='flag-5'>static</b>、final、<b class='flag-5'>static</b> final如何区分

    Java内部类使用不当导致的内存泄露问题及解决办法

    非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外
    的头像 发表于 05-18 16:09 1131次阅读
    Java<b class='flag-5'>内部类</b>使用不当导致的内存泄露问题及解决办法

    LL库中常见关键字__STATIC_INLINE

    LL库中常见关键字__STATIC_INLINE,其定义见cmsis_gcc.h
    的头像 发表于 07-24 11:30 1438次阅读
    LL库中常见关键字__<b class='flag-5'>STATIC</b>_INLINE

    如何在普通类中使用内部结构

    class Test { public static void main ( String [] args ) { Outer outer = new Outer(); outer.fun(); }} 创建外部类的实例调用外部类
    的头像 发表于 10-10 16:26 422次阅读

    Java中对static关键词的介绍

    static 是Java的一个关键字,可以用来修饰成员变量、修饰成员方法、构造静态代码块、实现静态导包以及实现静态内部类,下面我们来分别介绍。 1、修饰成员变量 用 static 修饰成员变量
    的头像 发表于 10-11 15:26 480次阅读
    Java中对<b class='flag-5'>static</b>关键词的介绍

    java内部类可以用public修饰吗

    Java的内部类是指一个类被定义在另一个类的内部。根据定义的位置和访问权限的不同,内部类可以分为四种:成员
    的头像 发表于 11-21 10:23 1188次阅读