如果成员变量用static 修饰,则该变量称为静态变量或者类变量( class variable),否则称为实例变量(instance variable).
如果成员方法用static 修饰,则该方法称为静态方法或者类方法(class method),否则称为实例方法(instance method)
一.静态变量
静态变量与实例变量的区别:
1.实例变量:在Java创建类的对象时,系统为每个对象的实例变量都分配一个内存,然后可以通过该对象来访问该实例变量。不同对象的实例变量占用不同的存储空间,因此它们不同
2.静态变量:Java运行时,系统在类的装载时为每个类的每个静态变量分配一块内存,以后再生成该类的对象时,这些对象将共享同名的静态变量,且每个对象对静态变量的改变会影响到其他的对象。
package demo;
public class Welcome{
//main方法
public static void main(String[] args)
{
Teacher teacher01 = new Teacher ();
teacher01.x =1;
teacher01.y =2;
Teacher teacher02 = new Teacher();
teacher02.x =3;
teacher02.y =4;
System.out.println("teacher01.x is " + teacher01.x +" " +
"teacher01.y is " + teacher01.y + " " + "teacher02.x is " + teacher02.x + " " +
"teacher02.y is " + teacher02.y );
}
}
class Teacher{
public static int x;
int y;
}
仔细看看代码结果,你想到了吗?
就是说,在任何时刻,不论有多少个Teacher 类的对象,只有一个x,
当然啦,我们可以通过类名来直接调用静态变量,但是这种方法可能会产生混乱的代码,不推荐通过类名来访问静态变量
package demo;
public class Welcome{
//main方法
public static void main(String[] args)
{
Teacher teacher01 = new Teacher ();
teacher01.x =1;
teacher01.y =2;
Teacher teacher02 = new Teacher();
Teacher.x =5;
teacher02.y =4;
System.out.println("teacher01.x is " + teacher01.x +" " +
"teacher01.y is " + teacher01.y + " " + "teacher02.x is " + teacher02.x + " " +
"teacher02.y is " + teacher02.y );
}
}
class Teacher{
public static int x;
int y;
}
这样的话,
通常,static 与 final 一起来定义类常量。
例如,在java 类库中的 Math 类就定义了两个类常量:
public static final double E = 2.718281828459045; //自然对数的底
public static final double PI = 3.141592653589793; //圆周率
我们可以通过类名来直接使用这些常量。
例如 你想输出半径为10的圆的面积:
System.out.println("面积为 " + Math.PI*10*10);
java 的类库System 类也定义了三个静态变量,分别是in,out,err,分别表示 标准输入设备(通常是键盘),标准输出设备(通常是显示器),标准错误输出设备.
二.静态方法
静态方法与实例方法的区别:
1.静态方法属于类,只能访问静态变量;静态方法通常用类名调用,也可以用创建类的对象来调用(静态方法与实例方法之间调用有要求,请看我的其他文章);静态方法中不能使用this 和 super 关键字
2.实例方法可以对当前的实例变量进行操作,也可以对静态变量进行操作;实例方法必须通过实例来调用
package demo;
public class Welcome{
public static void print() {
System.out.println("Hello world!");
}
//main方法
public static void main(String[] args)
{
Welcome.print();
Teacher.print01();
}
}
class Teacher{
public static void print01() {
System.out.println("Hello ni hao !");
}
}
注意这两个静态方法,一个在main方法的同类里面,一个在另一个类里面,但是它们都可以通过类名进行调用。
由于可以通过类名来直接访问静态变量,所以访问静态变量之前可以不用对它进行实例化,作为应用程序执行入口点的main方法,必须用static 来修饰,也是因为Java程序在运行时,系统在开始执行程序前没有生成类的一个实例,因此必须通过类名来调用main() 方法开始执行程序
最后,再进行总结一下:
实例方法可以调用实例方法与静态方法,访问实例变量与静态变量
静态方法不可以调用实例方法,不能访问实例变量,只可以调用静态方法,访问静态变量