Java 如何在不修改主类的情况下更改主类中声明的最终静态int值?

Java 如何在不修改主类的情况下更改主类中声明的最终静态int值?,java,Java,如何使子类int值超越主类中的最终静态int值? 例子: 我的主课已经结束了 public class main { final static int num = 2; .... .... System.out.println(num); } 我的子类在主类中被调用 Public class subclass { .... -> How can I define the int num = 10 in the subclass without changing the main cl

如何使子类int值超越主类中的最终静态int值? 例子: 我的主课已经结束了

public class main {

final static int num = 2;
....
....
System.out.println(num);
}
我的子类在主类中被调用

Public class subclass {
....  -> How can I define the int num = 10 in the subclass without changing the main class code
...
}
交易不涉及主类,即我不能更改它,因为最终静态int num=10;
但是我必须给num分配10。你知道吗?

是的,你可以,但在做任何事情之前,你必须
将所有超类的行为扩展到它的子类:

注意,由于变量
num
是静态的,所以可以通过类名调用它。 您也可以通过
super.num
调用它,但是变量不能是静态的,因为静态变量属于类而不是对象

public class main {

final int num = 2;
//....
//....
System.out.println(num);
}
    Public class subclass extends main{
        private int num ;
        //.....
        // you can access superclass's static instance fields :
        this.num =  super.num;

        }

您可以在子类中重新声明它:

public class subclass extends main{

    static final int num = 10;
}
理想情况下,应该使用
className.propertyName
调用静态成员,因此在子类中重新声明静态属性应该无关紧要

注:

但是,将类的名称保留为
main
并不是一个好主意。

简单的答案是,您不能真正做到这一点

长答案是您可以通过反射来更改此值,但是
javac
编译器可以自由内联此值,因此您不会更改使用此值的任何位置

例如,在编译后,可能会将其转换为

System.out.println(2);

因此,即使您更改了
num
,仍将打印2。

您无法更改最终变量的值

您可以在子类中定义具有相同名称的变量,但因为您讨论的是静态变量,所以父/子类实际上没有任何意义。继承仅适用于对象,而不适用于类/静态成员

public class SubClass extends main {
    final static int num = 10;
}
正如我前面提到的,静态字段没有继承性,因此没有过度使用。这样做的结果是,如果直接引用该类,num仅为10

System.out.println(main.num);
System.out.println(SubClass.num);

main parent = new main();
main child = new SubClass();
System.out.println(parent.num);
System.out.println(child.num);
产出:

2
10
2
2

如果可能的话,请发布真实代码。你的格式、拼写和大写错误,你没有使用extends,都会让人分心和困惑。至于您的问题,num变量被标记为final,其值不能更改。当然,您可以在子类中重新定义num变量。你需要告诉你实际问题的更多细节。不过你需要展示实际的代码。final的全部目的是为了避免你所建议的内容。num=2可能对父类很重要,这就是为什么它被声明为final。为什么要更改num?公共类战舰{final static int SHIPs=2;静态扫描程序sc=new Scanner(System.in);静态网格游戏;公共静态int getMenuSelection(){System.out.println(“\n维护战舰:”+(SHIPs-game.getShipsHit()))我有网格类(儿童)在这里我可以重新定义。我想把child中的值细化为super,因为它是一个赋值,我不应该在不更改邮件类的情况下,在child类中使用int,而不是在main类中声明的int。考虑编辑你的答案以包含代码重要信息-如附加代码-应该包括在内在原始问题中,而不是在评论中。要将其包含在问题中,请使用[]选项。除此之外,您几乎可以在任何情况下使用反射来更改最终值。;)是的,我不建议使用反射,因为它只是教人们如何做不应该做的事情。另外,您是对的,在这种情况下,编译器可能会内联引用,因此更改它将没有任何价值。这不会取代Ssystem.out.println(num);在主类中仍然采用最终的静态int num作为主类。还有其他建议吗?因此,要打印-10,唯一的选项是在主类中声明或将最终的staic int num更改为10?唯一的选项涉及重新编译该类,无论您如何操作,因此您知道哪些值需要更新。注意:如果任何其他类使用是值,它们也需要重新编译。
2
10
2
2