众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类。
1.修饰变量。
得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都指向同一个地址。
因此我们使用该变量的时候,直接指明类的静态变量,当然修饰符必须 public
public class StaticBean {
public static String A = "A";
}
使用方式
public static void main(String[] args) throws Exception{
System.out.println(StaticBean.A);
}
2.修饰程序块,猜猜输出结果是什么?。
public class BaseTest {
static{
System.out.println("B");
}
public static void main(String[] args) throws Exception{
System.out.println("A");
}
}
结论:JVM就会优先加载静态块中代码,因此会优先输出B,static 修饰代码块,这主要用于系统初始化。
B
A
3.修饰方法:在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象,静态方法在访问本类的成员时,只允许访问静态成员,而不允许访问实例成员变量和实例方法。
public class StaticBean {
public static String A = "A";
public String D;
public static void getMessage(){
System.out.println(A);
System.out.println(D);
}
}
上面代码,哪句是错误的,很显然。
System.out.println(D);
4.修饰类。在我们的熟知之中,static 修饰符一般用于修饰变量,程序块,方法,但是什么时候使用static来修饰类呢?
内部类。如果在外部类声明为static,程序会编译都不会过。
内部类特点如下:
那就很简单引出,什么时候会使用静态内部类呢? 我们来看下以下一个例子
public class Outer {
private int i = 0;
public Outer() {
i++;
System.out.println("=====init Outer "+i+"====");
}
public static Outer getInstance(){
return Inner.INSTANCE;
}
//静态内部类
public static class Inner{
private static final Outer INSTANCE = new Outer();
}
}
调用方
public class BaseTest {
public static void main(String[] args) throws Exception{
for(int i = 0; i < 1000;i++) {
Outer.getInstance();
}
}
}
输出结果:
=====init Outer 1====
我们总结下:
由于 INSTANCE 是常量,因此只能赋值一次;它还是静态的,因此随着内部类一起加载,这种也是单例懒汉模式的一种实现方式,同时保证了线程安全。
final 关键字可以用来修饰类,方法和变量
1.修饰类
表示该类不允许被继承,final类中的成员方法都会被隐式的指定为final方法。
public final class FinalBean {
public void test(){
}
}
2.修饰方法
表示该方法不能被重写,一个类的private方法会隐式的被指定为final方法。
以下例子SunFinalBean的test方法报错。
public class FinalBean {
public final void test(){
}
public class SunFinalBean extends FinalBean{
public void test(){
}
}
}
3.修饰变量
表示该变量必须初始化,且值不能改变。如果是基本类型则值不能改变,如果是引用类型,则引用地址不能改变,但是这个引用所指向的对象里面的内容还是可以改变的。
猜猜看,以下那句通不过编译器编译。
public class FinalBean {
private final int i = 0;
private final int j;
private final String name = "";
public FinalBean(){
j = 1;
this.name.concat("123");
this.name = "123";
}
}
这句,记住final的原理即可理解,那为什么this.name.concat("123");不会报错呢,因为底层实现是返回一个新的String对象
this.name = "123";
那static final 一起用:
static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。
以上所述是小编给大家介绍的static 和 final 和 static final区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对亿速云网站的支持!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。