1、什么是Static关键字
在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
static修饰的变量:静态变量
static修饰的方法:静态方法
2、static的用途
static的用途大致可以分为两个方面
第一个方面是当static修饰属性,修饰变量的时候。这是的static可以帮助我们进行数据共享。如果一个成员变量被static所修饰了,那么这个变量就不再属于自己了,而是属于所在的类,所以我们在使用这个变量的时候可以多个对象共用这一个变量。
第二个方面当static修饰方法的时候,一旦使用static修饰成员方法 那么这个方法就成为了静态方法。静态方法不属于对象,属于类。如果没有使用static关键字修饰的成员方法,需要调用成员方法,则需要先创建该类的对象,通过对象调用成员方法 。如果没有static关键字,需要先创建对象 然后通过对象名调用方法 ,如果有static关键字 就不需要创建对象,直接通过类名调用。
public class MyClass {
int num; //成员变量
static int numStatic ;//静态变量
//成员方法
public void method(){
System.out.println("这是我的成员方法!");
//成员方法可以访问成员变量
System.out.println(num);
//成员方法可以访问静态变量
System.out.println(numStatic);
}
//静态方法
public static void methodStatic () {
System.out.println("这是我的静态方法!");
//成员方法不可以访问成员变量
//System.out.println(num);
//成员方法可以访问静态变量
System.out.println(numStatic);
}
}
public class Demo02MethodStatic {
public static void main(String[] args) {
//1.首先创建一个MyClass类的对象
MyClass obj = new MyClass();
//2.通过对象调用成员方法
obj.method();
//3.对于静态方法而言 可以通过对象名调用 也可以直接通过类名称直接调用
//obj.methodStatic(); //正确 不推荐 这种写法会被javac翻译成"类名称.静态方法名"
MyClass.methodStatic();
System.out.println("===========");
//4.对于本类当中的静态方法 可以省略类名称 直接调用
myMethod();
//Demo02MethodStatic.myMethod(); //完全等效
}
public static void myMethod(){
System.out.println("这是本类中的静态方法!");
}
}
3、static静态代码块
构造方法用于对象的初始化。静态初始化块,用于类的初始化操作。在静态初始化块中不能直接访问非staic成员。
那静态代码块的作用的是什么呢?
静态初始化块的作用就是:提升程序性能
为什么说静态初始化块能提升程序性能,代码示例如下:
public class Person {
static {
System.out.println("我只被执行一次!");
}
}
public class Demo04Static {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("========");
Person p2 = new Person();
}
}
我们看到上面的代码中创建了两个对象,但是static所修饰的静态方法却只被执行了一次,这是因为静态代码块是在类被加载的时候执行的,相当于类的初始化,所以当我们用对象去访问他的时候,不管我们访问几次,他都只会在类被加载的时候被执行一次,那么这样我们就可以避免产生不必要的内存,从而提高程序的性能。
4.static关键字的误区
static关键字会改变类中成员的访问权限吗?
1、有些初学的朋友会将java中的static与C/C++中的static关键字的功能混淆了。在这里只需要记住一点:与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:
public class Person {
public String name = "李四";
private static String address = "中国";
}
说明static关键字不能改变变量和方法的访问权限
2、能通过this访问静态成员变量吗?
public class Main {
static int value = 33;
public static void main(String[] args) throws Exception{
new Main().printValue();
}
private void printValue(){
int value = 3;
System.out.println(this.value);
}
}
这段代码输出结果为:33
this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
3、static能作用于局部变量么?
static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定