面向对象的语义特征

类型

  • 基础数据类型
    • 整型
    • 浮点型
    • 字符
  • 扩展数据类型

    • 字符串
    • 数组
    • 对象
    • 作用域

  • 类的作用域:整个程序

  • 对象成员的作用域:

    • 属性:整个对象的内部
    • 方法:整个对象的内部

      生存期

  • 对象:创建之后,销毁之前

  • 成员变量:创建之后,销毁之前(引用了从堆中申请的内存除外)
  • 静态成员
    • 作用域:类型的所有对象实例,被所有实例共享
    • 生存期:任何一个对象实例创建之前就存在

      设计类的语法

      ```javascript classDeclaration : CLASS IDENTIFIER (EXTENDS typeType)? (IMPLEMENTS typeList)? classBody ;

classBody : ‘{‘ classBodyDeclaration* ‘}’ ;

classBodyDeclaration : ‘;’ | memberDeclaration ;

memberDeclaration : functionDeclaration | fieldDeclaration ;

functionDeclaration : typeTypeOrVoid IDENTIFIER formalParameters (‘[‘ ‘]’)* (THROWS qualifiedNameList)? functionBody ;

  1. ```javascript
  2. /*
  3. 简单的面向对象特性。
  4. */
  5. class Mammal{
  6. //类属性
  7. string name = "";
  8. //构造方法
  9. Mammal(string str){
  10. name = str;
  11. }
  12. //方法
  13. void speak(){
  14. println("mammal " + name +" speaking...");
  15. }
  16. }
  17. Mammal mammal = Mammal("dog");
  18. mammal.speak(); //访问对象方法
  19. println("mammal.name = " + mammal.name); //访问对象的属性
  20. //没有构造方法,创建的时候用缺省构造方法
  21. class Bird{
  22. int speed = 50; //在缺省构造方法里初始化
  23. void fly(){
  24. println("bird flying...");
  25. }
  26. }
  27. Bird bird = Bird(); //采用缺省构造方法
  28. println("bird.speed : " + bird.speed + "km/h");
  29. bird.fly();

对象实例化

  1. 通过构造方法来创建对象(检查类型是不是一个类名)
  2. 显式定义的构造方法或缺省初始化方法

    管理对象的数据

    image.pngimage.png

    访问对象的属性和方法

    1. expression
    2. : ...
    3. | expression bop='.'
    4. ( IDENTIFIER //对象属性
    5. | functionCall //对象方法
    6. )
    7. ...
    8. ;
    1. obj1.obj2.field1;
    2. obj1.getObject2().field1;

    对象成员还可以设置可见性,有些成员只有对象内部才能用,有些可以由外部访问:在编译阶段做语义检查的时候,如果私有成员被外部访问,报编译错误