iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java和ABAP中的引用类型有哪些
  • 645
分享到

Java和ABAP中的引用类型有哪些

2023-06-02 22:06:04 645人浏览 薄情痞子
摘要

本篇内容介绍了“Java和ABAP中的引用类型有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java编程语言中几种不同的引用类型是面试

本篇内容介绍了“Java和ABAP中的引用类型有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java编程语言中几种不同的引用类型是面试时经常容易被问到的问题:强引用,软引用,弱引用,虚引用。

其实除了Java之外,某些 其他编程语言也有类似概念,比如ABAP。今天我们就来比较一下。

根据ABAP帮助文档,我们可以把某个对象的引用包在一个Weak Reference的实例里。ABAP的Weak Reference实例通过类CL_ABAP_WEAK_REFERENCE实现。

看下面的例子:首先我在堆上创建了一个新的LCL_PERSON实例,然后包到一个ABAP weak reference里。

lo_person = NEW lcl_person( 'Jerry' ).

lo_weak = NEW cl_abap_weak_reference( lo_person ).

Java和ABAP中的引用类型有哪些

稍后,我们想拿到被包裹的lo_person引用时,使用weak reference提供的get方法。见下图示例:

lo_person = CAST lcl_person( lo_weak->get( ) ).

引用lo_person什么时候会变成initial呢?如果当ABAP垃圾回收器(Garbage Collector)开始工作时,已经没有任何引用再指向lo_person, 则lo_person会变成initial。

看下面这个例子加深理解。

REPORT ztest.PARAMETERS: clear TYPE char1 as CHECKBOX DEFAULT abap_true,GC TYPE char1 as CHECKBOX DEFAULT abap_true.CLASS lcl_person DEFINITioN.PUBLIC SECTION.DATA: mv_name TYPE string.METHODS: constructor IMPORTING !iv_name TYPE string.ENDCLASS.CLASS lcl_person IMPLEMENTATION.METHOD: constructor.me->mv_name = iv_name.ENDMETHOD.ENDCLASS.START-OF-SELECTION.DATA: lo_person TYPE REF TO lcl_person,lo_weak TYPE REF TO cl_abap_weak_reference.lo_person = NEW lcl_person( 'Jerry' ).lo_weak = NEW cl_abap_weak_reference( lo_person ).IF clear = abap_true.CLEAR: lo_person.ENDIF.IF gc = abap_true.cl_abap_memory_utilities=>do_garbage_collection( ).ENDIF.lo_person = CAST lcl_person( lo_weak->get( ) ).IF lo_person IS INITIAL.WRITE: / 'reference not available'.ELSE.WRITE: / 'reference still available'.ENDIF.

这个report有两个开关,如下图。第一个开关控制lo_person这个引用是否被关键字CLEAR显式地置为INITIAL, 第二个开关决定是否在代码中显式地调用ABAP垃圾回收器。

Java和ABAP中的引用类型有哪些

这两个开关的打开和关闭状态,一共有4种组合。

Java和ABAP中的引用类型有哪些

在第一种情况下,通过关键字CLEAR清除了lo_person的引用,从ABAP的内存检查器(事务码s_memory_inspector)能发现,lo_person现在已经不指向任何内存中的对象了。

Java和ABAP中的引用类型有哪些

对于其他三种情况,LCL_PERSON的实例都不会被ABAP垃圾回收器清除:

Java和ABAP中的引用类型有哪些

Java

Java中的weak reference表现行为和ABAP一致。

我把上面的ABAP测试代码用Java程序重新写一遍:

import java.lang.ref.WeakReference;class Person {    private String mName;    public Person(String name) {        this.mName = name;    }    public String getName() {        return this.mName;    }}public class WeakReferenceTest {    public static void check(Person person) {        if (person == null) {            System.out.println("Reference invalid");        }        else {            System.out.println("Reference still available");        }    }    public static void main(String[] args) {        Person jerry = null;        WeakReference<Person> person = new WeakReference<Person>(new Person(                "Jerry"));        jerry = new Person("Ben");        // if you comment out this line, Reference will be available        System.gc();        Person restore = person.get();        check(restore);    }}

ABAP Soft reference - ABAP软应用

在我目前使用的ABAP Netweaver 750 SP4系统中,ABAP软应用尚未实现,

Java和ABAP中的引用类型有哪些

Java和ABAP中的几种引用类型的分析和比较

在系统里只有个空的CL_ABAP_SOFT_REFERENCE, 其描述信息写的是Do Not Use this Class!

Java和ABAP中的引用类型有哪些

Java和ABAP中的几种引用类型的分析和比较

那么我们就来试试Java的软应用 Soft Reference:

package reference;import java.lang.ref.SoftReference;import java.util.ArrayList;class Person2 {    private String mName;    public Person2(String name) {        this.mName = name;    }    public String getName() {        return this.mName;    }    public void finalize() {        System.out.println("finalize called: " + this.mName);    }    public String toString() {        return "Hello, I am " + this.mName;    }}public class SoftReferenceTest {    public static void main(String[] args) {        SoftReference<Person2> person = new SoftReference<Person2>(new Person2(                "Jerry"));        System.out.println(person.get());        ArrayList<Person2> big = new ArrayList<Person2>();        for (int i = 0; i < 10000; i++) {            big.add(new Person2(String.valueOf(i)));        }        System.gc();        System.out.println("End: " + person.get());    }}

控制台打印出的输出:

Hello, I am Jerry

End: Hello, I am Jerry

即便我创建了1万个Person对象的实例,确实消耗了一些内存,然后内存消耗还远远没有大到会导致包含在软应用中的Person2类的引用被jdk删除掉的程度。因此我在代码中调用Java的垃圾回收器System.gc()之后,该引用仍然存在。

在Java中,软应用通常被用来实现在内存资源很有限的环境下的缓存机制,比如Android手机开发中。

Java 虚引用 PhantomReference

使用下面的代码测试虚引用:

package aop;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;public class PhantomReferenceTest {    public static void main(String[] args) {        Object phantomObj;        PhantomReference phantomRef, phantomRef2;        ReferenceQueue phantoMQueue;        phantomObj = new String("Phantom Reference");        phantomQueue = new ReferenceQueue();        phantomRef = new PhantomReference(phantomObj, phantomQueue);        System.out.println("1 Phantom Reference:" + phantomRef.get());        System.out.println("2 Phantom Queued: " + phantomRef.isEnqueued());        phantomObj = null;        System.gc();        System.out.println("3 Anything in Queue? : " + phantomQueue.poll());        if (!phantomRef.isEnqueued()) {            System.out.println("4 Requestion finalization.");            System.runFinalization();        }        System.out.println("5 Anything in Queue?: " + phantomRef.isEnqueued());        phantomRef2 = (PhantomReference) phantomQueue.poll();        System.out.println("6 Original PhantomReference: " + phantomRef);        System.out.println("7 PhantomReference from Queue: " + phantomRef2);    }}

测试输出:

Phantom Reference: null

Phantom Queued: false

Anything in Queue? : null

Anything in Queue?: true

Original PhantomReference: java.lang.ref.PhantomReference@2a139a55

PhantomReference from Queue: java.lang.ref.PhantomReference@2a139a55

和之前介绍的弱引用(WeakReference)和软引用(SoftReference)不同,包裹在虚引用(PhantomReference)中的对象实例无法通过需引用的get方法返回,因此在第一行输出我们会看到: “1. Phantom Reference: null”.

在上面示例代码中虚引用PhantomReference的构造函数里, 我传入了一个队列作为输入参数。当包裹在虚引用实例中的对象引用被Java垃圾回收器删除时,虚引用实例本身会自动被JVM插入我之前指定到虚引用构造函数输入参数的那个队列中去。

在System.runFinalization()执行之前,phantomRef.isEnqueued()返回false,phantomQueue.poll()返回空。

当phantomObj实例被JVM删除后, 虚引用PhantomReference本身被加入到队列中,并且能够通过队列提供的api所访问:phantomQueue.poll(). 打印输出的第6行和第7行也说明了这一点。

“Java和ABAP中的引用类型有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java和ABAP中的引用类型有哪些

本文链接: https://www.lsjlt.com/news/231518.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java和ABAP中的引用类型有哪些
    本篇内容介绍了“Java和ABAP中的引用类型有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java编程语言中几种不同的引用类型是面试...
    99+
    2023-06-02
  • Java中有哪些引用类型
    Java中有哪些引用类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。强引用强引用是最常用的引用类型,如下所示,new Object()会创建一个Object对象并存储在堆...
    99+
    2023-06-14
  • java的引用类型有哪些
    java中的引用类型有:1.类,具备某些共同特征的实体的集合;2.接口,一系列方法的声明和方法特征的集合;3.数组,用于在内存块中的连续存储相同数据类型的元素集合;java中的引用类型有以下几种类java中类是指具备某些共同特征的实体的集合...
    99+
    2024-04-02
  • java引用传递的类型有哪些
    小编给大家分享一下java引用传递的类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java引用传递的三种类型第一种结果:调用前:50调用后:1000分析...
    99+
    2023-06-29
  • C#中有哪些引用类型
    本篇文章为大家展示了C#中有哪些引用类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#引用类型和值类型的区别——值类型和引用类型在内存中的部署经常听说,并且经常在书上看到:值类型部署在栈上,引用...
    99+
    2023-06-17
  • 聊聊java中引用数据类型有哪些
    目录java中引用数据类型有哪些下面说说java中引用数据类型:一、类Class引用二、接口interface引用三、数组引用数组的定义数组的初始化初始化数组的两种方式:为什么Jav...
    99+
    2024-04-02
  • javascript的引用类型有哪些
    javascript中的引用类型有:1.object,对象;2.Array,数组;3.Function,函数;4.Date,日期时间类型;5.RegExp,正则表达式;javascript中的引用类型有以下几种Objectjavascrip...
    99+
    2024-04-02
  • golang的引用类型有哪些
    golang中的引用类型有:1.map,无序的、键值对的集合;2.pointers,计算机内存中变量所在的内存地址;3.slice,数组的抽象;4.channel,指管道,用于实现并行计算方程间通信;5.interface,指接口,一组方法...
    99+
    2024-04-02
  • Teradata中的索引类型有哪些
    在Teradata中,常见的索引类型包括: 主索引(Primary Index):每个表只能有一个主索引,用于确定数据行在AMP...
    99+
    2024-04-02
  • MySQL中有哪些索引类型
    本篇文章给大家分享的是有关MySQL中有哪些索引类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.B-Tree索引因为存储引擎不⽤进⾏全表扫描来获取数据,直接从索引的根节点...
    99+
    2023-06-14
  • javascript中有哪些引用数据类型
    本篇内容介绍了“javascript中有哪些引用数据类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Javascript中有哪些引用类型传递
    小编给大家分享一下Javascript中有哪些引用类型传递,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JS里面哪些类型是引用类...
    99+
    2024-04-02
  • mysql的索引有哪些类型和特点
    mysql索引类型包含:1. b-tree 索引:快速等值、范围及前缀搜索;2. 哈希索引:快速等值搜索;3. 全文索引:模糊搜索文本字段;4. 空间索引:地理空间查询;5. 覆盖索引:...
    99+
    2024-04-22
    mysql 键值对
  • Java中值类型和引用类型详解
    我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型的变量也是一个对象的话,那么我们应该能用&...
    99+
    2024-04-02
  • javaScript引用类型与基本类型有哪些
    这篇文章主要讲解了“javaScript引用类型与基本类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javaScript引用类型与基本类型有哪些”吧!  1. 概念:  基本类型也...
    99+
    2023-06-04
  • Java中引用类型和原始类型有什么区别
    本篇文章给大家分享的是有关Java中引用类型和原始类型有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另...
    99+
    2023-06-17
  • DynamoDB的索引类型有哪些
    DynamoDB 的索引类型有两种:局部索引(Local Secondary Index,LSI)和全局索引(Global Seco...
    99+
    2024-04-09
    DynamoDB
  • java中内部类的类型有哪些
    java中内部类的类型有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式...
    99+
    2023-06-14
  • mysql的索引有哪些类型
    mysql索引可快速查找数据,通过在键值对中存储列值和数据指针实现。常见的索引类型有:b-tree索引:支持范围查询,数据量大时性能佳。哈希索引:完全匹配查询快,但更新数据开销大。全文索...
    99+
    2024-04-22
    mysql 键值对
  • javascript的引用数据类型有哪些
    这篇文章主要介绍“javascript的引用数据类型有哪些”,在日常操作中,相信很多人在javascript的引用数据类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作