一、static概述:
1.是一种修饰符,静态修饰符,用于修饰成员(成员变量和成员函数)不能修饰局部
2. 当成员被修饰了之后就多了一种调用方式,除了被对象调用之外还可以直接被类名调用用法是:类名.静态成员
3. 被静态修饰的属性存放在方法区(类中的方法),共享区,数据区中。这样可以节省内存
4.将每个对象的共性提取出来,用static修饰,则将该共性的属性存放在方法区中,这样就可以节省内存了
5. 每个对象的特有属性不要用static修饰,存在在对象中
6.使用static关键字修饰一个属性(声明为static的变量实质上就是全局变量)
7.使用static关键字修饰一个方法 通常在一个雷中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
二、Static的特点:
1.随着类的加载而加载;也就是说随着类的出现而加载进内存,随着类的的消失而消失,说明他的生命周期最长,
2.优先于对对象存在,就是静态先存在,对象是后存在的
3.被所有对象所共享
4.可以直接被类名调用。
三、静态使用注意事项:
1、静态方法只能访问静态成员,不能访问非静,因为静态优先于对象存在,没对象时非静态成员是不存在的 。非静态方法既可以访问静态也可以访问非静态(静态属性和方法在类加载后,就存到方法区内存中,此时,还没有产生对象,而普通方法和属性属于对象,所以静态方法不能调用非静态方法)
2、静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this
四、静态有利有弊:
好处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一分 可以直接被类名调用。
弊端:生命周期过长,访问出现局限性,(静态虽好 只能访问静态)
五、实例变量(成员变量)和类变量(静态变量)的区别:
1.存放位置
类变量随着类的加载而存在于方法区(数据区,共享区)中随着类的消失而消失
实例变量随着对象的建立而存在于堆内存中
2.生命周期
类变量的生命周期是最长的,随着类的消失而消失
实例变量的生命周期随着对象的消失而消失(类的生命周期是最长的,其次是对象)
3.调用方式
成员变量只能对象调用
静态变量能用对象调用也能用类名调用
六、代码实例:
1 public class StaticDemo { 2 public static void main(String[] args) { 3 Person p=new Person(); 4 System.out.println(p.getCountry());//通过对象调用成员 5 Person p1=new Person(); 6 p1.show(); 7 p.show(); 8 System.out.println(Person.getCountry());//通过类名来调用成员。当成员被修饰了之后就多了一种调用方式,除了被对象调用之外还可以直接被类名调用用法是:类名.静态成员 9 } 10 } 11 class Person{ 12 private String name;//成员变量,实例变量,,随着对象的建立存在于堆内存中,生命周期随着对象的消失而消失 13 private static String country="CN";//将每个对象的共性提取出来用静态修饰,存储在另一个空间中这样就不用每建立一个对象就为该属性开辟空间这样会很占用内存 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public static String getCountry() { 24 return country; 25 } 26 27 public static void setCountry(String country) { 28 Person.country = country; 29 } 30 31 //静态的成员变量,类变量 存在于方法区中,生命周期最长, 32 public void show(){ 33 System.out.println(name+"......"+country); 34 } 35 }
public class NinetyEight_NinetyNine_oneHundred { public static void main(String[] args) { Mistress m1 = new Mistress("小白"); Mistress m2 = new Mistress("小红"); m1.desc(); m2.desc(); m1.profession = "小三";//改掉了方法区中的静态属性 m1.desc(); m2.desc(); //Mistress.profession;//静态数据不属于对象,属于类,所以调用静态数据使用类区调用 //调用静态方法(直接类名调用) Mistress.promosion(); m1.desc(); m2.desc(); } } class Mistress{ String name; static String profession = "情人";//使用static修饰属性,那么这个属性,就存在于方法区中 public Mistress(String name) { this.name = name; } public void desc(){ System.out.println("我的名字是:"+name+",我的职业是:"+profession); } //使用static修饰一个方法(表示这个方法是静态方法,不属于对象,用类名直接调用) public static void promosion(){ System.out.println("转正了"); profession = "主妇"; //desc();静态方法不能调用非静态方法,因为desc方法是对象的,静态方法在对象还没创建的时候就加载了 } }
七、什么时候使用静态
1、什么时候定义静态变量(类变量):
当对象中出现共享数据时,该数据被静态所修饰,
对象中的特有数据要定义成非静态存在于堆内存中。
2.什么时候定义静态函数
当功能内部没有访问到非静态数据(对象的特有数据)时。那么该功能可以定义成静态的(当然也可以定义成非静态,但是非静态需要被对象调用,而仅仅创建对象调用非静态,没有访问特有数据的方法,该对象创建是没有意义的,所以为了程序更加严谨,还是定义成静态的)