Godot中类和静态类型

news/2024/10/19 6:38:43/

目录

关键字class_name

除了为类定义方法,我们也可以为类定义属性字段

实例释放前后的打印

Refcounted

RefCounted维护了一个引用计数器

get_reference_count

类是引用类型数据

class关键字

静态类型 

静态方法

静态方法只能访问静态变量 


  • 是面向对象编程的最基础的概念,是计算机程序实现数据信息封装的基础
  • Godot大部分内容都继承于Object,而Object就是Godot中基础的类,如果不写extends来指定继承哪个类,默认继承于Object
  • 我们自定义的类最终都要继承于Object




关键字class_name

  • 可以定义一个全局类,全局类在Godot代码中的任意部分都可以访问 
    • <类名>.成员名,访问成员
  • 类相当于我们自己定义的一种变量类型
    • <类名>.new()创建出一个类实例
    • 继承于Object类的实例就像一个游戏物体,被创建出来要释放删除,否则一直存在于内存中



除了为类定义方法,我们也可以为类定义属性字段

  • 属性就是类内部的变量,用于存储数据 



实例释放前后的打印

  • 实例释放前,输出文本Object和数字,后面的数字就是实例的唯一ID,Godot中所有类都有一个唯一ID
  • 实例释放后,输出Freed Object 

 

Refcounted

  • 我们通过调用free函数实现删除实例,这个free函数就是Godot中的Object类提供的一个函数
  • Object默认不会自动释放,需要我们在用不到这个实例之后手动调用free函数
  • 我们将类继承于RefCounted这个类
    • RefCounted同样继承于Object类,只不过这个类的内存是交给Godot管理的,在RefCounted检查到自身引用为0的时候,就会自动释放自身
    • 继承于RefCounted的类也会有一样的特点
  • 这里的my_class就是一个对实例的引用当_ready函数执行结束后,my_class这个变量会被Godot释放,同时这个变量所引用的Myclass实例的引用计数-1
    • 当引用计数归0时,Godot会立刻删除这个实例对象

RefCounted维护了一个引用计数器

  • 由于Object是一个引用类型的数据,我们定义的变量持有的只是一个内存地址 
  • 这个地址才是类实例数据存放的位置,RefCounted就是检查程序中有多少个变量引用了当前自身这个地址


get_reference_count

  • 通过get_reference_count检查当前实例有多少个引用
    • 因为没有任何变量引用实例的地址就再也访问不到程序的内存了,所以RefCounted会认为当前实例已经用不到了,随后就会释放自身
  • 这里的my_class就是对类实例的一个引用,返回1,也就是说整个程序只有一个对这个实例的引用


  • 定义一个新变量,内容为my_class,这时这个新变量也成了对这个实例的一个引用


  • 最后,将ref_my_class的值改为null,也就是这个变量不再存储对这个实例的引用,引用计数就会-1


类是引用类型数据

  • 类的实例是一个引用类型数据,引用类型数据的特点就是变量存储的,不是数据的实际内容,而是程序内存中的一个地址
  • 这个地址指向了类实例的实际数据存储的位置 
  1. 声明一个新变量my_class2,它的值为my_class,实际上,就是my_class2保存的内容变得和my_class一样
  2. my_class实际上保存的是一个地址,这个地址是我们使用Nuew函数实例化出来的类实例
  3. 所以最后,my_class和my_class2存储的都是这个类实例的内存地址

  1. 我们修改my_class中的id值为100,然后点打印,这个id值是我们刚刚在全局类Myclass中声明的一个整数属性字段
  2. 在下面,我们又声明了my_class2,它的值为my_class,我们修改my_class2的id属性,输出后发现,my_class2的改动影响了my_class
  3. 这也证明了实际我们的my_classs是全局类的Myclass实例的一个地址, 在定义my_class2时,只不过将同一地址赋值进去
  4. 多个变量指向同一个类实例对象,所以对my_class2的修改也会影响到my_class

class关键字

  • 我们通过class_name定义的是全局类,全局类在Godot整个项目内都可以通过代码实例化
  • 而我们可以通过class关键字,来定义一个内部类
    • 内部类只有当前定义部类的脚本中才可以实例化
  • class后面加上类的名称,内部类默认继承于Object
    • 同样可以使用extends关键字来指定这个内部类继承于哪个父类


  •  内部类的代码作用域和脚本的作用域不同,是两个独立的作用域,因此内部类无法访问脚本中的全局变量

