文章目录
今日提要:记得昨天我说过的static静态修饰么?今天就来简单的说说它;
1.static修饰变量
[1].静态变量的定义
- static修饰的变量被称为静态变量,也叫类变量;
- 静态变量被所有对象共享,在内存中只有一个副本;
- 当且仅当类被初次加载时会被初始化;
- 静态变量属于类;
- 通过类名可以调用静态变量,例:类名.静态变量名;
- 也可通过对象名调用,例:对象名.静态变量名;
说实话我一个中心小学肄业生,揣摩这个定义还真是有难度,反正到现在也没揣摩明白
[2].静态变量属于类
先来看个XX科技公司的员工登记表格
员工名册(类) | 员工小张(对象) | 员工小王(对象) | 员工小李(对象) | 备注 |
---|---|---|---|---|
姓名(name) | 小张 | 小王 | 小李 | 实例变量(属于对象) |
性别(gender) | 男 | 女 | 男 | 实例变量(属于对象) |
员工编号(id) | 001 | 002 | 003 | 实例变量(属于对象) |
职务( job) | 文员 | 销售 | 程序员 | 实例变量(属于对象) |
部门(department) | 办公室 | 销售部 | 开发部 | 实例变量(属于对象) |
公司(COMPANY) | XX科技公司 | XX科技公司 | XX科技公司 | 静态变量(属于类) |
员工数量(NUMBER):3人 | —— | —— | —— | 静态变量(属于类) |
从表格内可以看出,静态变量与对象的无关性,即便继续添加员工小红、小明等,所属公司也是不会变化的,还是XX科技公司,而员工数量的变化,也不影响每个对象的输出结果;
[3]静态变量的初始化
静态变量在类被初次加载时会被初始化,在内存中只有一个副本,这个对程序效率的影响应该是很大的,当一个程序指数级增长的时候,这种与对象无关的变量,不用在每一个对象开辟的内存都保存相同的内容,就好比公司变量,如果不使用静态变量每增加一个对象,就会在内存中增加一个副本;
[4].静态变量的调用
先看个例子
public class TestStaffRoster {
public static void main(String[] args) {
StaffRoster srOne = new StaffRoster("小张", "男", "001", "文员", "办公室");
StaffRoster srTwo = new StaffRoster("小王", "女", "002", "销售", "销售部");
StaffRoster srThree = new StaffRoster("小李", "男", "003", "程序员", "开发部");
srOne.showInfo();
srTwo.showInfo();
srThree.showInfo();
System.out.println("员工人数: " + StaffRoster.NUMBER);
}//end main
}//end class
class StaffRoster{
//声明项目变量
private String name;
private String gender;
private String id;
private String job;
private String department;
//声明静态变量并赋值
private static String COMPANY = "XX科技公司";
static int NUMBER = 0;
StaffRoster (String tempName, String tempGender, String tempID, String tempJob, String tempDepa){
name = tempName;
gender = tempGender;
id = tempID;
job = tempJob;
department = tempDepa;
NUMBER++;
}// end StaffRoster
void showInfo() {
System.out.println("员工姓名: "+ name + ", 性别: " + gender + ", 员工编号: " + id +", 职位: " + job + ", 部门: " + department + ", 单位: " + COMPANY);
}//end showInfo()
}//end class StaffRoster
从程序里可以看出来,静态变量也必须遵守范围权限的要求,而且个人认为静态变量对封装的要求应该更严格的,因为静态变量影响的数据范围更大
静态变量咱们先学习到这里,有些问题还是搞不清楚,能搞清楚的就是上面这些了
2.static修饰方法
[1].静态方法的定义
- static修饰的方法叫做静态方法,也称为类方法;
- 静态方法内只能通过对象调用非静态变量和非静态方法(看看main()的对象调用,这点就明白了);
- 静态方法内不能有this关键字;
- 静态方法可以通过:类名.方法名 和 对象名.方法名,调用;
定义很好理解,所以就不多解释了,但是应用方法应该很具有挑战性,未来练习里面再看吧
[2].静态方法的调用
public class TestStaffRoster {
public static void main(String[] args) {
StaffRoster.info();
}// end main
}//end class
class StaffRoster{
static void info(){
System.out.print("这是静态方法");
}//end info
}//end class StaffRoster
没啥可说的一眼就能看明白了,实在不明白,运行下也明白了;
3.静态块
[1].静态块定义
- 类加载的时候,静态块会执行一次,且只执行一次;
- 一个类里可以有多个静态块,静态块里面不能包含this关键字;
[2].静态块和匿名块的演示,运行下程序就能看出来区别
public class TestStaffRoster {
public static void main(String[] args) {
StaffRoster srOne = new StaffRoster("小张", "男", "001", "文员", "办公室");
StaffRoster srTwo = new StaffRoster("小王", "女", "002", "销售", "销售部");
StaffRoster srThree = new StaffRoster("小李", "男", "003", "程序员", "开发部");
srOne.showInfo();
srTwo.showInfo();
srThree.showInfo();
System.out.println("员工人数: " + StaffRoster.NUMBER);
}//end main
}//end class
class StaffRoster{
//声明项目变量
private String name;
private String gender;
private String id;
private String job;
private String department;
//声明静态变量并赋值
private static String COMPANY = "XX科技公司";
static int NUMBER = 0;
StaffRoster (String tempName, String tempGender, String tempID, String tempJob, String tempDepa){
name = tempName;
gender = tempGender;
id = tempID;
job = tempJob;
department = tempDepa;
NUMBER++;
}// end StaffRoster
{
System.out.println("这是匿名构造块");
}
static {
System.out.println("这是静态构造块");
}
void showInfo() {
System.out.println("员工姓名: "+ name + ", 性别: " + gender + ", 员工编号: " + id +", 职位: " + job + ", 部门: " + department + ", 单位: " + COMPANY );
}//end showInfo()
}//end class StaffRoster
定义还是相当好理解的,根据我学习过的东西的常识,越是好理解的东西,运用好了,就越难
小贴士
向方法传递参数,基础类型参数,传递的只是副本,在方法中改变的只是副本的值,不会改变原始对象;如果传递的是引用型参数,传递的是存储值的内存位置,并不产生副本,所以在方法中改变值,会改变原始对象。
标签:StaffRoster,JAVA,第十天,静态,static,end,日志,变量,String From: https://blog.csdn.net/mycqyjn/article/details/140241246