今天接着看了视频后面的内容,发现自己之前想得太过简单了。原理是不复杂的,但其应用是千变万化的,可能涉及到各个方面,不可大意。郝斌老师举了两个例子,让人挺受启发的。
用例1、统计一个类被创建的次数
分析:需设定一计数变量,且该变量不能被外部所修改(注意private和public的使用)
class A {
public int i=10;
private static int cnt=0; //此处使用private以保证计数变量cnt不会被外部指令修改
public A () {
cnt++; //无参创建
}
public A (int i) {
this.i = i;
cnt++; //有参创建
}
public static int getcnt () { //此处的public是因为需调用cnt以显示计数结果,但cnt为private型
return cnt;
}
}
public class examples {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("创建的A类的个数为:"+A.getcnt());
A aa1 = new A ();
System.out.println("创建的A类的个数为:"+A.getcnt());
A aa2 = new A ();
System.out.println("创建的A类的个数为:"+A.getcnt());
}
}
/*运行结果:
创建的A类的个数为:0
创建的A类的个数为:1
创建的A类的个数为:2
分析:注意其中public和private的使用
* */
用例2、只允许对某个类创建一次
/* static应用实例:只允许对某个类创建一次
* 分析:1)创建一次可以是发生多次创建时报错
* 2)或是多次创建都指向同一个类的区域【将类的所有属性均设置为static亦可实现,只是比较麻烦,且易出问题】
* */
class Student {
public int num = 0;
public String name = "0";
public char sex = '0';
public static Student s = new Student (); //定义一个【属性类】
public Student () {
}
public static Student getStudent () {
return s;
}
}
public class OnlyOneStatic {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = Student.s;
Student s2 = Student.s;
System.out.println("初始值全部为0");
s.num = 12;
s.name = "cheng";
s.sex = 'M';
System.out.println("修改s后的值");
System.out.println("编号:"+s.num);
System.out.println("姓名:"+s.name);
System.out.println("性别:"+s.sex);
s2.num = 15;
s.name = "xing";
s.sex = 'F';
System.out.println("修改s2之后的值");
System.out.println("编号:"+s.num);
System.out.println("姓名:"+s.name);
System.out.println("性别:"+s.sex);
}
}
/*运行结果:
初始值全部为0
修改s后的值
编号:12
姓名:cheng
性别:m
修改s2之后的值
编号:15
姓名:xing
性别:f
分析:修改s2的值就相当于修改s的值,两者其实是相同的
* */
事实上,这相当于把原来的单一static变量(昨天的文中的示例)替换为现在的一个
类(属性),而类由各种变量组成,即相当于把这些变量设置为static型。
总结:static方法只能直接调用同类中的static成员,而非static方法对两者(s和非s)均可以调用。
原因:静态方法使用前无需创建具体对象,而非静态方法必须先创建一个具体的对象才可使用。