3

Java知识点总结(内存分析)

@(Java知识点总结)[Java, Java面向对象]

[toc]

对象内存

类是创建对象的模板

Java对象的使用时通过引用进行的
基本数据类型直接赋值,引用类型传递的是一个地址
栈:存放局部变量
堆:存放new出来的对象
方法区:存放类的信息(代码) 、static变量、常量池(字符串常量)等...

clipboard.png

Student s1 = new Student();
s1.name="张三";
s1.study();
s1.sayHello("王武");
 
Student s2 = new Student();
s2.age = 18;
s2.name="李四";

垃圾回收机制(Garbage Collection)

  1. 对象空间的分配:使用new关键字即可
  2. 对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有"不可达"对象的内存空间
  3. 要点:程序员无权调用垃圾回收器
    程序员可以通过System.gc() 通知GC运行,但是Java规范并不能保证立即运行
    finalize方法,是java提供程序员用来释放对象,或资源的方法,但是尽量少用
  4. 一个对象没有被引用,就会被Java垃圾回收机制回收

static内存

  1. 在类中,用static声明的成员变量为静态变量,或者叫做:类属性,类变量,从属于类,给对象分配的内存里没有
  2. 它为类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显示初始化
  3. 对于该类的所有对象来说,static成员变量只有一份,被该类的所有对象共享
  4. 可以使用"对象.类属性"来调用。不过一般都是用"类名.类属性"
  5. static变量置于方法区中
  6. 用static声明的方法为静态方法
  7. 类名.方法名调用
    在调用该方法时,不会将对象的引用传递给它,所以在static方法中,不可访问非static的成员
  8. 静态初始化代码块

    static{

    ...

    }

如果希望加载后,对整个类进行某些初始化操作,可以使用static初始化块

是在类初始化时执行,不是在创建对象时执行

静态初始化块中不能访问非static成员

执行顺序:上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止

多态内存

多态性是OOP的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。

这对于大型信息来说能提高系统的灵活性和扩展性

引用变量的两种类型:

  • 编译时类型 (模糊一点,一般是一个父类)
    由声明时的类型决定
  • 运行时类型(运行时,具体哪个子类就是哪个子类)
    由实际对应的对象类型决定

多态的存在要有3个必要条件:

  • 要有继承
  • 要有方法重写
  • 父类引用指向子类对象

子类如果重写了父类中的方法,方法调用的时候与实际类类型相绑定(传递的隐式参数this指向的开辟内存空间的类的对象,而不是父类的对象)

clipboard.png


public class Test {
  public static void testAnimalVoice(Animal c) {
    c.voice();
    if (c instanceof Cat) {
     ((Cat) c).catchMouse();
    }
  }
 
  public static void main(String[] args) {
    Animal a = new Cat();
    Cat a2 = (Cat) a;
    testAnimalVoice(a);
  }
}
 
class Animal {
  void voice() {
    System.out.println("发出动物的叫声");
  }
}
 
class Cat extends Animal {
  private String name = "Tom";
  void catchMouse() { //方法存在隐式参数this和super
    super.voice();
    System.out.println(this.name+"抓老鼠");
  }
}

苏生
803 声望725 粉丝