【问题标题】:Java use of is-A and has-A relationshipsJava 使用 is-A 和 has-A 关系
【发布时间】:2021-11-02 14:08:25
【问题描述】:

为什么我不能在我的 circle 类中使用变量 shapeArea?我正在尝试第一次使用 is-a 关系和 has-a 关系构建一个系列类。空类还没有真正的用途。我只是想看看我是否可以为最终保存我的代码的内容创建基本框架。

public class Object {
}

class shape extends Object{
}

class area{
    public double area;
}

class TwoDshape extends shape{
    area shapeArea = new area();
}

class circle extends TwoDshape{
    shapeArea.area = 1;
}

【问题讨论】:

  • 可以,但必须在方法或构造函数中或在适当的 init 块中这样做。
  • 定义“不能使用”。您仍然需要使用有效的 Java——有一些语言规则定义了您可以在何处/如何使用变量和任意代码。
  • 另外,请忘记“is-a relationship”这个词。它弊大于利。更好的继承概念是Liskov substitution principle
  • 类名以大写字母开头。请不要拨打多个电话area。不要创建自己的名为Object 的类。你的名字让你的代码更加难以推理。
  • 你想达到什么目的?

标签: java inheritance composition


【解决方案1】:

您可以在circle类的任何方法中使用它,也可以在circle类的任何类型的构造函数中使用它,因为继承的字段只能通过子类中的构造函数和方法访问。

【讨论】:

    【解决方案2】:

    我创建了一个Replit snippet

    class Main {
      public static void main(String[] args) {
    
        Shape2D shape = new Shape2D();
        System.out.println(shape.area.sqm);
    
        // Casting objects
        // https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
        Shape2D circle = new Circle();
        System.out.println(circle.area.sqm);
    
        Shape2D triangle = new Triangle(2.0);
        System.out.println(triangle.area.sqm);
    
    
        Rectangle rectangle = new Rectangle();
        rectangle.increaseArea();
        System.out.println(rectangle.area.sqm);
      }
    }
    
    
    /*
      Extends java.lang.Object
      But if you omit that, it will extend implicitly.
      https://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
      https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
    */
    class Shape extends Object {
    
    }
    
    
    class Area {
      public double sqm;
    }
    
    
    class Shape2D extends Shape {
      Area area = new Area();
    }
    
    
    /*
      Initializing Instance Members
      https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
    */
    class Circle extends Shape2D {
      {
        area.sqm = 1.0;
      }
    }
    
    
    /*
      Using a constructor
      https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
    */
    class Triangle extends Shape2D {
      Triangle(double areaInSquareMetres) {
        this.area.sqm = areaInSquareMetres;
      }
    }
    
    
    /*
      Using an instance method
      https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
    */
    class Rectangle extends Shape2D {
      void increaseArea() {
        area.sqm += 1.0;
      }
    }
    

    同样重要: Whats the difference between objects and data structures?

    【讨论】:

      【解决方案3】:

      在类级别,您只能定义变量(静态或实例)、构造函数、方法。你可以做类似的事情

      class Circle extends TwoDshape{
          public Circle {
             shapeArea.area = 1;
          }
      }
      

      加号:首选以大写字母开头的类名

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 2016-07-09
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        相关资源
        最近更新 更多