java中Static用法

mac2025-08-13  2

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静态关键字详解 .

最新回复(0)