变量与对象 final关键字 和 static关键字

2021-05-01  本文已影响0人  _River_
1:变量与对象
Bean bean = new Bean();
这个bean即是对象 但 同时也是变量

回到最开始对变量与对象最基本的定义:
变量的定义:【数据类型】 【变量名】;
数据类型又分为两种:基本数据类型和引用数据类型。

基本数据类型:int  long 等等等等
引用数据类型:String 等等

那么对象呢?
实际上String不就是对象吗  因此对象也就是变量的一种 ,只不过是引用对象类型的变量。
2:final与static的定义
Final(最终的)final修饰类 类不能被继承
final修饰方法 方法不能被重写

final修饰的变量为常量 值不能被改变 
修饰变量后,该值必须赋值并且不可以被修改

注意:
final修饰的变量初始化变为常量 也是在类加载阶段执行
final修饰的变量初始化变为常量 也是在类加载阶段执行
final修饰的变量初始化变为常量 也是在类加载阶段执行

static不能修饰类

静态方法可以用 类名.静态方法名 直接使用 
静态变量可以 类名. 静态变量名称  直接使用

如果属性或者方法没有被static 则需要先把该类的对象创建出来

对象名.方法名 使用普通方法
对象名.变量名  使用普通变量

第一次:new Bean();   类会进行懒加载 (类加载仅执行一次) 这时候会执行static修饰的静态代码块  并且初始化  静态变量
new Bean(); 
第二次:new Bean();  这个时候不会进行类加载了
new Bean();   

特别注意:
用static修饰的变量时,  在类加载时就会去初始化变量   而静态方法时需要调用的时候才执行
用static修饰的变量时,  在类加载时就会去初始化变量   而静态方法时需要调用的时候才执行
用static修饰的变量时,  在类加载时就会去初始化变量   而静态方法时需要调用的时候才执行

特别注意:
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。
3:final与static 一起使用
final和static一起用
static final用来修饰成员变量和成员方法,可简单理解为全局常量
修饰变量,表示一旦赋值就不能修改,可以通过类名可以访问。
修饰方法,表示不可以覆盖,可以通过类名直接访问

例子:被 final修饰的变量必须赋值
public final static String string=“hesuijin”;

4:对于单例模式 final static 他们之间有什么关系
个人认为 他们没有任何关系
只因他们所各有的特质,搭配起来使用,可以达到单例的效果。
虽然final 修饰的这个变量本身是不能被改变的,但并不妨碍我new出更多的uniqueInstance。

注意:现在把final去掉 也可以生成单例
        但是注意每一次都会把这个单例重新初始化
           
你首先要明白final修饰变量的功能是,一次初始化不能再被修改,既然是私有变量,就只考虑内部对这个变量的处理了,
如果需要修改就不加final 而在单例模式中,如果存在释放资源的情况下,就不能加final修饰
public void releaseInstance(){
    if(instance != null){
    instance = null;
    }
}

饿汉式:在类加载时产生单例对象
懒汉式:在静态方法被调用时产生单例对象

对于单例的更多深入了解,请查看单例设计模式(双重校验  饿汉式 懒汉式的选择)
//饿汉式
public class Singleton {  
    //1:类加载时 静态变量需要初始化
    private static Singleton uniqueInstance = new Singleton();  
   
   //2:由于步骤1 导致需要执行 Singleton构造方法
    private Singleton (){}  

    public static Singleton getInstance() {  
    return uniqueInstance ;  
    }  
}
//懒汉式
public class Singleton {
    //1:类加载时  定义一个静态变量存储当前类的对象
    private static Singleton uniqueInstance = null;
   
   //3:由于步骤2  导致需要执行 Singleton构造方法
    private Singleton(){}
    
    //2:在该静态方法调用时   定义一个静态方法返回类的对象
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
上一篇下一篇

猜你喜欢

热点阅读