static 关键字:
static 修饰的东西只依赖于类存在,在内存中只存在一份,不管是通过类名调用还是实例来调用,访问的都是同一块内存
可以作用在:
方法
类
成员变量
代码块
static作用于方法的时候,该方法为静态方法,静态方法通过类名调用,静态方法中不能调用非静态方法、非静态变量。
非静态方法可以调用静态方法
静态代码块只在类加载的时候运行一次,即整个程序运行期间只会运行一次
执行顺序:static 代码块>匿名块>构造函数(不管他们在类中的相对位置)
单例模式(创建型模式):
限定某一个类在整个程序运行过程中只能有一个实例对象
public class Singleton{ private static Signleton obj=new Singleton(); private Singleton(){ } public static Singleton getInstance{ return obj; } }
final关键字
可以用来修饰
类:final类不能被继承
方法:父类中的final方法,子类不能重写
成员变量:final的基本类型变量不能再次赋值,final的对象不能修改其指针,但可以修改对象内部的值
常量设计
常量:不会被修改的变量
java中的常量:public static final 只读,不能修改仅有一份所以用public static final。常量名一般全大写,用连字符_相连
接口中定义的变量默认是常量
常量池
为了节省内存,java为包装类/字符串建立了常量池
建立了常量池的基本类型的包装类
Boolean : true false
Byte:-128-127
Character:0-127
Short,Integer,Long:-128-128
Float,Double没有常量池
堆内存和栈内存
栈内存读取速度快,容量小
堆内存堆区速度慢,容量大
基本类型的包装类和字符串有两种创建方式
Integer a=10;
String b="abc" //a,b放入栈内存,将被常量化
Integer c =new Integer(10);
String d=new String("abc") //c,d放入堆内存,不会被常量化
自动装箱和自动拆箱
Integer i2=10; //10会自动装箱成一个对象
int i1=10;
Integer i3=new Integer(10)
System.out.println(i1==i3); //true,自动拆箱 基本类型和包装类型进行比较,包装类自动拆箱
System.out.println(i1==i2); //true,自动拆箱 基本类型和包装类型进行比较,包装类自动拆箱
System.out.println(i3==i2); //false,两个对象比较是否相等比较的是地址
i2+i3 //20,会自动拆箱,变成一个int变量
String类的对象在内存中如何存在
String s0="abcdef"; //常量池
String s1="abc"+"def"; //常量池,和s0共享
String s2="abc"; //常量池
String s3=s2+"def"; //堆内存,s3是变量,编译的时候编译器不会优化
String s4="abc"+new String("def"); //堆内存,和s3不在同一个内存