一:static 修饰变量
静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中维护一份
static string country;
…
s1.country=“小日本”
static(静态\修饰符)
static修饰成员变量:
注意:1.非静态的成员变量只能使用对象进行访问,不能使用类名进行访问
2.千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才用static修饰
二:static修饰方法
static修饰方法(静态的成员方法):
…。。。。。的访问方式
方式一:可以使用对象进行访问
对象.静态的函数名();
方式二:可以使用类名进行访问
类名.静态的函数名();
推荐使用类名进行访问(不用创建对象,方便)
原因:静态函数是可以使用类名直接调用,这个时候可能还没有存在对象,而非静态的 成员数据是随着对象 的存在而存在的
3.非静态的函数是可以直接访问静态与非静态的成员
原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态数据也随着对象的创建而存在了
4.静态函数不能出现this或者super关键字;
原因:因为静态的函数是可以使用类名调用的 ,一旦使用类名调用这时候不存在对象 而this关键字是代表了一个函数 的调用者对象 这时候产生了冲突
静态代码块:静态代码块是在 类名.class文件加载到内存的时候就马上执=行
static 不用实例化(创建对象—>实例化)可以直接通过类名或方法名访问 调用
三:静态的数据的生命周期:静态的成员变量是优先于对象存在的
class Student{
String name; //名字
static String country = "中国"; //国籍
//静态代码块 :静态代码块是在Student.class文件加载到内存的时候就马上执行的。
static{
System.out.println("静态代码块执行了...");
}
//构造函数
public Student(String name){
this.name = name;
}
//非静态的成员函数
public void study(){
System.out.println("好好学习"+this);
}
//静态函数
public static void sleep(){ //静态方法与非静态方法的字节码文件是同时存在内存中 的。 只是静态的成员变量数据是优先于对象存在而已。
Student s= new Student("铁蛋");
System.out.println(s.name+"呼呼大睡...");
}
}
class Demo2
{
public static void main(String[] args)
{
Student.sleep();
// Student s = new Student("狗娃");
}
}
四:static什么时候修饰一个函数
如果一个函数没有直接访问到非静态的成员时, 那么就可以使用static修饰了。 一般用于工具类的方法
Example:
/*
需求:编写一个数组的工具类。
Arrays.toString() [1,2,3,4];
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 String toString(int [] arr){
String result="";
for(int i=0;i<arr.length;i++){
if(i==0){
result="["+arr[i]+","+result;
}else if(i==(arr.length-1)){
result=arr[i]+"]";
}else{
result=arr[i]+","+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;
}
}
}
}
}
class Demo3
{
public static void main(String[] args)
{
int[] arr = {12,1,456,165};
//ArrayTool tool = new ArrayTool();
ArrayTool.sort(arr);
String info = ArrayTool.toString(arr);
System.out.println("数组的元素:"+ info);
}
}
静态函数为什么不能访问非静态的成员?
…静态函数只要存在有对象,那么也可以访问非静态的数据,只是不能直接访问而已
--------------------------------------------------------------------------启蒙于传智播客!!