浅谈Java内部类——静态内部类

 更新时间:2020年08月21日 10:23:45   作者:弗兰克的猫  
这篇文章主要介绍了Java静态内部类的相关资料,帮助大家更好的理解和学习Java内部类的相关知识,感兴趣的朋友可以了解下

  今天来说说Java中的最后一种内部类——静态内部类

  所谓的静态内部类,自然就是用static修饰的内部类,那用static修饰过后的内部类,跟一般的内部类相比有什么特别的地方呢?

  首先,它是静态的,这就意味着它的创建不依赖于外部类,创建内部类的实例不需要像普通内部类一样先创建外部类实例才能创建。

  其次,有优势必然有劣势,它不能像普通内部类一样无限制的访问外部类的方法和成员变量,只能访问静态成员变量和静态方法。

  话不多说,先来看个栗子:

public class StaticInnerClass {

  //外部类的非静态成员
  private int numA = 1;

  //外部类的静态成员
  private static int numB = 2;

  //静态内部类
  static class Inner {
    //内部类的非静态成员
    private int numC = 3;
    //内部类的静态成员
    private static int numD = 4;

    public void printInner(){
      System.out.println("printInner");
      System.out.println(numB);//访问外部类的静态成员
      System.out.println(numC);//访问内部类的非静态成员
      System.out.println(numD);//访问内部类的静态成员
    }
  }

  //外部类的普通成员方法
  public void printOuter(){
    System.out.println("printOuter");
  }

  public static void main(String[] args) {
    StaticInnerClass outer = new StaticInnerClass();
    outer.printOuter();
    Inner inner = new StaticInnerClass.Inner();
    inner.printInner();
    System.out.println(StaticInnerClass.numB);
    System.out.println(Inner.numD);
  }
}

  输出如下:

printOuter
printInner
2
3
4
2
4

  看起来,内部类跟外部类的使用上是差不多的,更像是一个暂存在外部类中的一个类,跟外部类并没有什么太多本质上的联系,但是创建的时候需要使用Outer.Inner的方式来定义,就像给类加了一个命名空间一样。

  再举个栗子来看看静态内部类和非静态内部类的区别:(知乎上看到的一段话,觉得比喻比较形象)

如果把类比喻成鸡蛋,内部类为蛋,,外部类是蛋壳。那么静态类相当于熟鸡蛋,就算蛋壳破碎(外部类没有实例化),蛋黄依然完好(内部类可以实例化);而非静态类相当于生鸡蛋,蛋壳破碎(无实例化),蛋黄也会跟着xx(不能实例化)。

  至于原因?其实就是因为非静态内部类中保存有外部类的指针,所以可以无限制访问外部类的所有属性,而静态内部类则没有,所以静态内部类无法访问外部类的非静态成员和方法,仅仅是借用一下它的壳而已。

  再来看一个栗子:

public class Caculate {

  //定义一个pair类来将两个数捆绑
  static class Pair{
    private int first;
    private int second;

    public Pair(int first, int second) {
      this.first = first;
      this.second = second;
    }

    public int getFirst() {
      return first;
    }

    public int getSecond() {
      return second;
    }
  }

  //获取一个int数组中的最大和最小值
  public static Pair getMaxMin(int[] values){
    int max = Integer.MIN_VALUE;
    int min = Integer.MAX_VALUE;
    for (int i:values){
      if (min > i) min = i;
      if (max < i) max = i;
    }
    return new Pair(min,max);
  }

  public static void main(String[] args){
    int[] list = {1,3,5,2,77,23,25};
    Caculate.Pair pair = Caculate.getMaxMin(list);
    System.out.println(pair.getFirst());
    System.out.println(pair.getSecond());
    System.out.println(pair.first);
    System.out.println(pair.second);
  }
}

  这里getMaxMin里需要一次返回两个值,所以用了一个Pair类来将两个数捆绑到一起,而因为这个类只在Caculate类中使用,而且两者并没有依赖关系,所以这里使用静态内部类是最合适的。

  静态内部类还有很多适用的场景,这就需要大家在今后的使用中慢慢体会了。

  至此,本篇讲解完毕,欢迎大家继续关注。

以上就是浅谈Java内部类——静态内部类的详细内容,更多关于Java 静态内部类的资料请关注脚本之家其它相关文章!

相关文章

  • Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 下面通过本文给大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友参考下吧
    2017-06-06
  • 静态方法中调用Spring注入过程解析

    静态方法中调用Spring注入过程解析

    这篇文章主要介绍了静态方法中调用Spring注入过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • mybatisPlus自动填充更新时间的示例代码

    mybatisPlus自动填充更新时间的示例代码

    本文主要介绍了mybatisPlus自动填充更新时间,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java稀疏数组详细图文教程

    Java稀疏数组详细图文教程

    当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩,这篇文章主要给大家介绍了关于Java稀疏数组的相关资料,需要的朋友可以参考下
    2023-09-09
  • idea类名显示多行的设置方式

    idea类名显示多行的设置方式

    在IntelliJ IDEA中,类名的显示方式可以通过设置来调整,若想设置为单行显示,需在设置中找到相关选项并勾选“√”,若需多行显示,则取消勾选即可,此操作有助于优化代码视图,提升开发效率
    2024-09-09
  • SpringDataJpa创建联合索引的实现

    SpringDataJpa创建联合索引的实现

    这篇文章主要介绍了SpringDataJpa创建联合索引的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中Class类的作用与深入理解

    Java中Class类的作用与深入理解

    这篇文章主要介绍了Java中Class类的作用与深入理解的相关资料,希望通过本文能帮助到大家让大家理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • SpringMVC 方法四种类型返回值总结(你用过几种)

    SpringMVC 方法四种类型返回值总结(你用过几种)

    这篇文章主要介绍了SpringMVC 方法四种类型返回值总结(你用过几种),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 并发编程ConcurrentLinkedQueue示例详解

    并发编程ConcurrentLinkedQueue示例详解

    这篇文章主要为大家介绍了并发编程ConcurrentLinkedQueue使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java 基础语法让你弄懂类和对象

    Java 基础语法让你弄懂类和对象

    C 语言是面向过程的,而 Java 是面向对象是我们常听到的一句话,这章将带你揭晓Java 基础语法中类与对象到底是什么,需要的朋友请参考下文
    2021-08-08

最新评论