package a;
/*
static关键字:
1.static修饰的变量叫静态变量
2.static修饰的方法叫静态方法
3.static还可以定义静态语句块
以下演示静态语句块
static定义的静态语句块在类加载阶段执行,并且只执行一次,并且是自相而下执行的。
实例语句块:
示例语句块创建对象才执行,自上而下执行。
*/
public class StaticTest {
//静态语句块
static{
System.out.println(“1”);
}
//实例语句块
{
System.out.println(“2”);
}
{
System.out.println(“3”);
}
{
System.out.println(“4”);
}
{
System.out.println(“5”);
}
//入口
public static void main(String[] args){
//调用构造方法
new StaticTest();
System.out.println(“main execute”);
}
}
package a;
/*
static修饰的方法叫做静态方法
一般情况下工具类中的方法大部分都是静态方法。
静态方法不用创建对象也能直接访问该方法。
*/
public class StaticTest01 {
//成员方法
//成员方法必须使用“引用.”调用。
public void m1(){
}
//静态方法
//可以使用“类名.”方式调用。也可以用“引用.”,即使使用的是“引用.”,底层还是用的“类名.”
//静态方法中不能直接访问非静态数据。
//静态方法中不能使用This
public static void m2(){
}
public static void main(String[] args){
StaticTest01 st = new StaticTest01();
st.m1();
m2();
//静态的方法按照正规的方式访问“类名.”
//静态方法也能用“引用.”访问。
st.m2();//便一阶段检查出st是statictest01类型,编译通过,运行时,仍使用“staticTest01”的方式访问。
//该方法执行不需要对象。
//空的引用去访问成员的时候会出现空指针异常
//m2方法不是“成员”而是静态的
//所以即使引用为空,也不会报空指针异常。
StaticTest01 s = null;
s.m2();
}
}
package a;
/*
static修饰的变量叫做“静态变量”
变量分类:
1.局部变量
2.成员变量(示例变量,非静态变量)
3.静态变量(方法区)
什么时候变量申明成静态变量?
如果这个属性所有的对象都有,并且这个属性的值相同,则该属性声明成静态属性。
成员变量:创建Java对象的时候初始化
静态变量:在类加载阶段赋值,并且只赋值一次
*/
public class StaticTest02 {
public static void main(String[] args){
Animal a1 = new Animal(“AAA”,10);
Animal a2 = new Animal(“BBB”,11);
//如何访问(类名)
System.out.println(Animal.type);
//也可以使用引用。
System.out.println(a1.type);
Animal a3 = null;
System.out.println(a3.type);//静态变量底层访问的时候一定使用的类名。和对象无关,不会出现空指针异常。
}
}
//抽象现实世界的“陆生”动物。
class Animal{
//Field
//成员变量(一个对象一份)
//成员变量在创建对象的时候初始化,并且存储在堆中的每一个对象中。
String name;
int age;
static String type = “陆生”;
//constructor
Animal(String name,int age){
this.name = name;
this.age = age;
}
}
package a;
/*
关于代码的顺序
*/
public class StaticTest03 {
//编译通过
static int i = 100;
static{
System.out.println(i);
}
//以上代码有顺序的先后,因为都在类加载阶段执行
/*非法引用
static{
System.out.println(i);
}
static int i = 100;
*/
}