在我们平时的开发当中,经常会遇见static关键字,那么大家对static的用法,大家知道多少呢?下面我们来一起看一下吧,首先咱们来看《Java编程思想》中的一段话:
“static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途.”
简而言之,一句话来描述就是:
static方便在没有创建对象的情况下来进行调用方法或者变量
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态的static代码块
static可以修饰:
1.成员变量(简称属性)
2.方法
3.代码块(不能出现在方法内部)
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static修饰的变量(属性)被称作static变量或者说静态变量,静态变量的两个特征:
1.静态变量的数据被本类中所有实例对象共享
2.静态变量的访问权只要不是private,都可以直接通过"类名.属性"进行直接访问
看字是不是很无聊,来看代码吧:
1).创建一个demo类
public class StaticDemo{
//定义了一个静态的变量phone
static String phone="小米";
}
2)创建一个static的测试类:
public class StaticDemoTest{
public static void main(String[] args){
//直接输出phone吧
System.out.println(StaticDemo.phone);//这句话输出小米
//使用类名.属性来直接修改属性值
StaticDemo.phone = "vivo";
System.out.println(StaticDemo.phone);//这时候输出的则是vivo
//也可以new来通过实例对象来访问
StaticDemo sd = new StaticDemo();
//下面来通过实例对象输出StaticDemo的phone变量
System.out.println(sd.phone);//同样这句话也输出vivo
//修改属性值
sd.phone = "华为";
//我们再来输出一下phone
System.out.println(sd.phone);//这时候我们输出出来的就是华为
}
}
被static修饰的方法称作静态方法,和静态变量一样,可以直接使用"类名.方法名"来直接调用,可以不创建对象
直接看代码吧
//这是在本类中,可以直接使用方法名来直接调用
public class StaticDemo{
public static void Test(){
System.out.println("测试static修饰的方法");
}
public static void main(String[] args){
Test();
}
}
下面咱们来创建一个测试类:
public class StaticDemoTest{
public static void main(String[] args){
//直接使用类名.方法名是可以直接访问Test()方法
StaticDemo.Test();
}
}
由此可以看出:静态方法只能访问被static修饰的成员,静态方法不能调用非静态的资源,因此,非静态资源需要使用对象来调用,但是,静态方法在加载的时候可能还没有对象呢
被static修饰的代码块被称为静态代码快,静态代码快随着类的加载而执行,并且静态代码块只会执行一次
//咱们还使用前面的StaticDemo类,进行测试
public class StaticDemo{
//静态的代码块
static{
System.out.println("静态代码块执行了....");
}
//非静态代码块
{
System.out.println("非静态代码块执行了....")
}
//构造方法
public StaticDemo(){
System.out.println("构造方法执行了......");
}
public static void main(String[] args){
new StaticDemo();
}
}
说到这里了,咱们来说说他们的执行顺序:首先加载出来的是静态代码块,其次是非静态代码块,接着最后加载出来的是构造方法
static的简单使用就是这么多了,下面来看看static和他的好兄弟final一块用是什么样子的:
final翻译成中文就是最后的,最终的,既然是最后的,那么肯定是不能被修改的
final可以用于修饰三个地方:类,属性,方法
1.final修饰的类不能被继承,简称终类
2.final修饰的属性,必须手动给初始值,并且给定以后不能被修改
3.final修饰的方法可以被继承,但是不能被覆盖或者重写
static final用来修饰变量和方法,简称全局常量(static和final之间的书写顺序是没有关系的)
注意:常量的命名规范:字母全部都大写,用下划线连接多个单词,不能用任何方式来引用this或者super
对于变量,一旦给值,将不能被修改,可以通过类名进行访问
对于方法,不可覆盖,可以通过类名进行直接访问
常量*(static和final之间的书写顺序是没有关系的)
注意:常量的命名规范:字母全部都大写,用下划线连接多个单词,不能用任何方式来引用this或者super
对于变量,一旦给值,将不能被修改,可以通过类名进行访问
对于方法,不可覆盖,可以通过类名进行直接访问
好了,今天就先分享这么多,有什么不足的地方,欢迎各位大佬指点,咱们下期再见…