首页 > 代码库 > java进阶11 static final关键字

java进阶11 static final关键字

  static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。

  被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说。

  它不依赖类的特定的实例,被类的所有实例共享。

  

package Static;

public class Static {
    /*
     * 使用的情况
     * 1:在对象之间共享值时
     * 2:方便访问变量
     * */
    
    public static void main(String[] args){
        Static1.setWord("myword");
        System.out.println(Static1.word);
    }
}
class Static1 {
    //static 全局变量
    public static String word="word";//修饰代码块
    static {
     
        System.out.println("I am here");
        
    }
    //修饰函数
    static void setWord(String nword){
        //由于static 会在实例生成之前 分配空间 所以不能有this 和super
        word=nword;
    }
    /*
     * 创建类实例时会加载类
     * 只要出现该类就是没有实例也会加载??
     * 
     * 当类被加载时,就会分配static的空间和执行static代码块
     * 在static 修饰的语句中 不能引用实例变量
     * 因为那个时候变量还没有生成
     * */
}

  这里可以看见,根本没有new Static();而是直接调用。

  因为只要这个类被加载,java虚拟机就会根据类名在运行的数据区的方法找到他们,因此,static对象可以再它的任何对象创建之前访问

  而无需引用任何对象。

  用static 修饰的成员变量和方法 本质就是全局变量和全局方法,因为java是没有全局变量这个说法的。

  该类的所有实例都共享static修饰的东西。

  在加载的时候 static修饰的代码块 或者函数会直接执行。所以输出结果如下:

  I am here
  myword

  

  static修饰的成员变量 如果前面是public 就如上面的代码 能在其他类中访问

  如果是private 则 不能让外部访问

  

package Static;

public class Static {
    /*
     * 使用的情况
     * 1:在对象之间共享值时
     * 2:方便访问变量
     * */
    
    public static void main(String[] args){
        
        System.out.println(Static1.canot);//出错
        Static1.setWord("myword");
        System.out.println(Static1.word);
    }
}
class Static1 {
    //static 全局变量
    public static String word="word";
    //设定权限,让类不能直接调用类成员 默认是public ??
    private static String canot="You can not get this Member";
    //修饰代码块
    static {
        System.out.println(canot);
        System.out.println("I am here");
        
    }
    //修饰函数
    static void setWord(String nword){
        //由于static 会在实例生成之前 分配空间 所以不能有this 和super
        word=nword;
    }
    /*
     * 创建类实例时会加载类
     * 只要出现该类就是没有实例也会加载??
     * 
     * 当类被加载时,就会分配static的空间和执行static代码块
     * 在static 修饰的语句中 不能引用实例变量
     * 因为那个时候变量还没有生成
     * */
}

  主函数的Static1.canot就会报错。

  还有一点就是 在static作用的范围类 是不能操作实例变量的,因为那个时候变量还没创建。

  

class Static1 {
    //static 全局变量
    public static String word="word";
    //设定权限,让类不能直接调用类成员 默认是public ??
    private static String canot="You can not get this Member";
    String InstanceWord="初始值";
    //修饰代码块
    static {
        System.out.println(canot);
        System.out.println("I am here");
        System.out.println(InstanceWord);//会出错
        
    }
    //修饰函数
    static void setWord(String nword){
        //由于static 会在实例生成之前 分配空间 所以不能有this 和super
        word=nword;
    }
    /*
     * 创建类实例时会加载类
     * 只要出现该类就是没有实例也会加载??
     * 
     * 当类被加载时,就会分配static的空间和执行static代码块
     * 在static 修饰的语句中 不能引用实例变量
     * 因为那个时候变量还没有生成
     * */
}

  System.out.println(InstanceWord);这句话也会出错。

  接下来就是static和final连用=全局常量

  对于常量,表示一旦给值就不可修改,并且可以通过类名访问

  对与方法,表示不可覆盖,并且可以通过类名访问。  

  

class Static2{
    //static 与final连用时=全局常量
    public static final String myword="new Word";
    public static final void setWord(){};
    
}

在主函数中更改其变量值

会报错 同理覆盖setWord方法也是一样.新建个类来覆盖该方法看看

  

class Static3 extends Static2{
    public static void setWord(){
        
    }
}

也会报错 会提示将Static2中的setWord的final 去掉。

  这就是static 和final的一些基本知识。