1.引出类变量
面向对象希望对象和属性绑定
package com.hansp.static_;
public class ChildGame {
public static void main(String[] args) {
int count=0;
Child c1 = new Child("白骨精");
c1.join();
count++;
Child c2 = new Child("狐狸精");
c2.join();
count++;
Child c3 = new Child("老鼠精");
c3.join();
count++;
System.out.println("共有"+count+"小孩加入了游戏");
}
}
class Child{
private String name;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name+"加入了游戏");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我们在主方法里定义了局部变量的count来记录加入的小孩数
不太符合我们面向对象的编程思想
所以我们既要
使每个对象有count属性,还要使对象操作的是同一个count来计数
怎么办呢
这时就有static变量了
我们可以
class Child{
private String name;
private static int count;//加入的代码!!!!!!,这个就是类变量(static)
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name+"加入了游戏");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这样的话
该属性最大的特点就是,会被Child类的所有对象的实例共享
2.探讨内存布局
这里我们来看类变量的的内存布局
这里分两种情况
如果你的jdk版本是在jdk7及之前
认为是在方法区里的静态域
jdk7之后的话认为是在堆里的
Class对象(随着类加载而出来的)的最后
所有的child对象共享一个count变量
类变量
3. 类变量的访问
例如之前的Child
有c1,c2和c3三个变量
可以用c1.count访问//这种情况必须先创建对象访问
最好的方法是用Child.count来访问count变量(规范)
这种情况不用创建对象即可访问(遵守访问权限),因为类变量是随着类的加载而创建的
所以没有创建对象也可以访问
一些注意事项
4.类方法
定义方式
访问修饰符 static 数据返回类型 方法名(){
}//推荐
static 访问修饰符 数据返回类型 方法名(){
}//也可以
使用方式
通过类名.方法名调用(遵循访问原则)(推荐)
或者通过对象名.方法名(遵循访问原则)
案例
这段代码很有意思,可以分析分析
我们把静态变量放入了构造器得到了我们并不想要的答案,所以我们最好不要将静态变量放入构造器中
这样就对了
当然s2.show()可以换为Stu.show()
Stu.payFee()也可以换成对于的变量调用操作的都是同一个值
经典使用场景
总而言之,工具类 ,适合用静态方法,从而不创建对象直接类名.方法名调用
注意事项
4和5尤其注意,容易出错