java--整理下关于static关键字的知识

Posted ggrc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--整理下关于static关键字的知识相关的知识,希望对你有一定的参考价值。

如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。--《java核心技术》

使用static的两种情形:1、只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建对象。2、希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。--《java编程思想》

static几个用到的地方:

静态变量:这个不解释。

静态常量:避免每个对象都拷贝一份常量。(这边提醒下自己加了final才是声明常量),通过Math.PI调用

public class Math
{
  public static final double PI=3.1415926;      
}

静态方法:比如Math类中的 Math.pow(x,a),在运算时,不使用任何Math对象,换句话说,就是没有隐式参数(提醒下自己隐式参数指this参数);可以认为静态方法是没有this参数的方法,因此静态方法不能操作对象,所以不能在静态方法中访问实例域,但是,静态方法可以访问自身类中的静态域。

工厂方法:这个来自《java核心技术》,我不太了解NumberFormat,我觉得我看懂了,但我不敢概括,只能截图放着了。

在《java 8 编程入门官方教程》中还看到了 static 代码块:

具体:有时类在创建对象之前,需要进行一些初始化。例如,可能需要建立与远程站点的连接。也可能需要在使用类的任何static方法之前,初始化某些static变量。为了处理这些情况,java允许声明static代码块。static代码块在类第一次被加载时执行,因此是在使用类之前执行的。可以参考代码

package test2;

class StaticBlock {
    static double rootOf2;
    static double rootOf3;
    static {
        System.out.println("Inside static block.");
        rootOf2=Math.sqrt(2.0);
        rootOf3=Math.sqrt(3.0);
    }
    StaticBlock(String msg) {
        System.out.println(msg);
    }
}
class SDemo3 {
    public static void main(String args[]) {
        StaticBlock ob = new StaticBlock("Inside Constructor");
        System.out.println("Square root of 2 is "+StaticBlock.rootOf2);
        System.out.println("Square root of 3 is "+StaticBlock.rootOf3);
    }
}

为什么main方法要加static:main方法不对任何对象进行操作,事实上,再启动程序时没有任何一个对象。静态的main方法将执行并创建程序所需有的对象。--《java核心技术》

另外我还想提醒自己的是:

(17)尽量避免随意使用静态变量

要知道,当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的,如:

public class A
{
    private static B b = new B();  
}

此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止--来自http://www.cnblogs.com/xrq730/p/4865416.html

 

以上是关于java--整理下关于static关键字的知识的主要内容,如果未能解决你的问题,请参考以下文章

重新认识java ---- java中的另类:static关键字(附代码块知识)

详解Java Static关键字

网上整理的Java面试

C++中关于static

Eclipse下关于The serializable class UsersServlet does not declare a static final serialVersionUID field

Java中的static关键字解析