本文概述
静态关键字在Java中主要用于内存管理。我们可以用变量,应用java静态关键字方法,块和嵌套类。静态关键字属于的类而不是类的实例。
静态可以:
- 变量(也称为一个类变量)
- 方法(也称为一个类方法)
- 块
- 嵌套类
1)Java静态变量
如果你将任何变量声明为静态的,它被称为一个静态变量。
- 可以使用静态变量引用的所有对象的共同财产(每个对象并不是唯一的),例如,员工的公司名称,学院的学生等。
- 类的静态变量只有一次获取内存区域在类加载的时候。
静态变量的优点
它使得你的程序内存效率(即。,它节省了内存)。
理解问题没有静态变量
class Student{
int rollno;
String name;
String college="ITS";
}
假设有500名学生在我的大学,现在所有实例数据成员将内存每次创建对象时。所有学生都有其独特的rollno和名称,所以实例数据成员是良好的在这种情况下。在这里,“大学”是指所有对象的公共财产。如果我们让它静止,这一领域将得到内存只有一次。
Java静态属性是所有对象共享。
静态变量的例子
//Java Program to demonstrate the use of static variable
class Student{
int rollno;//instance variable
String name;
static String college ="ITS";//static variable
//constructor
Student(int r,String n){
rollno = r;
name = n;
}
//method to display the values
void display (){System.out.println(rollno+" "+name+" "+college);}
}
//Test class to show the values of objects
public class TestStaticVariable1{
public static void main(String args[]){
Student s1 = new Student(111,"Karan");
Student s2 = new Student(222,"Aryan");
//we can change the college of all objects by the single line of code
//Student.college="BBDIT";
s1.display();
s2.display();
}
}
输出:
111 Karan ITS
222 Aryan ITS
程序计数器的静态变量
在本例中,我们创建了一个实例变量命名计数在构造函数中增加。由于实例变量的内存对象创建时,每个对象实例变量的副本。如果是增加,它不会反映其他对象。因此每个对象计数变量中的值1。
//Java Program to demonstrate the use of an instance variable
//which get memory each time when we create an object of the class.
class Counter{
int count=0;//will get memory each time when the instance is created
Counter(){
count++;//incrementing value
System.out.println(count);
}
public static void main(String args[]){
//Creating objects
Counter c1=new Counter();
Counter c2=new Counter();
Counter c3=new Counter();
}
}
输出:
1
1
1
程序计数器的静态变量
正如我们上面提到的,静态变量会得到内存只有一次,如果任何对象变化的静态变量的值,它将保持它的价值。
//Java Program to illustrate the use of static variable which
//is shared with all objects.
class Counter2{
static int count=0;//will get memory only once and retain its value
Counter2(){
count++;//incrementing the value of static variable
System.out.println(count);
}
public static void main(String args[]){
//creating objects
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
输出:
1
2
3
2)Java静态方法
如果你应用静态关键字与任何方法,它被称为静态方法。
- 一个静态方法属于类,而不是一个类的对象。
- 静态方法可以调用,而无需创建一个类的实例。
- 静态方法可以访问静态数据成员的值,可以改变它。
静态方法的例子
//Java Program to demonstrate the use of a static method.
class Student{
int rollno;
String name;
static String college = "ITS";
//static method to change the value of static variable
static void change(){
college = "BBDIT";
}
//constructor to initialize the variable
Student(int r,String n){
rollno = r;
name = n;
}
//method to display values
void display(){System.out.println(rollno+" "+name+" "+college);}
}
//Test class to create and display the values of object
public class TestStaticMethod{
public static void main(String args[]){
Student.change();//calling change method
//creating objects
Student s1 = new Student(111,"Karan");
Student s2 = new Student(222,"Aryan");
Student s3 = new Student(333,"Sonoo");
//calling display method
s1.display();
s2.display();
s3.display();
}
}
Output:111 Karan BBDIT
222 Aryan BBDIT
333 Sonoo BBDIT
静态方法的另一个例子,执行正常计算
//Java Program to get the cube of a given number using the 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);
}
}
Output:125
静态方法的限制
有两个主要的静态方法的限制。它们是:
- 静态方法不能使用非静态数据成员或者直接调用非静态方法。
- 这和超级不能用于静态上下文。
class A{
int a=40;//non static
public static void main(String args[]){
System.out.println(a);
}
}
Output:Compile Time Error
问为什么Java main方法静态?
Ans)因为对象不需要调用一个静态方法。如果它是一个非静态方法,JVM创建一个对象第一然后调用main()方法将导致额外的内存分配的问题。
3)Java静态块
- 用于初始化静态数据成员。
- 前执行的主要方法在类加载时。
示例静态块
class A2{
static{System.out.println("static block is invoked");}
public static void main(String args[]){
System.out.println("Hello main");
}
}
Output:static block is invoked
Hello main
问)我们可以没有main()方法执行程序?
Ans)不,的一个方法是静态块,但可能到JDK 1.6。由于JDK 1.7,它是不可能执行一个java类没有的主要方法。
class A3{
static{
System.out.println("static block is invoked");
System.exit(0);
}
}
输出:
static block is invoked
因为JDK 1.7及以上,输出是:
Error: Main method not found in class A3,please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
评论前必须登录!
注册