static关键字:
特色:
1.static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。
2.static修饰的成员被全部的对象共享。
3.static优先于对象存在,由于static的成员随着类的加载就已经存在。
4.static修饰的成员多了一种调用方式,能够直接被类名所调用,(类名.静态成员)。
5.static修饰的数据是共享数据,对象中的存储的是特有的数据。数组
1 private static int age;//用static修饰的成员变量静态变量或者叫作类变量 2 private String name; //成员变量 3 public static void show(){//静态函数 可直接用类来调用 4 System.out.println("showStatic"); 5 } 6 public void showDemo(){//成员函数 须要建立对象才能够调用 7 System.out.println("showDemo"); 8 }
成员变量和静态变量的区别:
1.生命周期的不一样:
成员变量随着对象的建立而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2.调用方式不一样:
成员变量只能被对象调用。
静态变量能够被对象调用,也能够用类名调用。(推荐用类名调用)
3.别名不一样:
成员变量也称为实例变量。
静态变量称为类变量。
4.数据存储位置不一样:
成员变量数据存储在堆内存的对象中,因此也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,因此也叫对象的共享数据。jvm
1 public class Demo { 2 private static int age;//用static修饰的成员变量静态变量或者叫作类变量 3 private String name; //成员变量 4 public static void show(){//静态函数 可直接用类来调用 5 System.out.println("showStatic"); 6 } 7 public void showDemo(){//成员函数 须要建立对象才能够调用 8 System.out.println("showDemo"); 9 } 10 11 public static void main(String[] args) { 12 Demo.age = 1;//静态变量能够直接用类名调用。随着类加载而存在类的消失而消失 13 Demo d = new Demo(); 14 d.age = 10;//静态变量也能够经过对象来调用(推荐用类名来调用) 15 d.name="张三";//成员变量只能经过对象来调用。随着对象建立而存在随着对象回收而释放。 16 Demo.show();//静态方法也能够直接用类名调用。 17 d.show(); //静态方法也能够经过对象来调用。 18 d.showDemo();//非静态方法只能经过对象来调用。 19 } 20 }
静态使用时须要注意的事项:
1.静态方法只能访问静态成员。(非静态既能够访问静态,又能够访问非静态)
2.静态方法中不可使用this或者super关键字。
3.主函数是静态的。函数
1 public class Demo { 2 private static int age;//用static修饰的成员变量静态变量或者叫作类变量 3 private String name; //成员变量也叫作实例变量 4 5 public static void show(){//静态函数 6 Demo d = new Demo();//由于静态先于对象加载若是须要访问必需要建立对象才能访问 7 d.name = "张三";//静态方法不能直接访问非静态的成员变量 8 d.showDemo();//静态方法不能直接访问非静态的成员函数 9 System.out.println(d.name); 10 } 11 public void showDemo(){//成员函数 12 age = 10;//能够直接访问静态变量 13 show();//也能够直接访问静态函数 14 System.out.println(age); 15 } 16 }
何时使用static来修饰
1.静态变量:
当分析对象中所具有的成员变量的值都是相同的。这时这个成员就能够被静态修饰。
只要是数据在对象中都是不一样的,就是对象的特有数据,必须存储在对象中,是非静态的。
若是是相同的数据,对象不须要作修改,只须要使用便可,不须要存储在对象中,是静态的。
2.静态函数。
函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中特有的数据。
简单来讲,从源代码看,该功能是否须要访问非静态的成员变量,若是须要,该功能就是非静态的。若是不须要,就能够将该功能定义成静态的。固然,也能够定义成非静态,可是非静态须要被对象调用,而仅建立对象是没有意义的。this
静态代码块:
随着类的调用或建立实例而执行,并且只执行一次。
做用:
用于给类进行初始化。spa
1 public class Demo {//若是想让此类成为一个静态类而类中须要用到一些参数须要初始化就须要静态代码块 2 private static int age; 3 private static String name; 4 //省略get、set方法 5 static{//当类第一次调用或建立实例时给属性初始化且只执行一次。 6 age = 10; 7 name = "张三"; 8 } 9 public static void showNoen(){//调用此方法age为10name为张三(默认值) 10 System.out.println("年龄:"+age+"姓名:"+name); 11 } 12 public static void show(int age,String name){//调用此方法会覆盖掉默认值 13 Demo.age = age; 14 Demo.name = name; 15 System.out.println("年龄:"+Demo.age+"姓名:"+Demo.name); 16 } 17 public static void main(String[] args) { 18 Demo.showNoen();//结果为:年龄:10姓名:张三 19 Demo.show(50, "赵四");//结果为:年龄:50姓名:赵四 20 } 21 }
主函数特殊之处:
1.格式固定。
2.被jvm所识别和调用。
public static void main(String[] args){code
}
public:由于权限必须是最大的。
static:jvm在调用时是不须要对象的,直接用主函数所属的类名调用便可。
void:主函数没有具体的返回值 。
main:函数名,不是关键字,只是一个jvm识别的固定名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,并且袁术都是字符串类型。
对象