细谈java static 静态变量和方法

一、静态变量

      使用static关键字定义的变量

      static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象   

二、 静态变量和非静态变量的区别

       静态变量被所有的对象所共享,在内存中只有一个副本【存放在方法区】,它当且仅当在类初次加载时会被初始化【加final和不加final的static变量初始化的位置不一样】。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

     static成员变量的初始化顺序按照定义的顺序进行初始化
 

生命周期:

成员变量随着对象的创建而存在随着对象的回收而释放。

静态变量随着类的加载而存在随着类的消失而消失


三、静态方法

      使用static关键字修饰的方法

      静态方法不依赖于任何对象就可以进行访问,属于是类方法,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。所以this和super关键字都不能使用,正是由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

静态方法只能继承,不能重写(静态方法属于类,所以不再是普通函数,拥有类的特性,可以理解他就是一个类)

package com.test.innerclass;

public class Test  {
    Person person = new Person("Test");
    static {
        System.out.println("test static");
    }

    public Test() {
        System.out.println("test constructor");

    }
    public static void printClass(){
        System.out.println("Test printClass");
    }

    public void output(){
        System.out.println("Test output");
    }

    public static void main(String[] args) {
        Test myClass = new MyClass();
        System.out.println("------------------------------");
        myClass.printClass();
        myClass.output();
    }

}

package com.test.innerclass;

class MyClass extends Test {
    Person person = new Person("MyClass");

    static {
        System.out.println("myclass static");

    }

    public MyClass() {
        System.out.println("myclass constructor");

    }

    public void output(){
        System.out.println("MyClass output");
    }

    public static void printClass(){
        System.out.println("MyClass printClass");
    }
}

四、静态代码块

     使用static关键字修饰的代码块,也可以理解为没有函数名称的静态方法

    静态代码块可以用来优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次

初始化的顺序 静态代码块 > 构造代码块 > 构造函数


 输出结果:

五、使用场景

  1、对象间共享值时

  2、方便访问变量时

六、static和final

    static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!

    对于变量,表示一旦给值就不可修改,并且通过类名可以访问。

    对于方法,表示不可覆盖,并且可以通过类名直接访问

注意:

      对于被static和final修饰过的实例常量,实例本身不能再改变了,但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象

package com.test.innerclass;

import java.util.ArrayList;

public class Test  {
    //static final容器类型
    private static final ArrayList<String> list = new ArrayList<String>();
    //static 变量
    private static String aa =null;
    //final 变量
    private final String bb = null;
    //static final类型初始化必须赋值
    private static final int cc = 0;
    Person person = new Person("Test");
    static {
        System.out.println("test static");
    }

    public Test() {
        System.out.println("test constructor");

    }
    public static void printClass(){
        System.out.println("Test printClass");
    }

    public void output(){
        System.out.println("Test output");
    }

    public static void main(String[] args) {
        Test myClass = new MyClass();
        System.out.println("------------------------------");
        myClass.printClass();
        myClass.output();
        System.out.println("------------------------------");
        aa = "aaaaaa";
//        bb = "bbbbbb";    //错误,final表示终态,不可以改变变量本身
//        cc = "cccccc";   //错误,final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改
        list.add("t1");    //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途
        list.add("t2");
    }

}

收功完毕,如果你觉得对你有帮助,朋友点个赞呗!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值