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的一些基本知识。
java进阶11 static final关键字,码迷,mamicode.com