【问题标题】:Can I set class "property" based on other property?我可以根据其他属性设置类“属性”吗?
【发布时间】:2017-06-22 13:13:59
【问题描述】:

我想根据第一个开关设置类的属性。如果 vrsta (eng. type) 是 krug (circle) 我想要它的直径 (r) 作为 Figura (eng. Figure) 类型的属性,如果它是 pravouganonik(eng. rectangle) 我想要它的边:a和 b,如果它是 kvadrat(eng.square),我想要它的边值 (str)。如何修复我的开关,它给了我编译错误。 switch(vrsta){ 上类型的非法开始,它给了我在同一行上的预期,在案例“krug”上是孤立的案例。非常感谢!

import java.util.Scanner;

class Figura{
String boja,vrsta;
Double povr;

switch (vrsta){
    case "krug":
        Double r;
        break;
    case "pravougaonik":
        Double a,b;
        break;
    case "kvadrat":
        Double str;
        break;
}

Figura(String b, String v){
    Scanner sc=new Scanner(System.in);
    boja=b;
    vrsta=v;
    switch (vrsta){
        case "krug":
            r=sc.nextDouble();
            povr=r*r*3.14;
            break;
        case "pravougaonik":
            a=sc.nextDouble();
            b=sc.nextDouble();
            povr=a*b;
            break;
        case "kvadrat":
            str=sc.nextDouble();
            povr=str*str;
            break;
    }
}

public static void main(String args[]){
    Scanner sc=new Scanner(System.in);
    Figura f1=new Figura(sc.nextLine(),sc.nextLine());
    System.out.println(f1.povr);
}
}

【问题讨论】:

  • 这不能解决我的问题,我想,当我将 Figura 对象实例化为具有像 f1.str 这样的属性时。
  • 您不能按照您在代码中显示的方式进行操作。 switch 语句是在运行时评估的,而类成员变量必须在编译时声明。毕竟,编译器必须创建已经具有适当字段的类字节码,并且由于编译的类不知道哪些实例将具有什么几何类型,所以这是行不通的。相反,正如@Rajeev Singh 所建议的那样,使用继承来创建在运行时匹配所需几何类型的对象实例。

标签: java class variables


【解决方案1】:

引发错误compile error. Illegal start of type on switch(vrsta) 是因为它不遵循定义成员的约定。相反,它应该被包装在一个成员函数中。

成员应该这样定义

class A {
    modifiers type name;
}

解决这个问题的一个简单方法是使用继承。创建基类Figure,并从中创建其他子类CircleSquareRectangle

class Figure {
    // base class
}

class Circle extends Figure {
    double radius;
}

class Rectangle extends Figure {
    double length;
    double width;
}

class Square extends Figure {
    double side;
}

在 main 中你可以创建你需要的 Class 的对象

public static void main(String[] args) {
    Figure f;
    int type = 1; // set type as required

    switch(type) {
        case 1:
            f = new Circle();
            break;
        case 2:
            f = new Rectangle();
            break;
        case 3:
            f = new Square();
            break;
        default:
            f = new Figure();
    }
}

【讨论】:

  • 为什么不class Square extends Rectangle
  • @jsheeran 是的,它可以,答案是解决问题而不是继承,所以我跳过了它,但这是一个更好的做法。
  • 我同意这一点,但是在 main 方法中我需要调用 Circle c=new Circle();举个例子,但我希望它由 Figure f1=new Figure(); 使用。甚至可能吗?我用 Pascal 语言编写了这个程序,所以我在想它是否可以用 Java 实现。
  • 是的,你可以做Figure f = new Circle();,因为FigureCircle的父母
  • 非常感谢,如果我问了愚蠢的问题,我很抱歉,我还在学习!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多