【问题标题】:Problem of Returning the main class instead of the subclass JAVA android返回主类而不是子类JAVA android的问题
【发布时间】:2021-11-12 04:53:13
【问题描述】:

我有一个函数,我希望它返回从同一类继承的子类之一。 主类是button,继承类是button1,button2 ... 我不明白当我的函数返回某些东西时,它总是突出主类的特征。

我的最终目标是在角色用户的函数中传递按钮类的变量。 在下面的示例中,只有名称。

这是我声明类Button1Button2和主类button的方式。

...
    public static Button1 Button1;
    public static Button2 Button2;


    SettingsAdapter() {
        Button1 = new Button1();
        Button2 = new Button2();
    }

        public static class Button {
             final public static String name = "test";
        ...
        }

        /*** line 1 ***/

        public static class Button1 extends Button {
            final public static String name = "name 1";
            ...    
        }

        public static class Button2 extends Button {
            final public static String name = "name 2";
            ...
        }

这是函数

public static SettingsAdapter.Button getButtonPos(int a) {
        if (a == 1) {
            return Button1;
        } else {
            return Button2;
}

如果我们printf(getButtonPos(1).name)

输出始终为test

我想要的输出是name 1

如何让这个函数真正返回 Button1 或 Button2 的类?

【问题讨论】:

  • if () ?如果?这样可以编译吗?
  • 你期望输出是什么?
  • 我不知道你的目标是什么,但让我印象深刻的一件事是,你的 button1 和 button2 各有两个名称字段(button.name 和 this.name)。您可能希望写入按钮类的名称字段,而不是在子类中创建另一个字段。
  • 为了更清楚,我删除了 insideIf () 的条件,但也许我不应该
  • 我期望的输出是name 1,我编辑问题

标签: java android class subclass


【解决方案1】:

我的猜测是,静态关键字是问题所在。尝试删除它。

该类的所有实例的静态变量都是相同的,因此按钮的子类的每个实例都有一个名为 name 的变量,其值为 "test"

然后 button_1 有另一个名为 name 的变量,其值为 "name 1"。我认为 java 只是拿第一个。

类名也是用 CamelCase 写的,请重构它们。静态变量实际上可以通过 ClassName.VariableName 访问

如果没有静态就无法工作,请使用方法。 在 Button 中制作一个方法:

public String getName(){
    return "test"
}

只需在子类中重写此方法:

@Override
public String getName(){
    return "name 1"
}

在打印时 getName() 的值。

printf(getButtonPos(1).getName())

另一种方法是直接检索类

button1.getClass()

button1.getClass().getName()

当需要一个字符串时。

【讨论】:

  • 我试图删除静态,但当我尝试使用 Button1 或 Button2 类的其他变量时出现 NullPointerException。这个变量是这样创建的:final public int[] role = {};。并像Button1.role 一样投射
  • 我正在尝试我们需要覆盖的方法,谢谢您的回答
  • 无论如何,方法是最好的。大多数时候,变量只在它们自己的类中使用。如果您需要在类之外访问它们,请使用所谓的 Getter 方法来检索它们的值。
  • 有效调用方法是最好的方法。谢谢
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 2011-07-23
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多