java中的static
关键字主要用于内存管理。我们可以应用java static
关键字在变量,方法,块和嵌套类中。 static
关键字属于类,而不是类的实例。
静态(static
)可以是:
如果将一个变量声明为static
,它就是所谓的静态变量了。
静态变量的优点:
理解不使用静态变量的问题
class student{
int rollno;
string name;
string college="its";
}
假设在一所学校有500
名学生,现在所有实例数据成员将在每次创建对象时获取内存。所有学生都有其唯一的注册id:rollno
和 name
,因此实例数据成员没有什么问题。college
指的是所有对象的共同属性。如果使它静态化(使用static
关键字修饲),这个字段将只获得内存一次。
java静态属性被共享给所有对象。
静态变量的示例
//program of static variable
class student8 {
int rollno;
string name;
static string college = "its";
student8(int r, string n) {
rollno = r;
name = n;
}
void display() {
system.out.println(rollno + " " + name + " " + college);
}
public static void main(string args[]) {
student8 s1 = new student8(111, "karan");
student8 s2 = new student8(222, "aryan");
s1.display();
s2.display();
}
}
上面代码执行结果如下 -
111 karan its
222 aryan its
创建对象示例图如下所示 -
不使用静态变量的计数器程序
在这个例子中,我们创建了一个名为count
的实例变量用来统计创建对象的数目,它在构造函数中执行递增。 由于实例变量在创建对象时要获取内存,每个对象都将具有实例变量的副本,如果它被递增了,它也不会反映到其他对象中。所以每个对象在count
变量中的值还是1
。
class counter {
int count = 0;// will get memory when instance is created
counter() {
count++;
system.out.println(count);
}
public static void main(string args[]) {
counter c1 = new counter();
counter c2 = new counter();
counter c3 = new counter();
}
}
上面代码执行结果如下 -
1
1
1
计数器静态变量的程序
如上所述,静态变量将只获取一次内存,如果任何对象更改静态变量的值,它将保留其值,所有实例均可访问同一变量值。
class counter2 {
static int count = 0;// will get memory only once and retain its value
counter2() {
count++;
system.out.println(count);
}
public static void main(string args[]) {
counter2 c1 = new counter2();
counter2 c2 = new counter2();
counter2 c3 = new counter2();
}
}
上面代码执行结果如下 -
1
2
3
如果在任何方法上应用static
关键字,此方法称为静态方法。
静态方法的示例
//program of changing the common property of all objects(static field).
class student9 {
int rollno;
string name;
static string college = "its";
static void change() {
college = "bbdit";
}
student9(int r, string n) {
rollno = r;
name = n;
}
void display() {
system.out.println(rollno + " " + name + " " + college);
}
public static void main(string args[]) {
student9.change();
student9 s1 = new student9(111, "karan");
student9 s2 = new student9(222, "aryan");
student9 s3 = new student9(333, "sonoo");
s1.display();
s2.display();
s3.display();
}
}
上面代码执行输出以下结果 -
111 karan bbdit
222 aryan bbdit
333 sonoo bbdit
执行正常计算的静态方法的另一个示例:
//program to get cube of a given number by static method
class calculate {
static int cube(int x) {
return x * x * x;
}
public static void main(string args[]) {
int result = calculate.cube(5);
system.out.println(result);
}
}
上面代码执行输出以下结果 -
125
静态方法的限制
静态方法有两个主要限制。它们分别是:
this
和super
两个关键字不能在静态上下文中使用。class a {
int a = 40;// non static
public static void main(string args[]) {
system.out.println(a);
}
}
上面代码执行输出以下结果 -
[编译错误!]compile time error
为什么java main方法是静态的?
这是因为对象不需要调用静态方法,如果它是非静态方法,jvm首先要创建对象,然后调用main()方法,这将导致额外的内存分配的问题。
java中的静态块主要有两个作用:
静态块的示例
class a2 {
static {
system.out.println("static block is invoked");
}
public static void main(string args[]) {
system.out.println("hello main");
}
}
上面代码执行输出以下结果 -
static block is invoked
hello main
可以执行程序没有main()方法吗?
答:是的,一种方式是静态块,但在以前旧的jdk版本中,不是在jdk 1.7。
class a3 {
static {
system.out.println("static block is invoked");
system.exit(0);
}
}
上面代码执行输出以下结果 -
static block is invoked
在jdk7及以上版本中,输出将为:
错误: 在类 main 中找不到 main 方法, 请将 main 方法定义为:
public static void main(string[] args)