详解static 和 final 和 static final区别

 更新时间:2019年04月09日 10:14:13   作者:HA_Tinker  
这篇文章主要介绍了static 和 final 和 static final区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类。

1.修饰变量。

得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都指向同一个地址。

因此我们使用该变量的时候,直接指明类的静态变量,当然修饰符必须 public

public class StaticBean {
   public static String A = "A";
 }

使用方式

 public static void main(String[] args) throws Exception{
    System.out.println(StaticBean.A);
  }

2.修饰程序块,猜猜输出结果是什么?。

public class BaseTest {
  
  static{
    System.out.println("B");
  }

  public static void main(String[] args) throws Exception{
    System.out.println("A");
  }
}

结论:JVM就会优先加载静态块中代码,因此会优先输出B,static 修饰代码块,这主要用于系统初始化。

B
A

3.修饰方法:在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象,静态方法在访问本类的成员时,只允许访问静态成员,而不允许访问实例成员变量和实例方法。

public class StaticBean {
  public static String A = "A";
  public String D;
  public static void getMessage(){
    System.out.println(A);
    System.out.println(D);
  }
}

上面代码,哪句是错误的,很显然。

System.out.println(D);

4.修饰类。在我们的熟知之中,static 修饰符一般用于修饰变量,程序块,方法,但是什么时候使用static来修饰类呢?

内部类。如果在外部类声明为static,程序会编译都不会过。

内部类特点如下:

  1. 1.不持有外部类的引用(普通内部类持有)
  2. 2.可以直接创建实例,不需要先创建外部类(普通内部类需要)
  3. 3.可以有静态成员变量、方法(普通内部类不行)和非静态成员变量、方法
  4. 4.只可以直接访问外部类静态成员,不可以直接访问外部类的非静态成员(普通内部类可以),需要通过传入外部类引用的方式才能访问
  5. 5.加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生

那就很简单引出,什么时候会使用静态内部类呢? 我们来看下以下一个例子

public class Outer {
  private int i = 0;

  public Outer() {
    i++;
    System.out.println("=====init Outer "+i+"====");

  }

  public static Outer getInstance(){
    return Inner.INSTANCE;
  }
  //静态内部类
  public static class Inner{
    private static final Outer INSTANCE = new Outer();
  }
}

调用方

public class BaseTest {
  public static void main(String[] args) throws Exception{
    for(int i = 0; i < 1000;i++) {
      Outer.getInstance();
    }
  }
}

输出结果:

=====init Outer 1====

 我们总结下:

由于 INSTANCE 是常量,因此只能赋值一次;它还是静态的,因此随着内部类一起加载,这种也是单例懒汉模式的一种实现方式,同时保证了线程安全。

final 关键字可以用来修饰类,方法和变量

1.修饰类

表示该类不允许被继承,final类中的成员方法都会被隐式的指定为final方法。

public final class FinalBean {

  public void test(){

  }
}

2.修饰方法

表示该方法不能被重写,一个类的private方法会隐式的被指定为final方法。

以下例子SunFinalBean的test方法报错。

public class FinalBean {

  public final void test(){

  }

  public class SunFinalBean extends FinalBean{
    public void test(){
      
    }
  }
}

3.修饰变量

表示该变量必须初始化,且值不能改变。如果是基本类型则值不能改变,如果是引用类型,则引用地址不能改变,但是这个引用所指向的对象里面的内容还是可以改变的。

 猜猜看,以下那句通不过编译器编译。

public class FinalBean {
  private final int i = 0;
  private final int j;
  private final String name = "";

  public FinalBean(){
    j = 1;
    this.name.concat("123");
    this.name = "123";
  }
}

这句,记住final的原理即可理解,那为什么this.name.concat("123");不会报错呢,因为底层实现是返回一个新的String对象

this.name = "123";

那static final 一起用:

static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。

static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。

以上所述是小编给大家介绍的static 和 final 和 static final区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 关于Java8新特性Optional类的详细解读

    关于Java8新特性Optional类的详细解读

    Optional类是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在,原来用 null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常,需要的朋友可以参考下
    2023-05-05
  • Java中Array List与Linked List的实现分析

    Java中Array List与Linked List的实现分析

    这篇文章主要给大家介绍了关于Array List与Linked List实现的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java对象比较之equals与hashCode详解

    Java对象比较之equals与hashCode详解

    这篇文章主要介绍了Java对象比较之equals与hashCode详解,equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等,需要的朋友可以参考下
    2023-12-12
  • 使用Java实现系统托盘功能的介绍(附源码以及截图)

    使用Java实现系统托盘功能的介绍(附源码以及截图)

    本篇文章介绍了,在Java中实现系统托盘功能的详解,文中附源码以及截图介绍。需要的朋友参考下
    2013-05-05
  • Java代理模式详细解析

    Java代理模式详细解析

    这篇文章主要为大家详细介绍了Java代理模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 布隆过滤器面试如何快速判断元素是否在集合里

    布隆过滤器面试如何快速判断元素是否在集合里

    这篇文章主要为大家介绍了布隆过滤器面试中如何快速判断元素是否在集合里的完美回复,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • java编程之AC自动机工作原理与实现代码

    java编程之AC自动机工作原理与实现代码

    这篇文章主要介绍了java编程之AC自动机的有关内容,涉及其应用场景,运行原理,运行过程,构造方法及Java中的实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java汇编源码如何查看环境搭建

    Java汇编源码如何查看环境搭建

    这篇文章主要介绍了如何在IntelliJ IDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJ IDEA以方便查看Java字节码文件,接着,详细说明了如何下载和配置HSDIS插件,以便在IDEA中查看Java方法的汇编代码
    2025-01-01
  • spring导入framework报红问题

    spring导入framework报红问题

    这篇文章主要介绍了spring导入framework报红问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中的CAS无锁机制实现原理详解

    Java中的CAS无锁机制实现原理详解

    这篇文章主要介绍了Java中的CAS无锁机制实现原理详解,无锁机制,是乐观锁的一种实现,并发情况下保证对共享变量值更改的原子性,CAS是Java中Unsafe类里面的方法,底层通过调用C语言接口,再通过cup硬件指令保证原子性,需要的朋友可以参考下
    2024-01-01

最新评论