俗话说,知己知彼才能百战不殆!再进攻static之前我们必须要好好了解了解它。
static的作用
可修饰属性,方法和类,接下来是具体使用
(1)修饰一个成员变量
1.被static修饰的成员变量,又叫类变量,不在依赖于对象,可直接通过类.变量名的方式调用,也可以对象.变量名调用(哪怕对象引用为null也可以正常调用)
那么还有哪些变化呢?
2.声明周期的改变:如果成员变量未被static修饰,那么他的生命周期是随对象的创建而创建,与对象共存亡。而被static修饰后,他的生命周期与类息息相关,也就是从类加载到程序结束。
*小拓展:什么是类加载?*
answer:简单理解:java类加载 是因为在运行时当它需要引用某个类的时候,
会先去加载这个类,就是去读取这个class文件到内存里面来,
但还没有创建这个类的实例。
3.对于这个成员变量的内存从原来的堆上变为了静态方法区(这个看看就好)
特点:所有对象共享,可以把共同的属性只存一份
举例:井水问题,一个村里有一口公共井,每个村民家里都有一个私人井,
那么所有的村民对象都可以使用这口井,这就是所有对象共享。
强化记忆:(回答下面问题)
请回答输出的值:
public class demoStatic {
public static void main(String[] args) {
Demo tmp1=new Demo();
tmp1.num--;
Demo tmp2=null;
tmp1.num++;
Demo.num++;
System.out.println(Demo.num);
}
}
class Demo{
public static int num=10;
}
建议上机测试哦!
(2)修饰一个成员方法
被static修饰的方法,又称为类方法,和类变量依然,不依赖对象,而依赖类。
那么他和普通的方法有什么区别呢?
首先,静态方法中不能调用非static修饰的方法和成员变量,也不能使用this关键字,更不能使用构造方法,就像这样:
那么原因也很简单:就是静态方法他不依赖对象,而普通成员变量,成员方法是依赖对象的,this关键字和构造方法也是如此。没有对象可以使用静态方法,静态变量,而普通的用不了,所以静态方法中就不能使用了。
2.第二点就是在多态中的利用了,被static修饰的方法重写的效果与普通成员方法重写效果不同:
结果:
如果删除static关键字使其变为普通方法,结果就变为了:
这点呢,知道就ok了,想要了解可以去查查相关资料哦。
(3)修饰一个类
这个主要是修饰内部类,也就是静态内部类。这个在我接下来的内部类笔记会说到。
(4)其他作用
修饰代码块,即静态代码块。执行顺序为:
静态代码块>构造代码块>构造方法
该代码块仅在第一次使用类对象时调用(就是类加载时),而且只会调用这一次!
演示:
为了防止有同学认为这是顺序问题,我特点打乱了顺序。
作用:可作项目开发中初始化数据使用。
那么这就是本篇战略的全部内容了!!!