Java程序员的日常 —— static的用法讲解实践

之前文章说过Java中static的作用,有朋友想看个例子。于是便抽空写了个小栗子

代码

package xing.test.thinking.chap5;
class A{
    public A() {
        System.out.println("A constructor");
    }
}

class VarTest{
    static A a = new A();
    public static int b = 0;
    public int c = 0;
    static{
        System.out.println("VarTest static");
    }
    public VarTest() {
        System.out.println("VarTest constructor");
    }
    public static void test(){
        System.out.println("in static test func");
    }
}
public class StaticTest {
    public static void main(String[] args) {
        System.out.println("start testing!");
        System.out.println("如果不new VarTest或者使用VarTest的静态内容,就不会触发VarTest静态块的执行");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        VarTest.test();//也会触发静态块的执行

        VarTest testa = new VarTest();
        VarTest testb = new VarTest();
        System.out.println("testa.b: "+testa.b);
        System.out.println("testb.b: "+testb.b);
        System.out.println("testa.c: "+testa.c);
        System.out.println("testb.c: "+testb.c);
        //如果修改b属性的值,所有对象的内容都会改变
        testa.b = 3;
        System.out.println("testa.b: "+testa.b);
        System.out.println("testb.b: "+testb.b);
    }
}

执行结果

start testing!
如果不new VarTest或者使用VarTest的静态内容,就不会触发VarTest静态块的执行
A constructor
VarTest static
in static test func
VarTest constructor
VarTest constructor
testa.b: 0
testb.b: 0
testa.c: 0
testb.c: 0
testa.b: 3
testb.b: 3

static修饰的变量

首先先来说说静态修饰的变量,使用static修饰的变量会有两个效果:

  • 第一,就是可以通过类直接访问这个对象,而不需要创建对象
  • 第二,就是所有的创建的对象,都指向同一份对象,也就是这个静态对象是所有的类对象共享的。因此修改它的值,相当于修改了所有对象的变量。

应用场景

通常用于存储类公用的属性,如logger。

static修饰的方法

静态修饰的方法,可以直接通过类来使用。如上面的VarTest的test方法,直接基于Class就可以访问。

应用场景

通常用于编写工具类方法,如FileUtil、BeanUtil等。

static块

static另一个应用场景就是写静态块,如上面的static{}。这部分静态块会在第一次加载使用类的时候执行一次,仅仅会执行一次!
加载的方式有两种,一种是new对象;另一种就是访问类的静态内容。
如上面的例子中,就是访问了类的静态方法。

应用场景

这种静态块一般用于某些线程池或者连接池的初始化,比如JDBC连接池。

关于属性的初始化

在Java中都是属性先进行初始化,然后再执行构造器方法!

本文转自博客园xingoo的博客,原文链接:Java程序员的日常 —— static的用法讲解实践,如需转载请自行联系原博主。

时间: 2024-10-26 20:19:10

Java程序员的日常 —— static的用法讲解实践的相关文章

Java程序员的日常—— FileUtils工具类的使用

package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.FileFileFilter; import org.apache.commons.io.filefilter.FileFilterUtils; imp

Java程序员的日常—— Arrays工具类的使用

这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排序算法,这个还是非常有用的. 所有的方法都是在下面的类中进行测试的: public class ArraysTest { String[] array = new String[]{"a","c","2","1","b&

Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比

早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今天主要的工作还是做业务需求,不过下午状态不好,看了下<Effective java>,正好重构了下代码. effective java 通过函数来作为策略 通过函数作为策略有两个要注意的地方: 使用接口作为策略传入 如果长期调用,应该设置为静态内部类,避免频繁创建过多的匿名对象 下面举个简单的例子

Java程序员的日常—— 《编程思想》关于类的使用常识

Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于构造器 在C中,如果要使用变量需要先申请内存.在Java中,如果你需要创建一个对象,也可以直接new出来,JVM会自动帮你管理. 默认的类,会自动有一个无参的构造方法,当然你也可以自己定义有参的构造方法.但是要注意,一旦自己定义了,就不再帮你自动创建无参的构造方法了. 一个类可以有多种构造方法,通过

Java程序员的日常——经验贴(纯干货)二

继昨天的经验贴,今天的工作又收获不少. windows下编辑器会给文件添加BOM 在windows的编辑器中,为了区分编码,通常会添加一个BOM标记.比如,记事本.nodepade++.sublimeText都会出现这个问题.如果使用filereader去读,就会发现第一行出现了乱码: 123 查看其bytes可以发现为: [-17] [-69] [-65] [49] [50] [51] 此时,可以使用编辑器比如nodepad++,点击encoding,设置为encode with utf

Java程序员的日常—— Properties文件的读写

在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Properties. 文件的读取 Properties类提供了Load方法,支持以inputstream为参数,读取配置文件.因此可以这样: Properties props = new Properties(); //如果配置文件放在类目录下,可以直接通过类加载器读取 props.load(new Fi

Java程序员的日常 —— 工作一天的收获

看题目可能是扯皮,其实还是有很多专业知识的.从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题. 每天整理一点点,每天收获一点点. 关于软件设计 在设计系统结构的时候,一些软件设计方法,还是很重要的. 比如开闭原则,开闭原则就是: 对扩展是开放的 对修改是关闭的 要做到上面两点,就需要在设计应用架构时,理清核心的需求点.完成一个解决问题需求的最小的.最核心的设计结构.其他的业务逻辑或者应用需求,应该都是基于这个核心结构进行扩展. 再来说说软件设计的6大原则: 开闭原

Java程序员的日常 —— Java类加载中的顺序

之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序. 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的例子就是用static块来测试类的加载顺序. package xing.test.thinking.chap7; class A{ static{ System.out.println("A static"); } } class B extends A{ static{ System.out.println("B stat

Java程序员的日常 —— 响应式导航Demo

这两天想要做响应式的页面,于是本着重复造轮子的想法,模仿Bootstrap官网,精简了一个响应式导航的Demo. 效果 代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link href="http://cdn.bootcss.com/boots