首页 > 其他分享 >类和对象的概念

类和对象的概念

时间:2024-08-13 17:17:39浏览次数:6  
标签:对象 回收 概念 GC 6.2 new 内存

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流程大致如下图所示:

img

一般来说,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 使用场景
  1. 如果一个对象只用一次可以尝试使用匿名对象,这样可以节省一些内存,没有东西指向它,优先被GC回收。

​ "只创建一次或少次",这个条件受使用场景限制,具体情况具体分析,不做举例。

  1. 可以当做某个方法的实参进行传递。

  2. 可以作为方法的返回值进行返回。

8.5 好处

节省内存,容易被GC回收,匿名对象可以对属性赋值但毫无意义,但凡是引用数据类型能使用的,匿名对象也能使用。

8.6 限制

由8.3的特点和8.4的使用场景来看,当创建对象次数比较少时,使用匿名对象比较方便。也就是说,如果你需要频繁调用或创建对象,那就是不适合的,会造成过多的垃圾对象,造成效率降低。

标签:对象,回收,概念,GC,6.2,new,内存
From: https://www.cnblogs.com/hweiling/p/18355626

相关文章

  • 内存泄漏的概念及其产生原因和规避手段
    Memoryleak内存泄漏是指:程序在动态分配内存后,由于某种原因未能释放或无法释放这些内存,导致系统内存的浪费。产生内存泄露的原因上述定义表示了一种现象,没有定义原因。要避免这种现象,就要探究产生现象的原因。内存泄漏是在程序运行过程中产生的,程序运行依赖的是我们的指令,即程......
  • 好用的方法,数组对象比较并返回差异
    /***方法名:*功能介绍:返回一个对象里面包含后一个数组比第一个数组增加、减少的数据(适用于去重过后的数组)*参数:*beforeArr:前一个数组*afterArr:后一个数组*/constcompare=(beforeArr,afterArr)=>{ letresObj={ insertList:[], deleteList:[], ......
  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.1 树的基本概念
     一、单项选择题————————————————————————————————————————解析:树是一种分层结构,它特别适合组织那些具有分支层次关系的数据。正确答案:D————————————————————————————————————————解......
  • C++:类与对象(下)
    再探构造函数        构造函数体赋值与初始化列表其实之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,C++规定初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟......
  • C++:类与对象(中)
    类的默认成员函数:        在C++中,如果你没有显式地定义某些特定的成员函数(如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符和移动构造函数),那么编译器会自动生成这些函数。这些由编译器自动生成的函数被称为默认成员函数。        构造函数   ......
  • 机器学习——完整的基础概念学习,机器学习分类
    机器学习——完整的基础概念学习,机器学习分类一、机器学习与深度学习机器学习与深度学习的区别和联系机器学习是人工智能的一个分支,它使计算机能够通过学习数据和模式来自动改进和优化算法。相比之下,深度学习是机器学习的一个子集(是机器学习的一种),它依赖于类似于人脑的神......
  • C++类和对象(类的定义)
    目录一·类的定义1.1类的定义格式1.2访问限定符(public、private、protected)1.3类域一·类的定义1.1类的定义格式定义类的关键字是class,类定义结束时,后面的分号不能省略。类体中的内容称为类的成员:①类中的变量称为类的属性或成员变量;②类中的函数称为类的方......
  • 【C++面向对象】泛型编程(模板) 新手小白都能懂!
    目录泛型编程是什么?模板和泛型编程的关系?函数模板定义调用类模板定义调用总结/小注泛型编程是什么?顾名思义,“泛型”即“广泛的类型”,即不拘泥于一种特定类型的编程方法。在泛型编程时,我们通常使用一个或多个类型占位符来表示一种或多种类型,这些类型对于模板而言......
  • 类和对象(中)
    ......
  • 《NET CLR via C#》---第五章(基元类型,引用类型和值类型,对象相等性和同一性,对象哈希码)
    基元类型编译器直接支持的数据类型称为基元类型(primitvietype),基元类型直接映射到Framework类库(FCL)中存在的类型。例如,C#的int直接映射到System.Int32类型。因此,以下4行代码都能正确编译,并生成完全相同的IL:inta1=0;//最方便的语法System.Int3......