前言
说多了尽是吹水,还记不住。这里捡精要的写,怎么土怎么写,哈哈
static变量
特点:
1.static修饰的变量和方法独立于类的任何实例(不需要new),被所有的实例共享
2. 先于构造函数、成员变量、方法创建,一旦创建不再销毁(所以普通方法内可以调静态变量/方法,静态方法内不能调成员变量/方法)
好处:不用生成类的实例就能直接调用(不用new,通过类名直接调)
就好比中国的土地只要地球不灰飞烟灭,就算遇到核爆也是存在的,是全国人民的,谁都可以用,但谁也不属于,用完还得还给国家,无!论!多!久!
非静态变量/方法就好比土地上的房子,用的时候先创建,用完以后再拆了(释放内存)嗯,拆房子的事儿给Java做的
static变量都是成员变量,从未听闻有局部变量的
内存分配:
静态变量在内存中只有一份,JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。
非静态的成员变量没有new就没有分配内存,new多少个实例,分配多少份内存(比静态变量耗内存吧?没有对比就没有伤害哈)
初始化:
按定义的顺序一个一个来
static方法
综合开篇的概述与static变量的特点就是static方法的特点啦
至此飘过~~~~
static静态代码块
特点:
- 没有名字
- 位置随意
- 个数随意
- 自动执行
- 只执行一次
- 先于静态变量/方法、成员变量/方法执行。
- 一般用于应用的初始化
静态导包
这个用得比较少,使用很简单,使用静态导包后,被导的包的变量、方法用着就像自己的一样,不用再通过类名调了,
静态类
只可以修饰静态内部类
用得实在不多,关键时候用对了有四两拨千斤之效
它与非静态内部类的区别是:
定义
1. 非静态内部类的成员变量和方法不能定义成静态的
2. 静态内部类是可以的
使用
1. 非静态内部类可以随意的访问外部类的成员变量/方法,即使是private的。
2. 静态内部类访问外部类的对象,只能访问静态的成员(非静态的不能访问)
3. 创建静态内部类时不需要将静态内部类的实例绑定到外部类的实例上
网上说在程序进行测试的时候很有用,但是看了好几遍,没有看明白测试的时候怎么好用,想看的话可以参考这篇博客:
https://www.cnblogs.com/gaodong/p/3608665.html
static关键字总结:
1. 全局唯一,任何修改都是全局性的
2. 只加载一次,优先于非静态
3. 使用方式上不依赖于实例对象
4. 征集周期属于类级别的,从JVM加载开始到JVM身死道消
最后的最后,来个Demo吧,搞编程最忌讳纸上谈兵
public class OuterClass {
private static String msg = "哈哈哈哈";
private String rrr = "嘻嘻嘻嘻";
//静态内部类
public static class NestedStaticClass{
public static String sss = "呵呵呵呵";
public String aaa = "嘿嘿嘿嘿";
//试着将msg改成非静态的,这将导致编译错误
public void printMessage(){
System.out.println("静态内部类的非静态方法调用<外部类>的静态成员变量 --> " + msg);
//调不到外部类的非静态成员变量
// System.out.println("静态内部类的非静态方法调用<外部类>的静态成员变量: " + rrr);
System.out.println("静态内部类的非静态方法调用<内部类>的静态成员变量 --> " + sss);
System.out.println("--------------------------------------------------");
}
public static void staticPrint(){
System.out.println("静态内部类的静态方法调用<外部类>的静态成员变量 --> " + msg);
System.out.println("静态内部类的静态方法调用<内部类>的静态成员变量 --> " + sss);
System.out.println("--------------------------------------------------");
}
}
public class InnerClass{
//非静态内部类定义静态成员会报错的,所有注释掉
// public static String iii = "我是非静态内部类的静态成员变量";
public String ooo = "呜呜呜呜";
public void display(){
System.out.println("非静态内部类的非静态方法调用<外部类>的<静态成员变量> --> " + msg);
System.out.println("非静态内部类的非静态方法调用<外部类>的<非>静态成员变量 --> " + rrr);
System.out.println("非静态内部类的非静态方法调用<内部类>的<非静态成员变量> --> " + ooo);
System.out.println("--------------------------------------------------");
}
}
public static void main(String[] args) {
//调用静态内部类的静态方法
OuterClass.NestedStaticClass.staticPrint();
//调用静态内部类的非静态方法
OuterClass.NestedStaticClass printer = new OuterClass
.NestedStaticClass();
printer.printMessage();
//调用非静态内部类的非静态方法
OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
innerObject.display();
}
}