static的特点:
A:随着类的加载而加载
B:优先于对象存在
C:被类的所有对象共享
举例:我们班的同学应共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
举例:
饮水机(用静态修饰)
水杯(不能用静态修饰)
D:可以通过类名调用
其实它本身也可以通过对象名调用。
推荐使用类名调用。
如,main方法是static的方法,不需要创建对象,通过类名就可以。方便jvm的调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
static注意事项
A:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法(这里的访问就是指直接访问)
静态方法:
只能访问静态成员变量
只能访问静态成员方法
非静态方法:
可以是静态的,也可以是非静态的成员变量
可是是静态的成员方法,也可以是非静态的成员方法。
先简单理解:
静态只能访问静态。
常见报错:“无法从静态上下文中引用非静态方法”
原因:静态的是随着类的加载而加载,而非静态方法,是在对象创建时程序才会为其分配内存,然后通过对象去调用非静态方法。所以在对象未存在时,没有对象调用非静态方法,非静态的方法也不会存在,静态方法自然不能调用一个不存在的方法。(静态比对象先存在,没有对象,没有人调用非静态方法,没有人调用它它怎么能执行呢。)
静态的方法:想着main方法,无需创建对象,直接(类名.方法)调用。
非静态方法:需要创建对象,通过对象来调用才能够执行。(方法不调用不执行)
工具类中使用静态方法
/*原始
class ArrayDemo{
public static void main(String[] args){
//int[] arr=new int[5];
int[] arr={22,33,44,55,66};
printArray1(arr);
//printArray2(arr);//报错:无法从静态上下文引用非静态
ArrayDemo ad= new ArrayDemo();//创建了一个对象,通过对象访问非静态方法
ad.printArray2(arr);
}
//加了static修饰的静态方法
public static void printArray1(int[] arr){
for(int i=0; i<arr.length; ++i){
System.out.print(arr[i]+" ");
}
}
//非静态方法
public void printArray2(int[] arr){
for(int i=0; i<arr.length; ++i){
System.out.print(arr[i]+"---");
}
}
}
*/
//改进
/*
测试类的作用:在测试类中创建其他类的对象,调用其他类的功能。
而我们现在的操作是跟数组相关的,所以,应该把这些操作定义到数组操作类中
定义一个数组的操作类ArrayTool
有了数组操作类之后的调用:
A:(同以前一样)在测试类ArraDemo中创建ArrayTool类的对象,通过该对象调用方法(可以为静态方法,也可以为非静态)
B:当printArray()为静态方法时,直接采用:类名.方法 来调用(也可以通过老方法A创建对象来调用)
C:当printArray()为静态方法,且私有private了构造方法,则只能通过类名.方法 来调用
*/
//测试类
class ArrayDemo{
public static void main(String[] args){
//int[] arr=new int[5];
int[] arr={22,33,44,55,66};
/*
ArrayTool ad= new ArrayTool();
ad.printArray1(arr);
*/
ArrayTool.printArray1(arr);
}
}
//工具类 放在另一个java文件(ArrayTool.java)里,和ArrayDemo放在同一个文件夹下即可
class ArrayTool{
//私有化了构造方法
private ArrayTool(){}
public static void printArray1(int[] arr){
for(int i=0; i<arr.length; ++i){
System.out.print(arr[i]+"---");
}
}
}