ABAP,Java和JavaScript类的构造函数使用的一些陷阱-阿里云开发者社区

开发者社区> jerrywangsap> 正文

ABAP,Java和JavaScript类的构造函数使用的一些陷阱

简介: ABAP,Java和JavaScript类的构造函数使用的一些陷阱
+关注继续查看

This question draws my attention during a discussion with my colleague recently.

I will explain it in ABAP, Java and JavaScript.


In ABAP

I have a super class and a sub class.

Source code for super class:


image.png

In constructor of super class, method set_i is called to set the member attribute mv_super to 100.

And here is my sub class:

image.png

The redefinition of set_i is done in order to fill the member attribute mv_sub in sub class.

And now in report, use this line for test:

image.png

in constructor, the redefinition of set_i done by sub class is not called at all, since the technical type of me reference points to super class. This makes sense since the execution context is constructor and the initialization of super class is not finished yet.


image.png


In Java

Let’s now see what will happen in Java.

image.pngimage.png

The constructor execution behavior is completely different in Java: in constructor, the redefinition of setX done in sub class now gets chance to be called. However, it is overwritten to default value 1 later.

Use Javap to analyze the byte code.

The magic of initialization lays in line 59: invokespecial #18.


image.png


the byte code clearly shows the Java code new SubClass() will invoke SubClass.””.

The #18 represents the entry in constant pool with id 18, which is SubClass.:


image.png


So use Javap to review byte code of sub class again.


Here explains why in the last line of output, subX is reset to 1, since the initialization of it is done AFTER super class’ constructor call.



image.png

What logic is contained in SuperClass.””? Inspect SuperClass.”” again:


image.png


#12 points to SuperClass.setX:


image.png


Byte code of setX:

line 59: put this reference to stack

line 60: push parameter x of method setX to stack

line 61: put stack top element to variable #20, which is SuperClass.mSuperX:


image.png



The execution sequence analyzed so far:

SubClass.”” -> SuperClass.”” -> SubClass.setX(int) -> SuperClass.setX(int)

Which could clearly be observed in callstack:

image.png



In JavaScript

I write an example via JavaScript to illustrate the execution logic in above example.

Super class:

image.png

image.png

Let’s step into code of new SubClass():


(1) it will call SuperClass’ constructor:

image.png



(2) In Super class constructor, since now this points to SubClass, so the redefinition of setX is called:

image.png


(3) In redefined setX in SubClass, line 23 and line 24 will set attribute mSuperX in SuperClass and mSubX in Sub class accordingly.


image.png


(4) finally:



image.png

So we get the same output in Java:


image.png


Conclusion

If you call a non-final method in constructor and that method is redefined by sub class, be careful that your code might not work as you expect when you create a new instance of sub class:


(1) In ABAP, the redefinition in sub class will NOT be called in constructor.

(2) In Java, the constructor of super class is called BEFORE the initialization of sub class member attribute.


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaCV cvEstimateRigidTransform函数使用心得
JavaCV cvEstimateRigidTransform函数使用心得 @Date 2018.09.27 函数定义 对应OpenCV中的estimateRigidTransform函数 此函数用作根据变换矩阵对图片进行指定大小的变换 Mat e...
1646 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9494 0
[细说Java](3)创建字符串是使用" "还是构造函数?
在Java中,可以使用两种方式创建字符串: String x = "abc"; String y = new String("abc"); 对于这两种方式(双引号,构造函数)它们到底有什么区别呢? 1.
693 0
“生而有值”—教你使用构造函数 | 带你学《Java面向对象编程》之五
本节结合多组实例从多个方面介绍了重写构造函数的意义以及构造函数与setter函数的异同,指出了一些编写构造函数相关的注意事项。
929 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13177 0
JavaScript创建对象(四)——组合使用构造函数和原型模式
在JavaScript创建对象(三)——原型模式中,我们阐述了原型模式存在的两个问题:一是没办法通过构造函数初始化对象属性,二是共享引用类型的数据导致数据错乱。
825 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11507 0
javascript callback函数的理解与使用
最近做的一个项目中用到了callback函数,于是就研究了下总结下我对javascript callback的理解 首先从callback的字面翻译“回调” 可以理解这是一个函数被调用的机制 当我们遇到一个名词首先可能是百度谷歌搜索看官方是怎么解释的下面是维基百科对回调的定义: a callba...
513 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6891 0
+关注
2628
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载