6.2 类和对象的概念
目录
6.2.1 什么是类
1、类(Class):
- 定义对象的蓝图,包括属性和方法。
- 示例:
public class Car { ... }
6.2.2 什么是对象
2、对象(Object):
- 类的实例,具有状态和行为。
- 示例:
Car myCar = new Car();
6.2.3 成员变量(类的属性)
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
6.2.4 成员方法(类的行为)
成员方法(Member Method)是面向对象编程中的一个概念,它指的是定义在类内部的方法。成员方法属于类的一个实例或类本身,可以访问类的属性和其它成员方法。
6.2.5 对象实例化
构造器
构造器是类中非常特殊的一种方法,使用new关键字实例化对象的时候实际上就是调用的是该类的构造器,构造器的作用就是产生对象。
5.1 默认构造器
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
public class Test{
....
}
5.2 有参构造器
public class Test{
....
public Test(int a, int b, ...){
...
}
}
注意:当类中存在显性构造器时,默认构造器将失效。
5.3 构造器重载
public class Test{
....
public Test(int a, int b, ...){
...
}
public Test(){
...
}
}
6.2.6 对象的使用
创建对象
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
下面是一个创建对象的例子:
public class Puppy{
public Puppy(String name){
//这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args){
// 下面的语句将创建一个Puppy对象
Puppy myPuppy = new Puppy( "tommy" );
}
}
编译并运行上面的程序,会打印出下面的结果:
小狗的名字是 : tommy
访问实例变量和方法
通过已创建的对象来访问成员变量和成员方法,如下所示:
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();
使用 Object 类型声明变量只能在编译时访问 Object 类中的方法和属性,但在运行时,你可以通过强制类型转换将其转换为特定类型,以便访问特定类型的方法和属性。
6.2.7 对象的销毁(GC垃圾回收器)
7.1 什么是GC
GC(Garbage Collection)是Java虚拟机(JVM)中的一项重要功能,用于自动管理堆内存中不再使用的对象,释放其占用的内存空间。GC通过标记和回收无效对象来实现内存的回收和释放,以避免内存泄漏和溢出。
下面是GC的主要工作原理和过程:
1、对象的标记:GC首先标记出所有活动对象,即仍然被引用或可达的对象。它从一组根对象开始,逐步遍历对象图,将可达的对象标记为活动对象,未标记的对象则被认为是无效的。
2、垃圾回收:在标记完成后,GC会对未标记的对象进行回收。具体的回收算法可以是不同的,常见的算法包括标记-复制算法、三色标记算法等。
3、内存压缩和整理:某些垃圾回收算法在回收完对象后,可能会产生内存碎片。为了优化内存使用,GC可能会进行内存压缩和整理操作,使得分配的对象在内存中连续存放,减少内存碎片的影响。
GC的优点是可以自动管理内存,减少了手动内存管理的复杂性,避免了内存泄漏和溢出的问题。但是,GC也会带来一定的性能开销。因此,在开发Java应用程序时,需要合理配置GC的参数和调整垃圾回收策略,以平衡性能和内存的使用。
7.2 Young GC和Full GC
Young GC和Full GC是Java虚拟机(JVM)中的两种垃圾回收(GC)方式,用于回收堆内存中的无效对象。
1、Young GC(Minor GC):Young GC主要针对新生代进行垃圾回收。
Young GC的目标是尽快回收新生代中的垃圾对象,以便为新对象的分配腾出更多的空间
由于新生代中的对象生命周期较短,因此Young GC的频率通常比较高,但每次回收的对象数量相对较少,GC的开销也较小
2、Full GC(Major GC):Full GC是对整个堆内存(包括新生代和老年代)进行垃圾回收的过程。
Full GC的触发会导致较长时间的停顿,因为它需要扫描和回收整个堆内存,对大量对象进行标记和清除
Full GC的开销相对较大,相应的STW时间较长,应该尽量避免频繁触发
STW是Stop-The-Word机制的简称,是指在执行垃圾回收过程中,暂停应用程序的执行,即停止所有应用线程的运行。STW是为了确保垃圾回收器能够安全地进行操作,不受应用程序的影响。
7.3 一次完整的GC流程
在JDK 8版本下,一次完整的GC流程大致如下图所示:
一般来说,GC的触发是在对象分配过程中,当一个对象在创建时,他会根据他的大小决定是进入年轻代或者老年代。如果他的大小超过 -xx:PretenureSizeThreshold 就会被认为是大对象,直接进入老年代,否则就会在年轻代进行创建。
在年轻代创建对象时,会先判断Eden区的空间是否充足。如果充足,则直接在Eden区分配内存创建对象;如果不足,则会尝试触发一次Young GC。
在触发Young GC之前,会先进行一次空间分配担保(后续讲解)。如果担保成功,则执行Young GC;如果担保失败了,说明老年代内存空间可能也不足,此时会触发一次Full GC。
6.2.8 匿名对象
8.1 含义
没有名字的对象 。以常规的创建对象的方法:
AtomicInteger atomicInteger = new AtomicInteger(100000);
格式: 类名 变量名 = new 类名();
这样就完成了对象的创建。注意:()内可以无参数,也可以有参数
类是模板,通过一个类,是可以创建N多个对象的。
new是一个运算符。专门负责对象的创建。
java中所有的“类”都属于引用数据类型。
但其实,创建对象的过程,也可以理解为以下两步:
类名 对象名称(或变量名) = null;
对象名称(或变量名) = new 类名();
现在没有名字,就是没有"变量名",既然没有变量名,那前边也不需要变量的类型,即"类名"。
8.2 定义格式
new 类名;
8.3 特点
一个匿名对象,只能使用一次。再次调用,就是一个新对象 。
8.4 使用场景
- 如果一个对象只用一次可以尝试使用匿名对象,这样可以节省一些内存,没有东西指向它,优先被GC回收。
"只创建一次或少次",这个条件受使用场景限制,具体情况具体分析,不做举例。
-
可以当做某个方法的实参进行传递。
-
可以作为方法的返回值进行返回。
8.5 好处
节省内存,容易被GC回收,匿名对象可以对属性赋值但毫无意义,但凡是引用数据类型能使用的,匿名对象也能使用。
8.6 限制
由8.3的特点和8.4的使用场景来看,当创建对象次数比较少时,使用匿名对象比较方便。也就是说,如果你需要频繁调用或创建对象,那就是不适合的,会造成过多的垃圾对象,造成效率降低。
标签:对象,回收,概念,GC,6.2,new,内存 From: https://www.cnblogs.com/hweiling/p/18355626