例如一个学生类中,我们需要统计下学生类中学生对象的数量,此时数量要定义为静态变量;
示例代码:
package com.java1995;
public class Student {
int id=0;
static int num=0;
Student(int id){
this.id=id;
num++;
}
public static void main(String[] args){
Student s1=new Student(1);
Student s2=new Student(2);
Student s3=new Student(3);
Student s4=new Student(4);
Student s5=new Student(5);
Student s6=new Student(6);
System.out.println("Num:"+Student.num);
}
}
输出结果:6
1.静态 变量
静态变量属于类的,和对象没有关系;
费静态变量属于某个对象的,每个对象都有 该数据的副本,
而静态变量只有一个
访问静态变量是通过(类名.变量名)来访问的
示例代码:
package com.java1995;
public class Test {
int commonint=0;
static int staticint=0;
Test(int x){
this.commonint=x;
}
public static void main(String[] args){
Test t1=new Test(1);
Test t2=new Test(2);
System.out.println("t1.commoint:"+t1.commonint);
System.out.println("t2.commoint:"+t2.commonint);
t1.staticint=1;
//静态变量在整个类中是唯一的,对象t1改变静态变量,该类中的静态变量同时进行改变,对其他的对象也有影响
System.out.println("t1.staticint:"+t1.staticint);
System.out.println("t2.staticint:"+t2.staticint);
}
}
2.静态方法
用static 修饰的方法称为静态方法
访问静态方法是通过(类名.方法名)来访问
示例代码:
package com.java1995;
public class StaticMethod {
public static void main(String[] args){
//类名.方法名进行访问
MyMethod.printInt(111111);
MyMethod.printString("Hello world");
}
}
class MyMethod{
static void printString(String args){
System.out.println(args);
}
static void printInt(int i){
System.out.println(i);
}
}
(1)静态方法不能访问非静态变量
(2)费静态方法可以访问静态变量
PS:静态属性或者方法在类加载的时候产生的
非静态属性或者方法是在new的时候产生的
测试代码:
package com.java1995;
public class Domo {
static int x=0;//定义一个静态变量x,赋初值为0
static{
x=100;//创建一个静态语句块,对x进行赋值
}
//创建一个构造器,输出x
Domo(){
System.out.println(x);
}
public static void main(String[] args){
new Domo();
}
}
运行结果:100,
说明程序先调用的语句块,static{x=100},而不是直接调用的构造器
即,先有静态属性,再有非静态属性
3.静态常量
public static final int x=1;