我正在经历这个问题Java中有没有办法覆盖类变量? https://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java。首先comment https://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java#comment498843_685300获得 122 票赞成的是:
如果你曾经看到过protected static
, run.
谁能解释为什么是protected static
皱起眉头?
这更多的是一种风格问题,而不是一个直接问题。这表明你没有正确思考课堂上发生的事情。
想一想什么static
means:
该变量存在于类级别,它并不单独存在于每个实例中,并且它在扩展我的类中没有独立的存在.
想一想什么protected
means:
这个变量可以被这个类看到,同包中的类以及拓展我的课程.
这两个含义并不完全相互排斥,但非常接近。
我能看到的唯一可以将两者一起使用的情况是,如果您有一个旨在扩展的抽象类,并且扩展类可以使用原始类中定义的常量修改行为。但这种安排很可能最终会变得非常混乱,并表明类设计的弱点。
在大多数情况下,最好将常量公开,因为这只会使一切变得更干净,并允许人们进行子类化更加灵活。更不用说,在许多情况下,组合比继承更可取,而抽象类则强制继承。
要查看一个示例来说明这会如何破坏事物并说明我所说的变量不具有独立存在的含义,请尝试以下示例代码:
public class Program {
public static void main (String[] args) throws java.lang.Exception {
System.out.println(new Test2().getTest());
Test.test = "changed";
System.out.println(new Test2().getTest());
}
}
abstract class Test {
protected static String test = "test";
}
class Test2 extends Test {
public String getTest() {
return test;
}
}
您将看到结果:
test
changed
亲自尝试一下:https://ideone.com/KM8u8O https://ideone.com/KM8u8O
班上Test2
能够访问静态成员test
from Test
不需要限定名称 - 但它不会继承或获得自己的副本。它正在查看内存中完全相同的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)