一、关键字static
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存中只有一份,这时候就需要静态变量。
package day14; public class Chinese { static String country;//类变量不用实例化,直接类名.属性名就可以使用,是类的一部分,被所有这个类的实例化对象所共享,也被叫做静态变量 String name;//实例变量,只有实例化之后才能使用,属于实例化对象的一部分,不能共用 int age; //加入static以后,不用再实例化对象后才能用了 }
package day14; public class Test { public static void main(String[] args){ // Chinese c = new Chinese(); // c.country = "中国"; // c.name = "007"; // c.age = 17; // Chinese c1 = new Chinese(); // c1.country = "中国"; // c1.name = "5172"; // c1.age = 18; // Chinese c2 = new Chinese(); // c2.country = "中国"; // c2.name = "250"; // c2.age = 25; // System.out.println(c.country); // System.out.println(c1.country); // System.out.println(c2.country); // //问题:有没有办法只写一次国籍,让所有的对象都使用同一个国籍? Chinese.country = "中国";//加入static后,可以通过类名.属性访问 Chinese c = new Chinese(); c.name = "007"; c.age = 17; Chinese c1 = new Chinese(); c1.name = "5172"; c1.age = 18; Chinese c2 = new Chinese(); c2.name = "250"; c2.age = 25; System.out.println(Chinese.country); } }
二、类属性,类方法的设计思想
类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性,相应的方法设置为类方法。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
package day14; //有些方法不想通过对象的不同而频繁通过new对象的方式去调用方法,方法就写成static public class Chinese { public static void test(){//设计一个静态方法 System.out.println("这是一个静态方法"); } }
package day14; public class Test { public static void main(String[] args){ Chinese.test();//不需要实例化对象,直接通过类名.方法调用该方法 } }
打印结果为:这是一个静态方法
类方法,也就是静态方法,做工具类比较多
package day14; public class Utils { //判断字符串是不是一个空字符串 public static boolean isEmpty(String s){ boolean flag = false; if(s != null && !s.equals("")){//如果s既不是null,也不是空,那么可以判断s是一个字符串 flag = true; } return flag; } }
package day14; public class Test { public static void main(String[] args){ String s = "001"; System.out.println(Utils.isEmpty(s)); } }
打印结果为:true
三、关键字static使用范围及成员特点
1.使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
2.被static修饰后的成员具备以下特点:
①随着类的加载而加载(类加载之后,静态的方法或者属性就能用了,通过类名.方法或类名.属性)
②优先于对象存在(不用new就能用)
③修饰的成员,被所有对象所共享
④访问权限允许时,可不创建对象,直接被类调用
四、类变量
类变量(类属性)由该类的所有实例共享。(这种可以被所有实例化对象共享的属性,使用起来要慎重,因为只要一改,所有类都能得到变化)
package day14; public class Chinese { //需求,想要知道new了多少个Chinese对象 public Chinese(){ Chinese.count += 1; } public static int count; public static void showCount(){ System.out.println("总共new了" + Chinese.count + "个对象"); } }
package day14; public class Test { public static void main(String[] args){ Chinese c1 = new Chinese(); Chinese c2 = new Chinese(); Chinese c3 = new Chinese(); Chinese c4 = new Chinese(); Chinese c5 = new Chinese(); Chinese.showCount(); } }
打印结果为:总共new了5个对象
五、类方法
1.没有对象的实例时,可以用 类名.方法名() 的形式访问由static标记的类方法。
2.在static方法内部只能访问类的static属性,不能访问类的非static属性。
3.因为不需要实例就可以访问static方法,因此static方法内部不能有this。(同理也不能有super,会报错)
4.重载的方法需要同时为static的或者非static的。