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

1.修饰变量。

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

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

1 public class StaticBean {
2 public static String A = "A";
3 }

使用方式

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

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

 1 public class BaseTest {
2
3 static{
4 System.out.println("B");
5 }
6
7 public static void main(String[] args) throws Exception{
8 System.out.println("A");
9 }
10 }

结论: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.不持有外部类的引用(普通内部类持有)
2.可以直接创建实例,不需要先创建外部类(普通内部类需要)
3.可以有静态成员变量、方法(普通内部类不行)和非静态成员变量、方法
4.只可以直接访问外部类静态成员,不可以直接访问外部类的非静态成员(普通内部类可以),需要通过传入外部类引用的方式才能访问

5.加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生

 

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

 1 public class Outer {
2 private int i = 0;
3
4 public Outer() {
5 i++;
6 System.out.println("=====init Outer "+i+"====");
7
8 }
9
10 public static Outer getInstance(){
11 return Inner.INSTANCE;
12 }
13 //静态内部类
14 public static class Inner{
15 private static final Outer INSTANCE = new Outer();
16 }
17 }

调用方

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

输出结果:

=====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的更多相关文章

  1. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  2. 【转】Java关键字final、static使用总结

    转自:http://lavasoft.blog.51cto.com/62575/18771/   Java关键字final.static使用总结   一.final        根据程序上下文环境, ...

  3. 理解Java中的final和static关键字

    回顾这两个关键字前,先考虑一个问题: Static变量存储在JVM中的位置,或者说static变量是如何被加载的? JVM会把类的静态方法和静态变量在类加载的过程中读入方法区(Method Area) ...

  4. Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  5. Java基础-final和static的区别

    很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...

  6. final与static

    一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fina ...

  7. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...

  8. Java关键字final、static使用总结(转)

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  9. (转)Java关键字final、static使用总结

    一.final  根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...

  10. [Java] 关键字final、static使用总结

    一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final ...

随机推荐

  1. centoOS下安装python3 和 pip: command not found

    在更新python3的时候会自动安装pip3,但是安装完成后,pip -V发现出错:command not found,找了好久,发现在建立软连接的时候路径写错了. 总结一下安装python3和发现p ...

  2. Python lib库docker-py和docker的区别

    1)两者的安装方式 pip install docker A Python library for the Docker Engine API pip install docker-py A Pyth ...

  3. models说明

    class UserType(models.Model): caption = models.CharField(max_length=32) class User(models.Model): na ...

  4. uoj#450. 【集训队作业2018】复读机(单位根反演)

    题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...

  5. 《图解HTTP》阅读笔记-第五章-web服务器

      第五章.与HTTP协助的web服务器单台虚拟主机实现多个域名可以用单台物理主机运行多台虚拟主机,这些虚拟主机的IP相同,而虚拟主机有可以寄存多个不同主机名和域名的web网站,所以要保证发送HTTP ...

  6. 设置SQL脚本大小敏感

    1.设置SQL脚本大小写不敏感 USE [master]  GO  ALTER DATABASE [DatabaseName] COLLATE Chinese_PRC_CI_AI  GO 2.设置大S ...

  7. kuangbin专题十六 KMP&&扩展KMP HDU3613 Best Reward(前缀和+manacher or ekmp)

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  8. kuangbin专题十二 POJ1661 Help Jimmy (dp)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14214   Accepted: 4729 Descr ...

  9. 详解linux下批量替换文件内容的三种方法(perl,sed,shell)

    在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...

  10. (转)接口自动化测试之http请求实践总结

    一.接口测试的基本思路 1.确定要测试接口的请求类型.接口是get请求还是post请求. 2.确定接口的参数.需要传输的参数有哪些,类型分别是什么,都有哪些要求等. 3.按照参数要求构造请求需要的参数 ...