您的位置:首页 > 编程语言 > Java开发

从Java到ABAP,OO部分的学习以及对…

2017-04-21 10:51 260 查看
一些百思不得其解的语法现象:

居然把Integer的名称简化为I
那么变量名似乎就不能取为I了,类名就偶尔用用,使用的频率哪里够变量名高啊!

居然有教材这么写一个IF语句:
IF sy-index = 2. CONT INUE.
ENDIF.
显然运行不了。但是我该怎么改呢?不得不吐槽下,ABAP以点号结尾相当有迷惑性。
以Java的OO思维,2难道是一个类的实例?然后里面有个叫做CONT的方法?在使用CONT方法时传递
INUE类的ENDIF参数?
其实写成这样就清楚了:
IF sy-index = 2.
 
  CONTINUE.
ENDIF.
突然觉得Java或者C里面多写点括号的好处了:
if(sy.index==2){
 
  continue;
}
多么简洁易懂

WHILE sy-subrc=0.
数据对象 "SY" 没有组件 "SUBRC=0",但具有组件 "SUBRC"。called "SUBRC=0", but
there is a component called "SUBRC".
这个槽点满满。看看错误的语句与正确的语句的区别:
错误:WHILE sy-subrc=0.
正确:WHILE sy-subrc = 0.
问题在哪里?看出来了没?少了空格!!!这是一个把空格提升到至高无上地位的神奇语言。

让我们再看看OO部分,这里定义2个类作为例子:

* Class
Declarations
CLASS application
DEFINITION.
  PUBLIC
SECTION.
 
  METHODS: show_text.
  PRIVATE
SECTION.
 
  DATA text(100) TYPE c VALUE 'This is my first
ABAP Object.'.  "
类成员的私有变量,【实例属性】 用 -> 符号访问
ENDCLASS.
CLASS Vehicle
DEFINITION.
  PUBLIC
SECTION.
 
  CLASS-DATA class_name(10) TYPE c VALUE
'Vehicle12'.    
     
 " 类成员的公有变量,【静态属性】 用 =>
符号访问
 
  METHODS: accelerate,
 
     
    show_speed.
  PROTECTED
SECTION.
 
  DATA speed TYPE i.
ENDCLASS.

* Class
implementation
CLASS application
IMPLEMENTATION.
  METHOD
show_text.
 
  WRITE text.  
     
     
     
     
     
     
     
     "
 类方法调用私有变量
 
ENDMETHOD.
ENDCLASS.
CLASS Vehicle
IMPLEMENTATION.
  METHOD
accelerate.
 
  speed = speed + 1.
 
ENDMETHOD.
  METHOD
show_speed.
 
  WRITE: / 'Speed', speed.
 
ENDMETHOD.
ENDCLASS.  
     
  
  "Vehicle

我已经无法再吐槽了。本来以为C++里面把头文件和定义文件分开已经够了。结果你还要专门声明这是definition,这是implementation……还得有个END
真的,非常同意王垠对Java的评价了,没啥特别大的缺陷。

 
  class Application {
 
     
Application() {
 
     
    text = "This is my first ABAP
Object.";
 
     
}
 
      public
void show_text() {
 
     
   
System.out.print(this.text);
 
     
}
 
      private
String text;
 
  }
 
  class Vehicle{
 
     
Vehicle(){
 
     
    speed = 0;
 
     
}
 
      public
void accelerate(){
 
     
    speed += 1;
 
     
}
 
      public
void show_speed(){
 
     
    System.out.print("\n
Speed"+speed);
 
     
}
 
      private
int speed;
 
  }
若是看ABAP的代码,真是满屏幕的METHOD、CLASS字段,而真正的变量名和方法名被埋没其中,很难查找。
可以再对比下写在一起的情况:
—————————————————————————————————————————————

 CLASS vehicle2
DEFINITION.
  PUBLIC
SECTION.
 
  METHODS: accelerate IMPORTING rate TYPE
i,
 
     
   
 show_speed.
  PRIVATE
SECTION.
 
  DATA speed TYPE i VALUE 0.
ENDCLASS.
CLASS vehicle2
IMPLEMENTATION.
  METHOD
accelerate.
 
  speed = speed + rate.
 
ENDMETHOD.
  METHOD
show_speed.
 
  WRITE: / 'Speed', speed.
 
ENDMETHOD.
ENDCLASS
     class
Vehicle2{
 
      public
void accelerate(int rate){
 
     
    speed += rate;
 
     
}
 
      public
void show_speed(){
 
     
    System.out.print("\n
Speed"+speed);
 
     
}
 
      private
int speed = 0;
 
  }
CLASS circle DEFINITION.

  PUBLIC
SECTION.
 
  METHODS get_area IMPORTING value(i_radius) TYPE
i
 
     
     
     
     
     
     RETURNING
value(r_size)   TYPE f.
  PRIVATE
SECTION.
 
  CONSTANTS pi TYPE f VALUE
'3.14159265'.
ENDCLASS.
CLASS circle
IMPLEMENTATION.
  METHOD
get_area.
 
  r_size = i_radius ** 2 * pi.
 
ENDMETHOD.
ENDCLASS.
—————————实例方法调用———————————
PARAMETERS radi
b221
us TYPE i.
     
     "
创建一个输入框
DATA: o_circle TYPE REF TO
circle,
 
     
   area  
   TYPE  
     
   
 f.
CREATE OBJECT
o_circle.
CALL METHOD
 o_circle->get_area EXPORTING i_radius =
radius
 
     
     
     
     
     
     
     
     
      RECEIVING
r_size = area.
WRITE: / area.
area = o_circle->get_area(
radius ).
WRITE: / area.

class Circle{
 
  private final float pi = (float)
3.1415926;
 
  public float get_area(int
i_radius){
 
      float
r_size = (i_radius^2)*pi;
 
      return
r_size;
 
  }
}
———————————实例方法调用—————————
int radius;
Scanner sc = new
Scanner(System.in);
radius=sc.nextInt();
Circle o_circle;
float area;
o_circle = new
Circle();

area =
o_circle.get_area(radius);
System.out.println(area); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: