FlinkSQL 时间类型转化使用小结

http://blog.noname.cc/2023/01/16/20230116/

在 Flink SQL 中,存在两种时间类型, 分别是 TIMESTAMP 和 TIMESTAMP_LTZ.

以下示例所用的字段: TIMESTAMP_FIELD, TIMESTAMP_LTZ_FIELD, BIGINT_FIELD, STRING_FIELD 分别代表对应类型的字段.

TIMESTAMP

TIMESTAMP <-> BIGINT

-- 在 Flink 1.14 之前

-- TIMESTAMP TO BIGINT
-- 在 Flink 1.14 之前 直接使用 cast 将 TIMESTAMP 转换为 BIGINT
CAST(timestamp_field as BIGINT) as bigint_field

-- BIGINT TO TIMESTAMP

CAST(bigint_field as TIMESTAMP) as timestamp_field

------------------------------------


-- 在 Flink 1.14 之后
DATE_FORMAT(TIMESTAMP, 'yyyy-MM-dd hh:mm:ss') as string_field

-- UNIX_TIMESTAMP 默认会使用 local time-zone, 而 DATE_FORMAT 默认会使用 UTC-0 时区的时间, 使用 UNIX_TIMESTAMP 前应该使用 CONVERT_TIMEZONE 将 UTC-0 转换为 local time-timezone
CONVERT_TZ(string_field, 'UTC', 'Asia/Shanghai') as string_field

UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as bigint_field

-- BIGINT TO TIMESTAMP
FROM_UNIXTIME(bigint_field, 'yyyy-MM-dd hh:mm:ss') as string_field

-- FROM_UNIXTIME 默认会使用 local time-zone, 而 TO_TIMESTAMP 默认会使用 UTC-0 时区的时间, 使用 TO_TIMESTAMP 前应该使用 CONVERT_TIMEZONE 转换为 UTC-0 时区
CONVERT_TZ(string_field, 'Asia/Shanghai', 'UTC') as string_field

TO_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as timestamp_field


TIMESTAMP <-> STRING

TIMESTAMP 和 STRING 进行互转时, 使用的都是 UTC-0 时区

-- 将 TIMESTAMP 类型按照指定的格式转换为 STRING

DATE_FORMAT(timestamp_field, 'yyyy-MM-dd hh:mm:ss')

-- 将 STRING 类型字段转换为 TIMESTAMP 类型 

TO_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss')

TIMESTAMP_LTZ

TIMESTAMP_LTZ <-> BIGINT

-- 将 TIMESTAMP_LTZ 类型转换为 BIGINT
-- 1. 将 TIMESTAMP_LTZ 按照指定格式转换为 STRING
-- 2. 将 STRING 转换为 时间戳 BIGINT
DATE_FORMAT(timestamp_ltz_field, 'yyyy-MM-dd hh:mm:ss') as string_field;

UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss')

-- 将 BIGINT 转换为 TIMESTAMP_LTZ
-- 直接使用 TO_TIMESTAMP_LTZ 函数
TO_TIMESTAMP_LTZ(bigint_field, 3);

TIMESTAMP_LTZ -> STRING


-- 将 TIMESTAMP_LTZ 按照指定格式转换为 STRING

DATE_FORMAT(timestamp_ltz_field, 'yyyy-MM-dd hh:mm:ss')


-- 将 STRING 转换为 TIMESTAMP_LTZ
-- 1. 将 STRING 转换为 BIGINT 时间戳
-- 2. 将 BIGINT 转换为 TIMESTAMP_LTZ
UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as bigint_field;

TO_TIMESTAMP_LTZ(bigint_field, 3);


OTHER

BIGINT <-> STRING

-- 将时间戳 BIGINT 直接格式化为 STRING
FROM_UNIXTIME(bigint_field, 'yyyy-MM-dd hh:mm:ss') as string_field

-- 将 STRING 转换为 BIGINT 类型
UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as bigint_field

TIMESTAMP <-> TIMESTAMP_LTZ

-- 可以直接 cast ,但是要注意时区的转换

CAST(timestamp_field as TIMESTAMP_LTZ)

CAST(timestamp_ltz_field as TIMESTAMP)

本文转载于网络 如有侵权请联系删除

相关文章

  • kubernetes 中 Evicted pod 是如何产生的

    线上被驱逐实例数据最近在线上发现很多实例处于Evicted状态,通过podyaml可以看到实例是因为节点资源不足被驱逐,但是这些实例并没有被自动清理,平台的大部分用户在操作时看到服务下面出现Evicted实例时会以为服务有问题或者平台有问题的错觉,影响了用户的体验。而这部分Evicted状态的Pod在底层关联的容器其实已经被销毁了,对用户的服务也不会产生什么影响,也就是说只有一个Pod空壳在k8s中保存着,但需要人为手动清理。本文会分析为什么为产生Evicted实例、为什么Evicted实例没有被自动清理以及如何进行自动清理。kubernetes版本:v1.17 $kubectlgetpod|grep-iEvicted cloud-1023955-84421-49604-5-deploy-c-7748f8fd8-hjqsh0/1Evicted073d cloud-1023955-84421-49604-5-deploy-c-7748f8fd8-mzd8x0/1Evicted081d cloud-1237162-276467-199844-2-deploy-7bdc7c98b6-26r2

  • MySQL学习-4种语言

    MySQL学习-4种语言在MySQL数据库中存在4种常见的语言,它们分别是:数据定义语言:DDL,datadefinationlanguage数据操作语言:DML,datamanipulationlanguage数据控制语言:DCL,datacontrollanguage数据查询语言:DQL,dataquerylanguage在接下来的内容中,本文将会对这4种语言进行详细地讲解:<!--MORE-->进入数据库在网上安装MySQL数据库的教程很多,不阐述安装过程。在讲解4种数据库之前,先看看怎么进入到数据库中,以macOS系统为例:方式1第一种是通过密码明文方式进入数据库中:mysql-uroot-p123456#假设用户名是root,密码是123456复制这种方式的好处是我们能够看到自己的用户名和密码,方便检查;缺点就是在系统中暴露了我们的密码,不够安全方式2第二种是通过密码暗文方式进入数据库mysql-uroot-p#按下回车再输入密码复制这种方式后面有跟上用户名,但是密码需要再输入,而且看不到我们用户的内容。优点就是安全,保证密码不泄露;缺点就是看不到输入的内容,我们

  • Android DiffUtil 封装|深拷贝

    痛点以及问题RecyclerView已经逐渐成为一个安卓开发写一个滑动布局必备的控件了,但是项目中用的大部分还是notifyDataSetChanged,而在方法注释上其实更推荐我们直接使用增删改换这四个方法。/** *Notifyanyregisteredobserversthatthedatasethaschanged. * *Therearetwodifferentclassesofdatachangeevents,itemchangesandstructural *changes.Itemchangesarewhenasingleitemhasitsdataupdatedbutnopositional *changeshaveoccurred.Structuralchangesarewhenitemsareinserted,removedormoved *withinthedataset. * *Thiseventdoesnotspecifywhataboutthedatasethaschanged,forcing *anyobserverstoassumethatallexi

  • 精通Excel数组公式009:提供多个值的数组公式

    如下图1所示,我们在单元格区域中使用数组公式生成序号,这样,使用者就不能够随意删除其中一个单元格中的序号,只能选中该区域后全部删除。图1下面是创建上面的数组公式的步骤:1.因为要生成5个数值项(即从1至5的数字),所以首先选择5个单元格,即单元格区域A2:A6。2.在活动单元格(A2)中输入公式:=ROW(A2:A6)-ROW(A2)+13.公式中使用了ROW函数,能够浏览单元格区域并得到该区域中每个单元格所在行的行号。4.公式开始部分的:ROW(A2:A6),创建了一个函数参数数组运算,得到结果数组{2;3;4;5;6}。5.减去ROW(A2),即数字2,得到数组{0;1;2;3;4}.6.再加上1得到结果数组{1;2;3;4;5}。7.公式输入完后按Ctrl+Shift+Enter键。这个数组生成5个值,并分别在5个单元格中输入这些值。这类数组公式有下列特点:1.不能对数组公式所在的区域进行部分修改。当你试图删除单元格区域A2:A6中的某个单元格中的内容、删除整行等时,会导致下图2所示的错误。图22.按Ctrl+/键可以选择当前数组公式所在的区域。3.有两种方法删除数组公式区域内容

  • 【Python3】f-string——s

    文章目录1.基本用法2.f-string的一些细节2.1引号2.2大括号2.3反斜杠2.4多行f-string3.格式化3.1类型3.2对齐与填充3.3符号位和前缀:针对数值,用于字符串会报错3.4最小宽度3.5精度3.6千位分隔符4.日期时间的格式化4.1格式化符号4.2examples5.使用lambda表达式6.f-string与对象 f-string,亦称为格式化字符串常量(formattedstringliterals),是Python3.6新引入的一种字符串格式化方法,主要目的是使格式化字符串的操作更加简便。f-string在形式上是以f或F修饰符引领的字符串(f’xxx’或F’xxx’),以大括号{}标明被替换的字段。f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。         f-string在功能方面不逊于传统的%-formatting语句和str.format()函数,同时性能又优于二者,且使用起来也更加简洁明了,因此对于Python3.6及以后的版本,推荐使用f-string进行字符串格式化。1.基本用法f-string是字符串

  • 亲耳“听见”神经网络的声音:梯度变化一听即可辨别(附代码)

    【新智元导读】训练神经网络可以用听的!Reddit网友做了一个非常有趣的实验:将每个神经网络层梯度范式转换成了一个音调,这样人类就可以凭借听觉,来很好的分辨出非常小的干扰,比如节奏和音调。训练神经网络还可以用“听”的!网友做了一个非常有趣的实验:将每个神经网络层梯度范式转换成了一个音调,这样人类就可以凭借听觉,来很好的分辨出非常小的干扰,比如节奏和音调。以往,我们在训练神经网络的时候,通常会测量许多不同的指标,例如精度、损失以及梯度等等。这些工作大部分是在TensorBoard上聚合上述度量指标并且绘制可视化。但除了视觉之外,有Reddit网友提出:用听觉也可以监控神经网络的训练! 博客地址: http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/声音是目前神经网络训练中研究较少的一个方向。人类的听觉可以很好的分辨出非常小的干扰(即使这些干扰时间很短或很细微),比如节奏和音高。 在这个实验中,研究者做了一个非常简单的例子,显示了使用每层

  • JAVA学习笔记之JAVA 对象引用以及赋值

    关于对象与引用之间的一些基本概念。      初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用混为一谈。可是,如果我分不清对象与对象引用,      那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。      为便于说明,我们先定义一个简单的类:classVehicle{ intpassengers; intfuelcap; intmpg; }复制有了这个模板,就可以用它来创建对象:Vehicleveh1=newVehicle();复制通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。1)右边的“newVehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。3)左边的“Vehicleveh1”创建了一个Vehicle类引用变量

  • QT新建文件、打开文件、保存文件

    一、首页布局界面,如图所示的界面及对象名称: 二、在头部文件中添加槽:    private slots:     void calcSlot();     //新建文件     void createNewFile();     //打开文件     void openFileSlot();     //保存文件复制三、实现槽函数://新建文件 void MainWindow::createNewFile(){     //如果当前文档的内容已经改变了     if(ui->textAreaInput->document()->isModified()){         qDebug()<<"is aready";         return;     }else{         //qDebug()<<"is null for ecit";         ui->textAreaInput->clear();         this->setWindowTitle(&quo

  • Spring源码-父子容器

    Spring源码-父子容器什么是IOC容器?最主要是完成了完成对象的创建和依赖的管理注入等等。Spring的容器主要用途?在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系。Spring父子容器流程图Spring父子容器源代码分析首先,我们先看看web.xml中常用的核心配置。<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-core.xml</param-valu

  • JVM 学习笔记(1):Java内存区域

    1、运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。--《深入理解Java虚拟机》 Java内存布局2、程序计数器1)定义程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,也就是记录下Java程序当前指令的地址偏移量,可在线程切换时记录下当前线程执行的位置,给CPU提供指令地址,以便下一次切换回来找到继续执行的位置。2)特点①线程私有的:它需要记录当前指令地址偏移量,在线程切换时如果不是每个线程都有一个计数器,将无法区分/辨认不同线程的指令执行地址;②随着线程的开始而产生,随着线程的结束而消亡:在线程开始执行到结束的区间,会失去CPU的执行权,因此必须在线程开始时就创建该计数器;③JVM规范中唯一一个没有规范内存溢出(OutOfMemoryError)的区域:计数器记录的是一个地址量

  • React核心技术浅析

    1.JSX与虚拟DOM我们从React官方文档开头最基本的一段HelloWorld代码入手:ReactDOM.render( <h1>Hello,world!</h1>, document.getElementById('root') );复制这段代码的意思是通过ReactDOM.render()方法将h1包裹的JSX元素渲染到id为“root”的HTML元素上.除了在JS中早已熟知的document.getElementById()方法外,这段代码中还包含两个知识点:以h1标签包裹的JSX元素ReactDOM.render()方法而这两个知识点则对应着React中要解决的核心问题:为何以及如何使用(JSX表示的)虚拟DOM?如何对虚拟DOM进行处理,使其高效地渲染出来?1.1虚拟DOM是什么?为何要使用虚拟DOM?虚拟DOM其实就是用JavaScript对象表示的一个DOM节点,内部包含了节点的tag,props和children.为何使用虚拟DOM?因为直接操作真实DOM繁琐且低效,通过虚拟DOM,将一部分昂贵的浏览器重绘工作转移到相对廉

  • nessus安装使用教程_kali linux全部功能教程

    一、Nessus介绍Nessus是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus作为扫描该机构电脑系统的软件。提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus专业版非免费的;家庭版是免费的,但单次任务只可以扫16个IP,这里注册的是家庭版,注册成功后会给邮箱发送一个激活码。二、安装下载家庭版 https://www.tenable.com/downloads下载kali版.deb文件 安装 dpkg-inessus.deb 安装完成会有如下提示(出现类似的提示就行): -YoucanstartNessusScannerbytyping/bin/systemctlstartnessusd.service -Thengotohttps://kali:8834/toconfigureyourscanner 首先,按要求执行命令:/bin/systemctlstartnessusd.service 然后,打开网址:https://kali:8834/ 并且输入获取的激活码(获取地址——https://www.tenable.com/p

  • 腾讯云企业收付平台商户恶意注册接口api接口

    1.接口描述接口请求域名:cpdp.tencentcloudapi.com。 商户恶意注册接口 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:QueryMaliciousRegistration。 Version 是 String 公共参数,本接口取值:2019-08-20。 Region 否 String 公共参数,本接口不需要传递此参数。 MerchantId 是 String 商户ID,调用方使用的商户号信息,与商户主体一一对应 MerchantName 是 String 商户名称 CompanyName 是 String 企业工商注册标准名称 RegAddress 是 String 注册地址 RegTim

  • 接口用例设计

     来源:腾讯移动品质中心TMQ 1.1 接口测试 接口:主要是子模块或者子系统间交互并相互作用的部分。 这里说的接口是广义的,客户端与后台服务间的协议;插件间通信的接口;模块间的接口;再小到一个类提供的方法;都可以理解为接口。 接口测试:是指针对模块或系统间接口进行的测试。 1.2 接口测试发现的典型问题 接口测试经常遇到的bug和问题,如下: (1)传入参数处理不当,导致程序crash; (2)类型溢出,导致数据读出和写入不一致; (3)因对象权限未进行校验,可以访问其他用户敏感信息; (4)状态处理不当,导致逻辑出现错乱; (5)逻辑校验不完善,可利用漏洞获取非正当利益等。 2 接口测试用例设计 上图为一个典型的接口。一个接口通常是有输入输出的,输入就是我们常见的入参,输出有时有,有时没有。调用相关接口,接口会执行相关处理逻辑。  接口测试的用例设计,主要从输入和接口处理两方面考虑: 1)针对输入,可按照参数类型进行设计; 2)针对接口处理,可按照逻辑进行用例设计;  3)针对输出,可根据结果进行分析设计。 2.1&nb

  • 正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思

    Q:经常看见的正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思?A: 称为内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更简洁。  (?i) 表示所在位置右侧的表达式开启忽略大小写模式  (?s) 表示所在位置右侧的表达式开启单行模式。  更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。  注意:(?s)通常在匹配有换行的文本时使用  (?m) 表示所在位置右侧的表示式开启指定多行模式。  更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,  而不只是与整个字符串的开头和结尾匹配。  注意:(?m)只有在正则表达式中涉及到多

  • Python中的__init__,__call__

    __init__函数 当一个类实例被创建时,__init__()方法会自动执行,在类实例创建完毕后执行,类似构建函数。__init__()可以被当成构建函数,不过不象其它语言中的构建函数,它并不创建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始化工作。通过创建自己的__init__()方法,你可以覆盖默认的__init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象__init__()需要一个默认的参数self,相当于this。 __call函数 Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。   换句话说,我们可以把这个类的对象当作函数来使用,相当于重载了括号运算符。为了弄明白python中__setattr__,__getattr__,__delattr__,__call__的作用,重写dict,扩展其功能。 1classstorage(dict): 2#通过使用__setattr__,__getattr__,__delattr__ 3#可以重写dict,使之通

  • java json数据返回值中文乱码 出现???

      后台方法返回值出现乱码   JSONObjectjson=newJSONObject(); json.put("totals1",map);  returnjson.toJSONString();   如图    解决办法:在Spring-MVC.xml配置文件添加以下配置,然后直接返回要生成Json串的对象  <mvc:annotation-driven> <mvc:message-convertersregister-defaults="true"><beanid="stringHttpMessageConverter"class="org.springframework.http.converter.StringHttpMessageConverter"><propertyname="supportedMediaTypes"value="application/json;charset=UTF-8"/></bean></mvc:messa

  • 什么是一致性Hash算法?

    一、Redis集群的使用 我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离。如下所示: 同样类似于数据库,当单表数据大于500W的时候需要对其进行分库分表,当数据量很大的时候(标准可能不一样,要看Redis服务器容量)我们同样可以对Redis进行类似的操作,就是分库分表。 假设,我们有一个社交网站,需要使用Redis存储图片资源,存储的格式为键值对,key值为图片名称,value为该图片所在文件服务器的路径,我们需要根据文件名查找该文件所在文件服务器上的路径,数据量大概有2000W左右,按照我们约定的规则进行分库,规则就是随机分配,我们可以部署8台缓存服务器,每台服务器大概含有500W条数据,并且进行主从复制,示意图如下: 由于规则是随机的,所有我们的一条数据都有可能存储在任何一组Redis中,例如上图我们用户查找一张名称为”a.png”的图片,由于规则是随机的,我们不确定具体是

  • IO-3

    回顾:学习了流:IO-->input和outputIO相当于管道作为硬盘和内存之间一种连通的方式将数据固化到磁盘,将磁盘中的数据在读取回来InputStream和OutoutStream字节输入输出流(父类)-->抽象类不能直接newReader和Writer字符输入输出流(父类)-->抽象类不能直接newread读取(磁盘的数据读取到内存中)数组-->byte和char返回值--->实际读取的长度正常读取时实际长度读取文件的末尾返回-1进行一个循环读取writer写出(将存储在数组中的数据写出去)数组--->byte和char子类: 文件字节输入输出流:FileInputStream和FileOutputStream-->完全参考父类流中的方法来使用FileOutputStream创建对象时,可以做为数据的追加-->boolean-->true追加不写或是false不追加文件字符输入输出流:FileReader和FileWritrer--->完全参考父类流中的方法 标准输入输出流System.in和System.out(重定

  • Runtime 总结

    参考文章 1.`文/滕先洪(简书作者)原文链接:http://www.jianshu.com/p/ab966e8a82e2著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”[下载地址](https://github.com/XHTeng/XHRuntimeDemo)` 2.`http://www.code4app.com/forum.php?mod=viewthread&tid=8241&highlight=runtime` 复制 什么是runtime runtime是OC底层的一套C语言的API(引入<objc/runtime.h>或<objc/message.h>),编译器最终都会将OC代码转化为运行时代码,通过终端命令编译.m文件:clang-rewrite-objcxxx.m可以看到编译后的xxx.cpp(C++文件)。 RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。 对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。 OC的函数调用成为消息

  • 单例模式

    单例模式 单例模式是指使用的时候只new一次,即使多次使用这个类,我们只需要new一次就可以,这样就达到了节省空间的效果, 单例模式分为饿汉式和懒汉式这两个模式 单例模式的无参构造的修饰符必须是私有的 为了防止调用,声明的类变量的修饰符也必须是私有的 饿汉式单例模式 饿汉式顾名思义,有一中不理性的意思,而在这里的代码,也有同意。 /** *@authorMxhlin *@Emailfuhua277@163.com *@Date2022/09/08/20:40 *@Version *@Description饿汉式单例 */ publicclassHungry{ //byte[]b1=newbyte[1024*1024]; //byte[]b2=newbyte[1024*1024]; //byte[]b3=newbyte[1024*1024]; //可能会浪费空间 privateHungry(){ } privatefinalstaticHungryHUNGRY=newHungry(); publicstaticHungrygetInstance(){ returnHUNGR

相关推荐

推荐阅读