java中Static用法

Java关键字static静态修饰符,可能大家都很熟悉,具体有什么用法?

当我们通过new关键字去创建对象的时候,那么数据的存储空间才会被分配,类中的成员方法才能被对象所使用。但是呢有两种特殊的情况:
1、我们通过new关键字创建的对象共享同一个资源,而不是说每个对象都拥有自己的数据,或者说根本就不需要去创建对象,这个资源和对象之间是没有关系的。
2、希望某个方法不与包含它的类的任何对象联系在一起。总结下来就是说:即使没有创建对象,也能使用属性和调用方法,static目的就是在于解决这个问题。

1.修饰成员变量和方法

在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员或方法,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员或方法,但是有种情况例外,就是该成员是用static声明的,即可引用成员或方法。最基本的有Integer.parseInt(),Float.parseFloat()等等用来把对象转换为所需要的基本数据类型,这样的变量和方法我们又叫做类变量和类方法。

public class StaticTest {
    //静态字符串变量
    public static String codeStr = "123456";
    //静态整型变量
    public static int codeInt = 12;
    public static void main(String[] args) {
        //输出字符串:123456
        System.out.println(codeStr);
        //输出整型:144
        System.out.println(codeInt * 12);
    }
}
2.修饰成员变量和方法

一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
比如main方法就必须是静态的 这是程序入口
两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.

import java.text.SimpleDateFormat;
import java.util.Calendar;
public class StaticTest {
    //静态字符串变量
    public static String codeStr = "123456";
    //静态整型变量
    public static int codeInt = 12;
    public static void main(String[] args) throws Exception {
        //输出字符串:123456
        System.out.println(codeStr);
        //输出整型:144
        System.out.println(codeInt * 12);
        //通过静态方法获取当前时间字符串:201911011518264
        System.out.println(getSystemDateTime("yyyyMMddHHssSSS"));
    }

    /**
     * @Title: getSystemDateTime
     * @Description: 获取当前时间字符串yyyyMMddHHssSSS格式
     * @param datepattern
     * @return
     * @throws Exception
     */
    public static String getSystemDateTime(String datepattern) throws Exception {
        SimpleDateFormat df = new SimpleDateFormat(datepattern);
        return df.format(Calendar.getInstance().getTime());
    }
}

1.static可以修饰变量,方法
2.被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
3.在类被加载的时候,就会去加载被static修饰的部分。
4.被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

3.静态内部类

需要了解2个概念:
1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。
2)静态内部类也叫嵌套类,用这个名字给他定义是更加形象的。意思是说内部类和外部类的关系只是层次嵌套关系,所以只是在创建类文件的时候类文件名是如下形式:outer$inner.java,在使用方面完全和两个普通类一样
作用:
1)静态内部类的作用:只是为了降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖与外在的类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。
通俗的讲:比如有A,B两个类,B有点特殊,虽然可以独立存在,但只被A使用。如果把B并入A里,复杂度提高,搞得A违反单一职责。如果B独立,又可能被其他类(比如同一个包下的C)依赖,不符合设计的本意。所以不如将其变成A.B,等于添加个注释,告诉其他类别使用B了,它只跟A玩。
2)非静态内部类才是真正的内部类:可以自由使用外部类的所有变量和方法

public class StaticTest {
 public static void main(String[] args) {
     //输出123
     Pinner.print();
     //输出456
     Inner inner = new Inner();
     inner.print();
 }
 //静态内部类有静态方法
 static class Pinner {
     public static void print() {
         System.out.println("123");
     }
 }
 //静态内部类有非静态方法
 static class Inner {
     public void print() {
         System.out.println("456");
     }
 }
}
4.静态导包

静态导包就是java包的静态导入,用import static代替import静态导入包。
一般我们导入一个类都用 import com……ClassName;而静态导入是这样:import static com……ClassName.;这里的多了个static,还有就是类名ClassName后面多了个. ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用。
优点:可以简化一些操作,例如打印操作System.out.println(…);就可以将其写入一个静态方法print(…),在使用时直接print(…)就可以了。

//导入工具包里的静态方法
//原来的导入
import jieyi.tools.util.DateUtil;
//现在的导入
import static jieyi.tools.util.DateUtil.getSystemDateTime;
public class StaticTest {
    public static void main(String[] args) throws Exception {
        //原来的导入
        System.out.println(DateUtil.getSystemDateTime("yyyyMMddHHssSSS"));
        //现在的导入
        String dateTime = getSystemDateTime("yyyyMMddHHssSSS");
    }
}

在静态方法中没有this关键字因为静态是随着类的加载而加载,而this是随着对象的创建而存在的。静态比对象优先存在。
静态可以访问静态的,但是静态不能访问非静态的。
非静态的可以去访问静态的。
静态只能访问静态。
非静态既可以访问非静态的,也可以访问静态的

参考:
Static特别用法-静态导包
.
Java之static静态关键字详解
.

发布了15 篇原创文章 · 获赞 8 · 访问量 6035

猜你喜欢

转载自blog.csdn.net/Charles_lxx/article/details/102859132