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的一些基本知识。