一:static修饰成员变量:
如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰
静态成员变量访问方式:
1.可以使用对象访问 对象.变量名
2.可以使用类名访问 类名.变量名
class Persons{
String name;
static String country="中国";
public Persons(String name){
this.name=name;
}
}
public class Test6 {
public static void main(String[] args) {
Persons p1=new Persons("张三");
System.out.println("名字:"+p1.name+",国籍:"+p1.country);
}
}
静态成员变量只会在数据共享区维护一份,而非静态成员变量的数据会在每个对象中维护一份
注意:
1.非静态成员变量只能使用对象访问,不能使用类名访问
2.千万不要为了方便访问数据而使用static修饰变量,只有数据是真正需要被共享时使用
static修饰成员变量的应用场景:
如果一个数据要被所有对象共享使用时,才使用static修饰
需求:统计一个类被使用了多少次创建对象,该类对外要显示被创建的次数
class Emp{
static int count;
public Emp(){
count++;
}
public void showCount(){
System.out.println("创建了"+count+"次对象");
}
}
public class Test7 {
public static void main(String[] args) {
Emp e1=new Emp();
Emp e2=new Emp();
Emp e3=new Emp();
e3.showCount();
}
}
二:static修饰方法(静态的成员方法):
访问方式:
1.可以使用对象访问 对象.函数名();
2.可以使用类名访问 类名.函数名();
推荐使用类名直接访问,节约内存。
静态函数要注意的事项:
1.静态函数可以使用类名或对象名访问,非静态函数只能使用对象名访问
2.静态函数可以直接访问静态成员,但是不能直接访问非静态成员
3.非静态函数可以访问静态与非静态成员
4.静态函数不能出现this或者super关键字
静态数据的声明周期:静态的成员变量时优先于对象存在的
static什么时候修饰一个函数:
如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰,一般用于工具类型的方法
需求:编写数组Arays.toString()和sort()的方法
class ArrayTool{
public static String toString(int[] arr){ //遍历数组方法
String result="";
for(int i=0;i<arr.length;i++){
if(i==0){
result+="["+arr[i]+",";
}else if(i==arr.length-1){
result+=arr[i]+"]";
}else{
result+=arr[i]+",";
}
}
return result;
}
public static void sort(int[] arr){ // 数组排序方法
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
}
public class Test8 {
public static void main(String[] args) {
int[] arr={19,8,49,12,65};
ArrayTool.sort(arr);
String info=ArrayTool.toString(arr);
System.out.println(info);
}
}
静态成员变量与非静态成员变量的区别:
1.作用上的区别:
静态成员变量的作用是共享一个数据给所有对象使用
非静态成员变量的作用是描述一类事物的公共属性
2.数量与存储位置上的区别:
静态成员变量是存储在方法区内存中,而且只会存在一份数据
非静态成员变量时存储在堆内存中,有n个对象就有n份数据
3.声明周期的区别:
静态成员变量数据是随着类的加载而存在,随着文件的消失而消失
非静态的成员变量时随着对象的创建而存在,随着对象被垃圾回收器回收而消失