JVM内存分类
- 程序计数器内存:记录程序执行的行号,是和线程相关的,每当创建一个线程就会有一块程序计数器内存。
- 堆内存 :是用来存储new出来的对象。堆内存中的对象不是共享的,意味着每new一个对象就会创建一个新
的对象,对象是没有大小限制的。垃圾回收器监测堆内存中的对象,如果对象没用了,垃圾回收器对其进行 回收。 - JVM栈内存:JVM栈内存是一个先进先出的数据结构,每执行一个方法时,就会把方法的栈帧压入到JVM栈内
存中,当执行完这个方法,就把栈帧从JVM栈内存中弹出。 - 本地方法栈内存:当Java程序调用其他语言的程序时,其他语言方法在执行时使用的是本地方法栈内存。
- 方法区 :把类加载到方法区内存中。
解释 NullPointerException 空指针异常,当调用一个对象的方法或使用一个对象属性时,JVM会有一个指针 指向这个对象,方法中的this就是这个对象,属性是哪个对象的。如果这个对象是null,就会抛出空指针异 常。 换句话,也就是调用了一个空引用的属性或方法,就会抛出空指针异常。
static关键字 static是静态的意思,staitc修饰属性、方法、内部类、游离块,静态的属性和方法是属于类的,而不是对象的;静态属性对象之间是共享的。 可以通过类名直接调用静态的属性和方法了,不建议使用对象调用了
语法要求:在静态的方法中不能使用非静态的属性和方法,以及this关键字,在非静态的方法中可以调用任何的属 性和方法
游离块的概念 在类中可以定义游离块
public class Person extends Animal{
{
System.out.println("执行了Person的游离块"); }
public Person(){
System.out.println("执行了Person的构造器");
}
public static void method(){
}
public static void main(String[] args) {
Person p1 = new Person();
} }
游离块的执行顺序:先执行父类的游离块,再执行父类的构造器,再执行子类的游离块,再执行子类的构造器 静态游离块 就是在游离块前面加static修饰,静态游离块是在类被加载时执行的。静态游离块只执行一次
public class Person extends Animal{
static{
System.out.println("执行了Person的静态游离块");
}
{
System.out.println("执行了Person的游离块");
}
public Person(){
System.out.println("执行了Person的构造器");
}
public static void method(){
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
}
}
静态游离块的执行顺序:先执行父类静态游离块,再执行子类静态游离块,再执行父类的游离块,再执行父类的构 造器,再执行子类的游离块,再执行子类的构造器 通常把整个程序只执行一次的代码写在静态游离块中
设计模式 人们在工作或生活中为了解决某些特定的问题,总结的一套方式或方法。 单例设计模式:一个类只能创建出一个对象,应用场景:一些单开的窗口 饿汉写法
public class SingleTon {
private static SingleTon st = new SingleTon();
private SingleTon(){
}
public static SingleTon getInstance(){
return st;
}
}
public class Test {
public static void main(String[] args) {
SingleTon t1 = SingleTon.getInstance();
SingleTon t2 = SingleTon.getInstance();
System.out.println(t1==t2); }
}
懒汉写法
public class SingleTon {
private static SingleTon st ;
private SingleTon(){
}
public static SingleTon getInstance(){
if(st==null){
st = new SingleTon();
}
return st;
}
}
final关键字 可以修饰类、方法、局部变量和全局变量 final修饰类:不能被继承 final修饰的方法:不能被重写 final修饰的变量:不能被修改,基本类型变量的值不能修改,引用类型变量的地址不能修改,但可以改变引用对象 的属性。如果final修饰的是全局变量(属性),一定要对其进行初始化。
public class Test1 {
public void method(){
final int i = 10;
i = 10;
final Person p = new Person();
p = null;
p.name = "tom";
p.name = "jack";
}
}
public class Test1 {
final String name;
{
name = "tom";
}
}
public class Test1 {
public static final String IP = "192.168.1.10";
}
|