单类
有时候不需要创建同一个类的多个对象的时候,大多数时候重复创建一个类的多个对象没有意义,还会消耗电脑的内存;我们可以写一个getInstance()方法来确保只创建了一个类
class singletonts {
private static singletonts instance;//创建一个test2的实例 instance 缓存已经创建的instance 实例
//对构造器使用private 来隐藏
private singletonts(){}
//提供一个静态的方法用来返回test2的实例,并且控制只生成一个test2对象
public static singletonts getInstance(){
//判断是否只生成一个test2对象
if(instance == null){
instance = new singletonts();//没有test2对象则创建一个
}
return instance;//若有原来的test2对象则返回,没有则返回创建的test2对象
}
}
public class test2{
public static void main(String[] args){
singletonts ts1 = singletonts.getInstance();//因为构造器被隐藏,只起到一个初始化的作用,需要使用公开的方法来创建对象,因为是静态方法,所以不需要实例化
singletonts ts2 = singletonts.getInstance();
System.out.println(ts1 == ts2); }
}
Final修饰符的规则
public class finalts {
final int F_a;
final static String str;
final int F_b;
{
F_a = 5;//可以在初始化块中对实例变量进行赋值
}
static {
str = "nice to meet u";//对于类变量需要在静态初始化块中赋值
}
finalts(){
F_b = 6;//构造器可以对即没有给定初始值,又没有在初始化块中指定默认值的变量赋值
}
public static void main(String [] args){
final String str2 = "疯狂" + "JAVA" + 99;
final String str3 = "疯狂" + "JAVA" + String.valueOf(99);//将99这一整型转换成字符
System.out.println(str2 == str3);//因为str3中调用了String 方法 所以不能被当作“宏变量处理” 所以输出false
}
}
关于宏变量:
public class finalts {
public static void main(String[] args) {
String s1 = "疯狂JAVA";
String str1 = "疯狂";
String str2 = "JAVA";
String st3 = str1 + str2;
System.out.println(st3 == s1);//因为st3的值只是抽取str1 和str2的常量池中的字符串的运算结果,是一个普通变量 所以不能让st3指向常量池中的"疯狂JAVA"
//如果需要输出True 只需要对str1 str2进行宏替换 这样可以在str3在定义时就被确定成str1+str2的字符
//final String str3 = str1 + str2;
}
}