理解Java中的static关键字
Static 关键字在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。特点它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享,在类被载入时被显式初始化。可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”。Static变量置于方法区中!用static声明的方法为静态方法,不需要对象,就可以调用(...
static 关键字
在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。
static关键字使用场景
一、static关键字修饰变量
1、它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享,在类被载入时被显式初始化。而没有被static修饰的成员变量叫做实例变量,说明这个变量属于某个具体的对象的。
public class Demo{
public static String name = "Hello";
public static void main(String[] args) {
System.out.println(Demo.name);//可以不用创建对象就引用静态变量
}
}
2、static关键字只能用于修饰成员变量,不能用于修饰局部变量。否则编译会报错:参数b的非法修饰符;仅允许使用final。如下图
3、静态成员变量还可以使用“对象.类变量”来调用。不过,一般都是用“类名.类变量”。
static变量置于方法区中!
二、static修饰方法
1、用static声明的方法为静态方法,不需要对象,就可以调用(类名.方法名)
class good{
public static void print() {
System.out.println("Hello");
}
}
public class TestStatic{
public static void main(String[] args) {
good.print();
}
}
2、在普通方法里面可以调用静态的属性和方法,反过来在静态的方法里面,不能调用非静态的东西。
因为在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。如下图所示,会报错:无法静态引用非静态字段和方法。
当然如果想在静态方法中直接访问非静态成员,可以通过new对象调用。总的来说就是不管在不在同一个类中,只要是访问静态的,都可以类名调用。不管在不在同一个类中,只要是访问非静态的,都可以new对象调用。
3、静态方法中不可以使用this或者super关键字。
三、Static修饰类
java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有静态内部类才可以。
public class StaticTest{
public static class InnerClass{
public InnerClass() {//构造方法,
System.out.print("Hello");
}
public void Hello() {
System.out.println(" World");
}
}
public static void main(String[] args) {
InnerClass inner = new StaticTest.InnerClass();
inner.Hello();//输出结果Hello World
}
}
如果没有用static修饰InnerClass,则只能先创建一个外部类对象,再通过外部类对象创建内部类对象。
四、静态代码块(静态初始化块)
如果希望加载后,对整个类进行某些初始化操作,可以使用static代码(初始化)块。静态代码块是在类初始化时执行,不是在创建对象时执行。
静态初始化块中不能访问非static成员。
类初始化顺序
父类静态变量—>父类静态代码块—>子类静态变量—>子类静态代码块—>父类普通变量—>父类普通代码块—>父类构造函数—>子类普通变量—>子类普通代码块—>子类构造函数
静态代码块执行顺序
上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
Static修饰的变量或方法属于类的静态资源,是所有实例共享的,另外静态方法内部是不能访问非静态方法的,因为静态资源是在类加载的时候就建立好的,而类加载时非静态方法需要类new的时候才能创建,一前一后地顺序所以导致了Java静态方法不能访问非静态资源地结果,当然反之肯定是可以的了。
static关键字特点
1、static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量,属于类成员,不属于对象成员(非静态的属于对象成员)。
2、static修饰的静态成员优先于对象存在,因为static修饰的成员随着类的加载就已经存在。
3、static修饰的数据是共享数据,对象中的存储的是特有的数据,所以static修饰的成员被所有的对象共享。即凡是根据静态成员所在的类创建出来的对象,都可以共享这个静态成员。
4、static修饰的成员相比普通成员多了一种调用方式:可以直接被类名所调用(类名.静态成员)。
5、主函数就是静态的。
静态变量和成员变量的区别
1、所属范围不同。静态变量是属于类范围的;成员变量是属于对象范围的。
2、生命周期的不同:成员变量随着对象的创建而存在,随着对象的回收而释放。静态变量随着类的加载而存在,随着类的消失而消失。
3、调用方式不同:成员变量只能被对象调用。静态变量可以被对象调用,也可以用类名调用。
4、数据存储位置不同:成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
5、别名不同:成员变量也称为实例变量。静态变量称为类变量。
更多推荐


所有评论(0)