static
static 可以修饰方法 和变量,和静态的内部类(单例的静态内部懒汉式还记得不?)
特点:
static 修饰了之后,会再类加载的时候就会去创建了,一个工程在你启动的时候,类就已经加载好了,这个时候静态方法全局唯一,内存中唯一的,因为在类加载的时候就创建好了,所以可以通过类名.方法 类名.变量就可以访问了
坏处:
生命周期比较长,除非类销毁了,才没有了
局限性:
1.静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态;
image.png
因为静态方法在类初始化的时候就创建了呀,但是非静态的变量都还没有确定内存空间,所以不行的;同样的道理,非静态的方法不能声明静态的变量,因为静态变量早就分配好了内存空间了,但是非静态方法没有被调用,还没有分配内存空间的呀
2.静态方法中不可以定义this,super关键字;因为this代表是对象,而静态存在时,有可能没有对象,且静态优先于对象存在。所以静态方法运行时,this是没有任何对象代表的。 简单说,先进内存的数据不可以访问后进内存的数据,可是后进内存数据可以访问先进内存的数据--简单来说就是没有你妈妈(static function),能有你(this)么。不可能嘛
final
fianl 可以修饰 变量 方法 和类(static 就不能修饰类了呀,除了静态内部类,对比一下)
final的意思就是最后了,比如世界末日我就是最后活下来的,我就是唯一;
如果他是变量必须已经赋值,而且不可改变(内存指向不可以改变,我的身份是不会发生变化的,但是我的相貌身体是可以发生变化的;
如果他是该方法不可以被重写;
如果是类,类不可以被继承;
image.png
就像上面的例子:如果是string 类型的话,重新赋值就改变了内存地址,如果改变这个人身份,不行的呀 ,map重新new 也是改变了内存地址也不行,但是你往map中添加内容,就像你吃胖了一样,你的身份地址没有变化是可行的,就是这样
final 修饰的方法,不可以被重写,可以被重载,重写的你就不是你了呀,但是重载就相当于你穿不同的衣服一样,还是你,所以是可以的
image.pngfinal 修饰的类不可以被继承,很好理解,因为我是这个世界上最后一个人了,没有后代,谁来继承我的帝国。。。。
Enum 枚举类
枚举类型就是特殊的类,一般就用来定义一些常量
比如你要定义 MON =1 =星期一 ,TUS=2=星期二 这样的常量数据 ,不使用枚举的话你要怎么进行初始化?
可能就会下面那样定义一个内部静态类,然后调用方法去初始化,而且 Map 的key 唯一,你还不能
map.put("MON","1");
map.put("MON","星期一");
遇到这种类型的数据要做常量的话,就会很麻烦
public static final class construct{
public static final Map week=initWeek();
static Map<String,Object> initWeek(){
Map<String,Object> map=new HashMap<>();
map.put("MON","1-星期一");
map.put("TUS","2-星期二");
return map;
}
}
所以就可以用枚举呀,直接像MON(1,"星期一")这样定义就好了,甚至可以: MON(1,"星期一","好日子") 不断添加对MON的说明
public enum TestEnum {
//定义枚举类型
MON(1,"星期一"),TUS(2,"星期二");
//定义枚举类型对应的值
private final int code;
private final String name;
//初始化枚举类对应的值
TestEnum(int code,String name) {
this.code=code;
this.name=name;
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public static void main(String[] args){
for(TestEnum testEnum:TestEnum.values()){
System.out.println(testEnum+":"+testEnum.getName()+":"+testEnum.getCode());
}
}
}
image.png
要注意的是:
1.枚举类的构造函数是私有的,从外面无法改变枚举类,本来就是定义常量,就不想让你改变
网友评论