静态类型 

  • 静态变量使用static关键字,在定义变量的var关键字之前对其修饰,Godot就会将变量声明为静态变量
  • 静态变量就是程序运行期间,保持其存在和值的变量
    • 即,静态变量的值是所有类实例统一的
  • 我们用new关键字实例化创建两个类的实例,这两个实例都是独立的

  • 最后输出的内容是两个不同的数值,表明两个类实例独立

  • 将num改成静态变量cnt

  • 最后输出同样的值,也就是我们最后赋值的内容
  • 对静态变量的修改,影响是全局的

静态方法

  • 在func关键字前加上static修饰符,可以声明一个静态方法
  • 我们可以直接通过类名访问静态变量或静态方法 



  • 无法访问非静态变量
    • 因为如果我们不实例化,这个非静态变量数据是不存在于程序内存中的
  •  而静态变量在程序初始化时就被创建了,因此无须我们手动实例入这个类的实例

  • 可以根据这种特性制作一些工具类 

静态方法只能访问静态变量 

  • 由于静态方法可以在不实例化时调用,所以静态方法只能访问静态变量
  • 如果类没有实例化,非静态变量是不存在于程序内存的,所以为了避免错误,静态方法就无法访问非静态变量 
  • 这里的user_name2是一个非静态变量,如果以为要对其进行修改,无法在静态方法string_add中操作

 


http://www.ppmy.cn/news/1540199.html

相关文章

通过OpenCV实现 Lucas-Kanade 算法

目录 简介 Lucas-Kanade 光流算法 实现步骤 1. 导入所需库 2. 视频捕捉与初始化 3. 设置特征点参数 4. 创建掩模 5. 光流估计循环 6. 释放资源 结论 简介 在计算机视觉领域&#xff0c;光流估计是一种追踪物体运动的技术。它通过比较连续帧之间的像素强度变化来估计图…

如何在OceanBase中新增系统变量及应用实践

因为系统变量涉及复杂的工程文件&#xff0c;为防止新增变量操作对软件系统的潜在影响&#xff0c;OceanBase为多数开发者设计了一套高效的编程框架。此框架允许开发者在新增及使用系统变量时&#xff0c;仅需专注于变量定义的细节。具体来说&#xff0c;通过运行一个Python脚本…

ISNULL 和 COALESCE 区别

ISNULL 数据库支持&#xff1a;ISNULL 是 SQL Server 特有的函数。 参数数量&#xff1a;ISNULL 接受两个参数。第一个参数是要检查是否为 NULL 的表达式&#xff0c;第二个参数是当第一个参数为 NULL 时要返回的值。 类型转换&#xff1a;如果 ISNULL 的两个参数数据类型不同&…

git 报错 SSL certificate problem: certificate has expired

git小乌龟 报错 SSL certificate problem: certificate has expired 场景复现&#xff1a; 原因&#xff1a; 这个错误表明你在使用Git时尝试通过HTTPS进行通信&#xff0c;但是SSL证书已经过期。这通常发生在使用自签名证书或证书有效期已到期的情况下。 解决方法: 1.如果是…

关于jmeter设置为中文问题之后无法保存设置的若干问题

1、jemeter如何设置中文模式 Options--->Choose Language--->Chinese(Simplifies), 如此设置后就可显示中文模式(缺点&#xff1a;下次打开还是英文)&#xff1b;如下图所示&#xff1a; 操作完成之后&#xff1a; 但是下次重启之后依旧是英文&#xff1b; 2、在jmeter.…

C# Json文件写入、读取 ,Json文件序列化、反序列化

在C#中&#xff0c;处理JSON文件的写入、读取、序列化和反序列化是一个常见的需求&#xff0c;特别是在需要与前端JavaScript应用进行数据交换或配置文件管理的场景中。下面将分别介绍如何使用.NET自带的System.Text.Json命名空间&#xff08;从.NET Core 3.0开始引入&#xff…

Android TextureView实现Camera相机预览、拍照功能

说明&#xff1a;本文使用的是Camera&#xff0c;不是Camera2&#xff0c;CameraX。 1、首先AndroidManifest添加相机使用权限 <!-- 相机相关 --><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission and…

uniapp 实现input聚焦时选中内容(已封装)兼容微信小程序

老规矩先来看看效果噻&#xff01; 从上面的录屏中我们可以看出&#xff0c;要实现input自由选中内容的功能是可以实现的&#xff0c;原理其实很简单。 直接运行即可 <template><view><!-- <input class"psd"type"digit" :value"in…