一、静态static
1.1 静态成员
类中:属性 行为 构造器
属性:又称为全局变量
有的时候,全局变量跟类的对象有关,比如(Student Name,age,gender) 但是也有的时候,全局变量可能就跟类的对象无关,比如(Math PI)
行为:同理,比如:(Student study()) ,哪些无关?,比如:StringUtil (isEmpty() hasLenth())
1.2 static
凡是跟类的对象无关的变量,我们都称为:静态变量,或者类变量
凡是跟类的对象无关的行为,我们都称为:类行为
在Java中使用static关键字,用来描述类变量,类行为
1.3 类行为或类变量的使用方式
类名.类行为,类名.类变量
package com.woniuxy.java22.study.cls;
public class StudentBean {
/**
* 对象的属性
*/
private String name;
private int age;
/**
* 对象的行为
*/
public void study() {
}
/**
* 类的行为
* 通常是工具方法
* @param a
* @param b
* @return
*/
public static int calcSum(int a,int b) {
return a + b;
}
/**
* 类的属性
* 常量
*/
private static final double PI = 3.14;
}
总结:
类的行为,通常是工具行为
类的属性:通常是类中的常量
1.4 static 方法的特点
1、静态行为不能访问实例成员(对象的属性,对象的行为)
2、实例行为可以访问静态行为(类的属性,类的行为)
二、两个初始化块
2.1 静态初始化块(掌握)
初始化:做事情之前的准备工作
静态初始块:执行在代码加载时,main()执行之前
使用场景:
1、读文件之前,需要开流
2、操作数据库之前,需要建立连接
……
static{
}
package com.woniuxy.java22.study;
public class InitBlockStudy {
static {
System.out.println("静态初始化块");
}
public static void main(String[] args) {
System.out.println("main方法");
}
}
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,原因:静态代码块最先执行,然后父类比子类先执行。