目录
类变量的引出:
类变量内存存储:
类变量性质:
什么是类变量:
如何定义类变量:
访问类变量:(满足访问修饰符的访问权限与范围)
什么时候使用类变量:
类变量与实例变量区别:
类变量细节:
类方法:
形式:
类方法的调用:
类方法以及类变量使用注意事项:
深入理解main方法
main()方法语法:
编写一个孩子类,类中有私有的一个名字,一个构造方法,以及一个加入方法
class children{
private String name;
public children(String name) {
this.name=name;
}
public void join() {
System.out.println(name+"加入了游戏。。");
}
}
现在创建若干个对象使其记录当前加入游戏的人数,可以这样进行:
public class childrengame {
public static void main(String[] args) {
int count=0;
children ch1=new children("白骨精");
ch1.join();
count++;
children ch2=new children("黑熊精");
ch2.join();
count++;
children ch3=new children("灰狼精");
ch3.join();
count++;
System.out.println("共有"+count+"个小孩加入了游戏");
}
}
运行结果如下:
这样可以完成任务,但是count是一个独立的变量,无法利用对象进行访问,没有使用到OOP,所以我们需要利用类变量(静态变量)。
改进后的children类
class children{
private String name;
public static int count=0;
//改变量会被children类的所有对象实例所共享
public children(String name) {
this.name=name;
}
public void join() {
System.out.println(name+"加入了游戏。。");
}
}
改进后的公共类
public class childrengame {
public static void main(String[] args) {
//int count=0;
children ch1=new children("白骨精");
ch1.join();
// count++;
ch1.count++;
children ch2=new children("黑熊精");
ch2.join();
// count++;
ch2.count++;
children ch3=new children("灰狼精");
ch3.join();
// count++;
ch3.count++;
// System.out.println("共有"+count+"小孩加入了游戏");
System.out.println("共有"+children.count+"个小孩加入了游戏");
//类变量可以直接通过类名进行访问
}
}
运行结果还是一样的。
主要看jdkl的版本,在jdk8之前类变量看作存储在方法区内,在jdk8以后一般认为类变量是在堆里面的类所对应的class对象的尾部
1.静态变量被同一个类所的对象共享
2.static类变量,在类加载的时候就创建了即使没有创建对象进行实例化也可以进行访问
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
定义语法:
访问修饰符 static 数据类型 变量名(推荐)
static 访问修饰符 数据类型 变量名
类名.类变量名或者(推荐)
对象名.类变量名
当我们需要某个类的所有对象都共享一个变量时,就可以考虑使用类变量,
类变量是该类所有对象所共享的,实例变量是每个对象独享的
1.、加上static称变量为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
2、可以通过 :类名.类变量名 或 对象名.类变量名 前提是满足访问修饰符的访问权限与范围,Java设计者推荐使用前者进行访问静态变量
3、实例变量不能通过 类名.类变量名 进行访问
4、类变量在类加载时就初始化了。即使你没有创建对象,只要类加载了,就可以使用类变量了
5、类变量的生命周期是随类的加载开始,随着类消亡而销毁
类方法也叫静态方法
访问修饰符 static 数据返回类型 方法名(){}(推荐)
static 访问修饰符 数据返回类型 方法名(){}
使用方式:类名.类方法名 或 对象名.类方法名[前提是 满足访问修饰符的访问权限和范围]
使用场景:如果我们希望不创建实例,也可以调用某个方法(即当作工具进行使用),这时,把方法做成静态方法非常合适。
1.类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区。类方法无this的参数,普通方法中隐含着this的参数
2、类方法可以通过类名调用,也可以通过对象名进行调用
3、普通方法和对象有关,需要通过对象名调用。对象名.方法名(参数),不能通过类名进行调用
4、类方法中不允许使用和对象有关的关键字,比如this和super。普通方法(成员方法)可以
5、类方法(静态方法)中只能访问 静态变量 或 静态方法
6、普通成员方法,既可以访问 普通变量(方法),也可以访问静态变量(方法)
总结:静态方法,只能访问静态的成员;非静态方法,可以访问静态成员和非静态成员(必须遵守访问权限)
为什么main方法是: public void static main(String[] args){}
1、main()方法是java虚拟机所调用的
2、java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
3、java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
4、该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
5、java执行的程序 参数1,参数2,参数3
java 运行的类名 第一个参数,第二个参数,第三个参数
1.在main()方法中,可以直接调用main方法所在的静态方法或静态属性
2、不能直接访问该类中的非静态成员,必须创建该类的一个实例化对象后,才能通过这个对象去访问类中的非静态成员