关键字二、 static(静态)
特点:
static 用于修饰成员(成员函数和成员函数)
static的存在,优先于对象存在,随着类的加载而加载
static所修饰的成员,被所有对象共享
static可以直接被类名调用,格式:System.out.println(Person.country);:类名.静态成员
使用细节
静态方法只能访问静态成员,即static修饰的成员,static int data;
静态方法不可以写this、super:this代表着当前调用该方法的对象。
主函数(main)是静态的 : public static void main(String[] args)
import java.util.Scanner; import javax.naming.ldap.SortControl; class Person { String name;//成员变量/实例变量 static String country = "CN";//静态变量/类变量 public void show () { System.out.print(country+" : "+name); } } public class Main { public static void main (String[] args) { Person BLF = new Person(); Scanner cin = new Scanner(System.in); //BLF.name = cin.nextLine(); BLF.name = "BLF2"; BLF.show(); System.out.println(Person.country);//static 共享,可以直接用类名输出 //但是不可滥用,有些数据毕竟是特有的,不是共享的 //比如中国人 ,国籍是共享的,但是姓名是特有的 cin.close(); } }
成员变量和静态变量的区别:
1.两者生命周期不同。静态的生命周期长
成员变量随着对象的创建而存在,随着对象的释放而释放,即成员变量的存在取决于对象的存在与否
静态变量随着类的加载而加载,随着类的消失而消失
2.调用方式不同
成员变量只能被对象调用
静态变量可以被对象调用,可以用类名调用,所以有static修饰的成员,最好用类名调用,清晰,且不用创建对象
3.
成员变量称为实例变量
静态变量称为类变量
4.两者存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据(堆里不肯能放变量,只能放实体,实体里可以有变量)
静态变量的数据存储在方法区(数据区/共享区)中的静态区,所以也叫对象的共享数据
static在使用过程中的细节:
1.访问有局限性:static修饰的方法只能访问static修饰的成员
错误代码:
import java.util.Scanner; import javax.naming.ldap.SortControl; class Person { String name; static String country = "CN"; public static void show () { System.out.print(country+" : "+name);//因为有没有static修饰的成员name //System.out.print(country+");//所以不能有name } } public class Main { static int data = 9; public static void main (String[] args) { Person BLF = new Person(); Scanner cin = new Scanner(System.in); //BLF.name = cin.nextLine(); BLF.name = "hello"; BLF.show(); cin.close(); } }
所以,static修饰的成员可以不用对象,直接用类名调用,因为对象还不存在,所以name自然也就不存在
(非静态既可以访问静态,又可以访问非静态)
2.主函数是静态的。
public class Main { static int data = 9;//静态修饰成员变量 public static void main (String[] args) { show(); } public void show() //此处如果想要调用,必须用静态修饰方法,data不加静态,叫做特有数据 //public static void show()//此方式可以访问static修饰的data { System.out.println(data); } }
想访问特有数据data,所以想要调用一个show方法,可以用对象调用
public class Main { int data = 9;//静态修饰成员变量 public static void main (String[] args) { Main BLF = new Main(); BLF.show(); } public void show() { System.out.println(data); //也可以System.out.println(Main.data);//Main. 可以省略 } }
故,主函数用来指挥其他对象工作,把代码封装到函数中,再把函数封装到每个类中,main只需要创建那么对象,指挥那么对象工作即可
未完。。。