代码之家  ›  专栏  ›  技术社区  ›  Pentium10

Java中的抽象变量?

  •  43
  • Pentium10  · 技术社区  · 15 年前

    我来自C,在那里,这很容易,也很可能。

    我有这个代码:

    public abstract class clsAbstractTable {
    
        public abstract String TAG;
        public abstract void init();
    
    }
    

    但Eclipse告诉我使用非法修饰符。

    我有这门课:

    public class clsContactGroups extends clsAbstractTable {
    
    
    }
    

    我希望以这样的方式定义变量和方法,Eclipse 催促我 ,我有未完成的摘要 变量 方法。

    我需要如何定义抽象类,以便提示我实现抽象?

    编辑1

    我将为不同的DB表创建不同的类。每个类都应该有自己的tablename变量,没有异常。每次创建扩展抽象类的新类时,必须确保该变量是静态的。

    然后在抽象类中,我将有一个方法,例如:init();

    如果在这个in it()方法中我调用tablename,它应该从子类中获取值。

    像这样的事情也应该解决

    String tablename=(clsAbstract)objItem.TABLENAME;
    // where objItem can be any class that extended clsAbstract;
    

    编辑2

    我希望在每个类中定义一个常量(静态),并将其名称抽象定义。

    • 我抽象地定义变量tablename,但没有给定值。
    • 我创建了一个clscontgroups,应该提示我实现tablename,这是获取一些数据的地方。例如:tablename=“contactGroups”;
    • 我创建了第二个类clscocts,应该提示我实现tablename,这是获取一些数据的地方。例如:tablename=“contacts”;
      等。。。
    11 回复  |  直到 6 年前
        1
  •  47
  •   Kevin Brock    15 年前

    我认为你混淆了C属性和字段/变量。在C中,即使在抽象类中,也不能定义抽象字段。但是,您可以定义抽象属性,因为它们是有效的方法(例如编译为 get_TAG() set_TAG(...) )

    正如一些人所提醒的,在类中不应该有公共字段/变量,即使是在C中。有几个答案暗示了我会推荐什么,但没有说清楚。你应该把你的想法翻译成Java作为JavaBean属性,使用GETTAG()。然后,您的子类必须实现这一点(我还用表类编写了一个项目来实现这一点)。

    所以你可以有一个这样定义的抽象类…

    public abstract class AbstractTable {
    
        public abstract String getTag();
        public abstract void init();
    
        ...
    }
    

    然后,在任何具体的子类中,您都需要定义一个静态最终变量(常量),并从 getTag() ,如下所示:

    public class SalesTable extends AbstractTable {
    
        private static final String TABLE_NAME = "Sales";
    
        public String getTag() {
            return TABLE_NAME;
        }
    
        public void init() {
            ...
            String tableName = getTag();
            ...
        }
    
    }
    

    编辑 :

    不能重写继承字段(无论是C还是Java)。也不能重写静态成员,不管它们是字段还是方法。所以这也是最好的解决办法。我更改了上面的init方法示例,以演示如何使用它——同样,请将getxxx方法视为一个属性。

        2
  •  58
  •   BalusC    15 年前

    在抽象类中定义一个构造函数,该类设置字段,以便具体实现符合调用/重写构造函数所需的规范。

    例如。

    public abstract class AbstractTable {
        protected String name;
    
        public AbstractTable(String name) {
            this.name = name;
        }
    }
    

    当你扩展时 AbstractTable ,直到添加一个调用 super("somename") .

    public class ConcreteTable extends AbstractTable {
        private static final String NAME = "concreteTable";
    
        public ConcreteTable() {
            super(NAME);
        }
    }
    

    这样,实现者就需要设置 name . 这样,您还可以在抽象类的构造函数中进行(空)检查,以使其更健壮。例如:

    public AbstractTable(String name) {
        if (name == null) throw new NullPointerException("Name may not be null");
        this.name = name;
    }
    
        3
  •  6
  •   duffymo    15 年前

    在Java(或C++)中没有抽象变量。

    如果父类有一个变量,而子类扩展了父类,则子类不需要实现该变量。它只需要访问父级的实例。get/set或protected access都可以。

    “…所以应该提示我实现摘要”?如果您扩展了一个抽象类并且未能实现一个抽象方法,编译器将告诉您要么实现它,要么将子类标记为抽象的。这就是你将得到的所有提示。

        4
  •  2
  •   Lombo    15 年前

    只需将此方法添加到基类

    public abstract class clsAbstractTable {
    
        public abstract String getTAG();
        public abstract void init();
    
    }
    

    现在,扩展基类(不希望是抽象的)的每个类都应该提供一个标记

    你也可以用俾路支的回答

        5
  •  2
  •   Padmarag    15 年前

    你能做的最好的就是为变量设置访问器/变异器。
    类似的东西 GETAG()
    这样所有实现类都必须实现它们。

    抽象类用于定义抽象行为而不是数据。

        6
  •  1
  •   Tomas Vana    15 年前

    由于没有变量的实现,因此它不能是抽象的;)

        7
  •  1
  •   Erich Kitzmueller    15 年前

    为什么要所有子类定义变量?如果每个子类都应该有它,只需在超类中定义它。顺便说一句,考虑到OOP实践中最好不要公开字段,您的问题就更不合理了。

        8
  •  1
  •   dimitarvp    15 年前

    将代码更改为:

    public abstract class clsAbstractTable {
      protected String TAG;
      public abstract void init();
    }
    
    public class clsContactGroups extends clsAbstractTable {
      public String doSomething() {
        return TAG + "<something else>";
      }
    }
    

    这样,继承这个类的所有类都将拥有这个变量。你可以做200个子类,但每个子类都有这个变量。

    旁注:不要将caps用作变量名;常见的观点是,所有caps标识符都引用常量,即不可更改的数据块。

        9
  •  1
  •   Joachim Sauer    15 年前

    要添加每个类的元数据,注释可能是正确的方法。

    但是,不能强制在接口中存在注释,就像不能强制静态成员或特定构造函数的存在一样。

        10
  •  0
  •   user531069    6 年前

    使用枚举强制值并保持绑定检查:

    enum Speed {
        HIGH, LOW;
    }
    private abstract  class SuperClass {
        Speed speed;
        SuperClass(Speed speed) {
            this.speed = speed;
        }
    }
    private class ChildClass extends SuperClass {
        ChildClass(Speed speed) {
            super(speed);
        }
    }
    
        11
  •  -1
  •   Joachim Sauer    15 年前

    不,Java不支持抽象变量。这也没什么意义。

    您希望子类对变量的“实现”做什么具体的更改?

    当我有一个 abstract String 变量在基类中,子类应该如何使其非抽象?