JAVASE-DAY06

DAY06

从昨天开始转到尚学堂300集的学习

1.对象和类

类:class。对象:Object,instance(实例)。

某个类的对象 = 某个类的实例

2.面向对象的内存分析

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

1.栈

  • 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)

  • JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)

  • 栈属于线程私有,不能实现线程间的共享

  • 栈的存储特性是“先进后出,后进先出”

  • 栈是由系统内存自动分配,速度快!栈是一个连续的内存空间!

2.堆

  • 堆用于存储创建好的对象和数组(数组也是对象)

  • JVM只有一个堆,被所有线程共享

  • 堆是一个不连续的内存空间,分配灵活,速度慢!

3.方法区(又叫静态区)

  • JVM只有一个方法区,被所有线程共享

  • 方法区实际也是堆,只是用于存储类、常量相关的信息

  • 用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)

image-20200220111020051


public class Student {
String name;
int age;
Computer c;

void sleep() {
System.out.println("我在睡觉!");
}

void eat() {
System.out.println("我在吃饭!" + c.brand);
}

void study() {
System.out.println("我在学习!");
}

Student() {

}

public static void main(String[] args) {
Student st = new Student();
Computer c = new Computer();
c.brand = "惠普";
st.c = c;
st.sleep();
st.eat();
st.study();
}

}

class Computer {
String brand;
}

3.构造方法

构造器也叫构造方法(constructor),用于对象的初始化。

构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。

构造器的名称应与类名一致。

Java通过new关键字来调用构造器,从而返回该类的实例。

声明格式:

[修饰符] 类名(参数列表){
   //n条语句
}

注意:

  1. 通过new关键字调用

  2. 构造器虽然有返回值,但不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值

  3. 如果没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义,则编译器不会自动添加

  4. 构造器的方法名必须和类名一致

4.垃圾回收机制(Garbage collection)

内存管理:

  • Java的内存管理主要指对象的管理,包括对象空间的分配和释放

  • 对象空间的分配:使用new关键字创建对象即可

  • 对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有“不可达”对象的内存空间

垃圾回收过程:

  • 任何一种垃圾回收算法一般要做两件基本事情:

    1. 发现无用的对象

    2. 回收无用对象占用的内存空间

  • 垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的是没有任何变量引用该对象。Java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

通用的分代垃圾回收机制:

不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采用不同的回收算法,以便提高回收效率。

我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为Eden、Survivor、Tenured/Old空间。

image-20200220144303371

  1. 新创建的对象,绝大多数都会存储在Eden中;

  2. 当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区;

  3. Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空;

  4. 重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中;

  5. 当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)。

5.this关键字

对象创建的过程:

  1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显示初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

this的本质是“创建好的对象的地址”!

由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以用this代表“当前对象”。

this不能用于static方法中。

6.static关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。

  • 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。

  • 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!

  • 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化0访问静态成员)。

  • 在static方法中不可直接访问非static的成员

核心要点:

static修饰的成员变量和方法,从属于类。

普通变量和方法从属于对象。

image-20200220115201355

7.参数传递机制

Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。

  • 基本数据类型参数的传值

    传递的是值的副本。副本改变不会影响原件。

  • 引用类型参数的传值

    传递的是值的副本。但引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。

猜你喜欢

转载自www.cnblogs.com/winterriver/p/12343056.html
今日推荐