我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗

我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗,java,android,oop,android-sqlite,abstract-class,Java,Android,Oop,Android Sqlite,Abstract Class,所以不久前,我在Android应用程序中创建了一个SQLiteHelper类。我不能100%确定原因,但表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但我的应用程序开始变得复杂,我想用公共静态最终表和列名字段填充其他类中的字段。经过一些尝试和错误,阅读了有关抽象类、静态类和嵌套类的内容后,我突然想到可以直接调用字段,如中所示 String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDE

所以不久前,我在Android应用程序中创建了一个SQLiteHelper类。我不能100%确定原因,但表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但我的应用程序开始变得复杂,我想用公共静态最终表和列名字段填充其他类中的字段。经过一些尝试和错误,阅读了有关抽象类、静态类和嵌套类的内容后,我突然想到可以直接调用字段,如中所示

String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;
尽管我已经阅读了这些主题,但在我的具体案例中,它们是如何结合在一起的,仍然让我挠头。所以我的问题是,既然字段是静态的final,那么嵌套字段实际上提供了额外的保护吗?如果嵌套类是静态的,为什么还要将其抽象化?是否需要静态和抽象来直接调用它,而不需要实例化外部类和嵌套类

谢谢你的帮助。我真的很想了解各种类实现

以下是本课程的关键要素:

public class MySQLiteHelper extends SQLiteOpenHelper {


    private static final String DATABASE_NAME = "Reminders.db";
    private static final int DATABASE_VERSION = 5;
    public int DatabaseVersion = DATABASE_VERSION;

    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static abstract class dbFields implements BaseColumns {

        //dbFields Table Fields
        public static final String TABLE_NAME_REMINDER = "reminders";
        public static final String COLUMN_REMINDER_ID = _ID;
        public static final String COLUMN_REMINDER = "reminder";
        public static final String COLUMN_REMINDER_ALTITUDE = "altitude";
        public static final String COLUMN_REMINDER_USED = "is_used";
        public static final String COLUMN_REMINDER_LASTUSED = "last_used";
        public static final String COLUMN_REMINDER_ACTION = "action";
        public static final String COLUMN_REMINDER_SCORE = "score";
        public static final String COLUMN_REMINDER_RELATIONSHIP = "relationship";

        //Special_Days Table Fields
        public static final String TABLE_NAME_SPECIAL_DAYS = "special_days";
        public static final String COLUMN_SPECIAL_DAYS_ID = _ID;
        public static final String COLUMN_SPECIAL_DAYS_DATE = "date";  //dbDataRow strField 1
        public static final String COLUMN_SPECIAL_DAYS_NAME = "name"; //dbDataRow dbData
        public static final String COLUMN_SPECIAL_DAYS_ALTITUDE = "altitude"; //dbDataRow intField 1
        public static final String COLUMN_SPECIAL_DAYS_USED = "is_used"; //dbDataRow Field 2
        public static final String COLUMN_SPECIAL_DAYS_WARNING = "warning"; //dbDataRow intField 3
        public static final String COLUMN_SPECIAL_DAYS_ACTION = "action"; //dbDataRow intField 4
    }

}
由于字段是静态的final,嵌套字段实际上提供了额外的保护吗

如果嵌套类是公共的,则不会这样做:它只是提供了一个符号不便

如果嵌套类是静态的,为什么还要将其抽象

不知道,这是你的课

是否需要静态和抽象来直接调用它,而不需要实例化外部类和嵌套类

否,
静态
就足够了

我认为这里也不需要
BaseColumns
接口。我会认真考虑使用
Enum
作为列名

由于字段是静态的final,嵌套字段实际上提供了额外的保护吗

不,没有。正如您所看到的,即使字段是嵌套的,您也可以访问这些字段,因为它们是静态的和最终的,所以您不能修改它们

如果嵌套类是静态的,为什么还要将其抽象?是否需要静态和抽象来直接调用它,而不需要实例化外部类和嵌套类

抽象的目的是允许您拥有一个基类,该基类具有一个没有实现的方法。一个典型的例子是动物类。所有动物都会发出噪音(可能不会,但让我们假设一下),因此动物类应该有一个
makeNoise
方法。但是,每个类都是不同的,所以在基类中有任何实现都是没有意义的。
Cat
子类可能看起来像
public String makeNoise(){return“meow”;}
Dog
子类可能返回“woof”,但在基类上没有合理的
makeNoise
实现。但是,如果基类上没有任何
makeNoise
,则不能要求任意动物
makeNoise
。因此,在基础上有一个
公共抽象字符串makeNoise()
方法。这允许您为任何动物调用
makeNoise
,即使您所拥有的只是对
动物的引用

注意,抽象与类是否嵌套无关。其他类,无论是否嵌套,都可以从嵌套的静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关


所以,回答你的问题:当且仅当抽象的目的在这里适用时,你应该将其抽象化。鉴于您的示例代码,它并不完全是我的代码。

。它是从一个关于Android数据库的网站的示例中派生出来的。我所有的问题都与样本是如何组织的有关,我对样本的困惑是问题的原因。当然,这不是我的代码,我当然无法回答关于作者为什么使用
摘要,
他是谁的问题。其他人也一样。是的,我现在明白了,这似乎没有道理。从这个意义上说,你回答了这个问题。