static:表示静态,是Java的一个修饰符,可以修饰成员方法,成员变量
静态变量:被static修饰的成员变量
特点:
1.被该类所有对象共享
2.不属于对象,属于类
3.随着类的加载而加载,优先对象存在
调用方式:
1.类名调用[推荐]
2.对象名调用
静态方法:被static修饰的成员方法
特点:
1.多用在测试类和工具类中
2.Javabean类中很少会用
调用方式:
1.类名调用[推荐]
2.对象名调用
静态和非静态方法的有什么区别?
1.静态的属于类,成员的属于对象
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法.
3.静态方法没有this关键字
咋一听好像很绕,我们从两个角度来进行理解:
1.代码方面理解
①静态方法不能访问非静态变量和方法,静态方法中没有this关键字。
结果分析:
从代码可以看出,我们把name设置为非静态变量,AnimalName设置为静态变量。定义一个静态方法去输出name和AnimalName,可以看到name代码处报红。
运行之后,看到控制台提示:无法从静态上下文中引用非静态变量 name和无法从惊天上下文运用非静态变量this。
解释了静态方法不能访问非静态的成员,可以看到这里的this也是非静态,也解释为什么静态方法中没有this关键字。
②非静态方法可以访问静态和非静态的成员属性和方法。
结果分析:
把method声明为非静态的,可以访问静态变量AnimalName和静态变量name,也可以看到this调用了静态变量AnimalName。this代表的调用者的地址,即创建的animal对象。
结果说明:非静态方法可以访问静态和非静态的成员属性和方法。
2.内存方面理解
看完了代码,大家应该理解非静态和静态方法的区别了,然后我们来看一下内存中它们是怎么存储的。
可以看到,三个对象是存储在非静态区,静态属性是存储在静态存储区的,当对象需要调用静态属性时,可以到静态存储区去找。
静态存储区时创建的时候就加载进去了,静态存储区的内容是被该类所有对象所共享的,而对象的属性是它们所独有的。
静态内存区的属性可以通过类名.静态属性调用。也就解释了静态的属于类,成员的属于对象。