1、static修饰的变量叫"静态变量"
2、static修饰的方法叫"静态方法"
3、定义静态语句块:在类加载阶段执行,并且并上而下只执行一次。
静态语句块栗子:
public class p {
// 静态语句块
static {
System.out.println(1);
}
static {
System.out.println(2);
}
static {
System.out.println(3);
}
static {
System.out.println(4);
}
static {
System.out.println(5);
}
// 入口
public static void main(String [] args) {
System.out.println(6);
}
}
输出 123456
我们再看实例语句块
每一次调用构造方法之前会执行一次。
实例语句块执行顺序也是自上而下。
举个栗子:
public class p {
// 静态语句块
static {
System.out.println("A");
}
{
System.out.println(2);
}
{
System.out.println(3);
}
// 入口
public static void main(String [] args) {
new p();
new p();
}
}
执行结果:
A
2
3
2
3
4、静态方法中不能直接访问非静态数据。
5、静态方法中不能直接使用this 。
6、一般情况下大多数工具类使用静态方法,静态方法中不用创建对象直接访问。
7、调用可以由 “类名.”调用,也可以由“引用.”调用。即使用的是“引用.”,底层还用的“类名.”
举个栗子:
public class p {
public void m1() {
System.out.println("非静态");
}
public static void m2() {
System.out.println("静态");
}
// 入口
public static void main(String [] args) {
p st = new p();
st.m1();
m2();
st.m2(); // 编译阶段检查出st是p类型,编译通过,运行时,任然使用“p.”的方式访问,该方法执行不需要对象。
// 空的引用去访问成员时会出现空指针异常,m2方法不是“成员”而是静态的。即使引用空的指针,也不会空指针异常。
p st1 = null;
st1.m2();
}
}
输出结果:
非静态
静态
静态
静态
变量的分类
注意:成员变量、局部变量、静态变量 对比
![](https://img.haomeiwen.com/i10196679/c73ea6c76d972a58.jpg)
注意:类和对象的区别
class 类 --->这个就是类
那么对象是什么?
栗子:
class P
P p = new P();
p.函数()
p.变量
这个p就是对象,对象可以调用类中的各种功能
1、局部变量 (栈)
2、成员变量(实例变量、非静态变量)(堆)
3、静态变量(方法区)
什么时候变量声明静态变量?
如果这个属性所有的对象都有,并且这个属性的值是相同的,则该属性声明成静态的属性。
成员变量:创建java对象的时候初始化
静态变量:在类加载阶段赋值,并且只赋值一次。
public class p {
// 入口
public static void main(String [] args) {
Animal a1 = new Animal("aaa",10);
Animal a2 = new Animal("bbb",100);
System.out.println(Animal.type);
// System.out.println(a1.type); 静态变量底层访问时,一定使用“类名.”,与对象无关。
}
}
class Animal{
// 成员变量(一个对象一份)
// 成员变量在创建对象的时候初始化,并且存储在堆中的每一个对象中。
String name;
int age;
// String type = "陆生";
// 静态变量,被存储在方法区,所有的java对象共享这一份
// 所以静态变量是类级别,使用“类名.”的方式访问
String type = "陆生";
//Constructor
Animal(String name,int age){
this.name = name;
this.age = age;
System.out.println(this.age + " " + this.name);
}
}
![](https://img.haomeiwen.com/i10196679/451776b3bce8c7fd.png)
type是经常使用的公共类,所以名为静态类
public class p {
// 入口
public static void main(String [] args) {
Animal a1 = new Animal("aaa",10);
Animal a2 = new Animal("bbb",100);
System.out.println(Animal.type);
// System.out.println(a1.type); 静态变量底层访问时,一定使用“类名.”,与对象无关。
}
}
class Animal{
// 成员变量(一个对象一份)
// 成员变量在创建对象的时候初始化,并且存储在堆中的每一个对象中。
String name;
int age;
// String type = "陆生";
// 静态变量,被存储在方法区,所有的java对象共享这一份
// 所以静态变量是类级别,使用“类名.”的方式访问
static String type = "陆生";
//Constructor
Animal(String name,int age){
this.name = name;
this.age = age;
System.out.println(this.age + " " + this.name + " " + Animal.type);
}
}
![](https://img.haomeiwen.com/i10196679/7d70f704155255e4.png)
注意:
空指针异常:空引用访问成员
网友评论