这次我们来学习静态(static)

知识点

1.静态方法只能调用静态变量

2.静态变量属于整个Class,会随着发生变化。

 

案例:定义一个自动增长的学生类。

题目要求

定义一个学生类,除了姓名、性别、学历层次。

还有自动增长的学号,本科以A开头,专科以B开头。  编号从100开始,如A0103。

方法思路

1.定义学生属性,姓名name  性别sex   学历层次level   学号 studentNo

2. 学号增长函数(解决自动增长问题)

3.测试

程序代码

Student(学生类)

 1 public class Student {
 2     public static final byte MALE = 0;
 3     public static final byte FEMALE = 1;
 4     public static final byte UNDERGRATUATION = 1;
 5     public static final byte SPECIAL = 0;
 6 
 7     private static int noA ;//本科计数器
 8     private static int noB ;//专科计数器
 9 
10     private  String name;
11     private  byte sex;
12     private  byte level;
13     private  String sno;
14     // 静态代码块,实现自动增长。
15     static {
16         noA = 0;
17         noB = 0;
18     }
19 
20     /**
21      * 构造函数,构造学生信息。 并且自动生成学号
22      * @param name   姓名
23      * @param sex    性别
24      * @param level  学历
25      */
26     public Student(String name, byte sex, byte level) {
27         this.name = name;
28         this.sex = sex;
29         this.level = level;
30 
31         //自动生成学号
32         if (UNDERGRATUATION == level){
33             this.sno = String.format("A%04d",++noA); // String,format 格式化输出
34         }else {
35             this.sno = String.format("B%04d",++noB);
36         }
37     }
38 
39     /**
40      * 输出函数,输出学生的所有信息。
41      */
42     public void print(){
43         System.out.println("学号:"+sno);
44         System.out.println("姓名:"+name);
45         System.out.println("性别:"+(sex==MALE?"男":"女"));
46         System.out.println("学历:"+(level==UNDERGRATUATION?"本科":"专科"));
47         System.out.println();
48     }
49 
50     public String getName() {
51         return name;
52     }
53 
54     public void setName(String name) {
55         this.name = name;
56     }
57 
58     public String getSex() {
59         return sex == MALE?"男":"女";
60     }
61 
62     public void setSex(byte sex) {
63         this.sex = sex;
64     }
65 
66     public byte getLevel() {
67         return level;
68     }
69 
70     public void setLevel(byte level) {
71         this.level = level;
72     }
73 
74     public String getStuNo() {
75         return sno;
76     }
77 
78     public void setStuNo(String stuNo) {
79         this.sno = stuNo;
80     }
81 
82     /**
83      * 计算某种学历的总人数
84      * @param level  学历(本科 专科)
85      * @return 某种学历的注册总人数
86      */
87     public static int getCount(byte level){
88         return UNDERGRATUATION==level?noA:noB;
89     }
90 }

Test(测试)类

 1 public class Test {
 2     public static void main(String[] args) {
 3         Student stu1 = new Student("小明",Student.MALE,Student.UNDERGRATUATION);  // 小明  男   本科
 4         Student stu2 = new Student("小红",Student.FEMALE,Student.SPECIAL);        // 小红  女  专科
 5         Student stu3 = new Student("小张",Student.MALE,Student.SPECIAL);
 6         Student stu4 = new Student("小王",Student.MALE,Student.SPECIAL);
 7 
 8         stu1.print();
 9         stu2.print();
10         stu3.print();
11         stu4.print();
12 
13         int n1 = Student.getCount(Student.UNDERGRATUATION);
14         int n2 = Student.getCount(Student.SPECIAL);
15         System.out.printf("已经注册了%d个本科生,%d专科生",n1,n2);
16         System.out.println();
17     }
18 }

运行结果

心得体会

这是4个类型的使用权限。

静态 static 是属于整个class的,会随着函数的运算发生改变,而局部变量调用函数,在函数内发生了变化,然而本身并没有变化。

这个有点像   String 和 StringBuffer 。       stringBuffer也是全局改变的。

举例:

主函数中代码如下所示

    int num = 5;
    add(5);
    System.out.println(num);    

add函数

public static void add (int num){
        ++num;
        System.out.println(num);
    }

运行结果: