一、静态static

1.1 静态成员

类中:属性 行为 构造器
属性:又称为全局变量
有的时候,全局变量跟类的对象有关,比如(Student Name,age,gender) 但是也有的时候,全局变量可能就跟类的对象无关,比如(Math PI)
行为:同理,比如:(Student study()) ,哪些无关?,比如:StringUtil (isEmpty() hasLenth())

1.2 static

凡是跟类的对象无关的变量,我们都称为:静态变量,或者类变量
凡是跟类的对象无关的行为,我们都称为:类行为
在Java中使用static关键字,用来描述类变量,类行为

1.3 类行为或类变量的使用方式

类名.类行为,类名.类变量

  1. package com.woniuxy.java22.study.cls;
  2. public class StudentBean {
  3. /**
  4. * 对象的属性
  5. */
  6. private String name;
  7. private int age;
  8. /**
  9. * 对象的行为
  10. */
  11. public void study() {
  12. }
  13. /**
  14. * 类的行为
  15. * 通常是工具方法
  16. * @param a
  17. * @param b
  18. * @return
  19. */
  20. public static int calcSum(int a,int b) {
  21. return a + b;
  22. }
  23. /**
  24. * 类的属性
  25. * 常量
  26. */
  27. private static final double PI = 3.14;
  28. }

总结:
类的行为,通常是工具行为
类的属性:通常是类中的常量

1.4 static 方法的特点

1、静态行为不能访问实例成员(对象的属性,对象的行为)
2、实例行为可以访问静态行为(类的属性,类的行为)

二、两个初始化块

2.1 静态初始化块(掌握)

初始化:做事情之前的准备工作
静态初始块:执行在代码加载时,main()执行之前

使用场景:
1、读文件之前,需要开流
2、操作数据库之前,需要建立连接
……

  1. static{
  2. }
  1. package com.woniuxy.java22.study;
  2. public class InitBlockStudy {
  3. static {
  4. System.out.println("静态初始化块");
  5. }
  6. public static void main(String[] args) {
  7. System.out.println("main方法");
  8. }
  9. }

2.2 实例初始化块(了解)

实例初始化块:执行在创建对象时,它执行在构造器步骤的,第3个步骤和第4个步骤之间

使用场景:
某个类的对象,在创建时,就需要初始化某些属性时

{

}
    package com.woniuxy.java22.study;
    public class InitBlockStudy {
        //静态初始块
        static {
            System.out.println("静态初始化块");
        }
        //实例初始化块
        {
            System.out.println("实例初始化块");
        }
        public static void main(String[] args) {
            System.out.println("主方法");
            //实例化
            InitBlockStudy ibs = new InitBlockStudy();
            System.out.println("结束");
        }
    }
    package com.woniuxy.java22.bean;
    import java.io.Serializable;
    public class StudentBean implements Serializable{
        /**
         * 
         */
        private static final long serialVersionUID = 1883972853847952652L;
        private String stuName;
        private String loginName;
        private String password;
        private int age;
    //    //实例初始化块
    //    {
    //        //初始化某些属性的内容
    //        password = "123456";
    //    }
        public StudentBean() {
            super();
            // TODO Auto-generated constructor stub
            password = "123456";
        }
        public StudentBean(String stuName, String loginName, int age) {
            this();
            this.stuName = stuName;
            this.loginName = loginName;
            this.age = age;
        }
        public String getStuName() {
            return stuName;
        }
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
        public String getLoginName() {
            return loginName;
        }
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "StudentBean [stuName=" + stuName + ", loginName=" + loginName + ", password=" + password + ", age="
                    + age + "]";
        }
        public static void main(String[] args) {
            StudentBean stu01 = new StudentBean("张三", "zs", 23);
            StudentBean stu02 = new StudentBean("李四", "ls", 25);
            System.out.println(stu01);
            System.out.println(stu02);
        }
    }

2.3 面试题(经典)

    package com.woniuxy.java22.study;
    /**
     * 定义类 A
     * @author Administrator
     *
     */
    public class A {
        /**
         * 如果有继承,一定先加载父类的静态初始化块代码
         */
        static {
            System.out.println("A");
        }
        {
            System.out.println("a");
        }
        public A(){
        }
    }
    package com.woniuxy.java22.study;
    public class B extends A {
        /**
         * 
         * 父类的静态初始化块代码加载执行完毕后,再加载子类的代码
         */
        static {
            System.out.println("B");
        }
        {
            System.out.println("b");
        }
        public B() {
            super();
        }
    }
    package com.woniuxy.java22.study;
    public class MainEnter {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            A a = new B();
            System.out.println();
        }
    }

请说出:A B a b 的执行顺序,并分析其原因

答案:执行顺序为 A B a b,原因:静态代码块最先执行,然后父类比子类先执行。