직접적인 문제 라기보다는 문체에 가깝습니다. 수업에서 무슨 일이 일어나고 있는지 제대로 생각하지 못했음을 시사합니다.
static
의미 에 대해 생각해보십시오 .
이 변수는 클래스 수준에 존재하며 각 인스턴스에 대해 별도로 존재 하지 않으며 나를 확장하는 클래스에 독립적으로 존재하지 않습니다 .
protected
의미 에 대해 생각해보십시오 .
이 변수는이 클래스, 동일한 패키지의 클래스 및 나를 확장하는 클래스에서 볼 수 있습니다 .
두 가지 의미는 정확히 상호 배타적이지는 않지만 매우 가깝습니다.
두 가지를 함께 사용할 수있는 유일한 경우는 확장되도록 설계된 추상 클래스가 있고 확장 클래스가 원본에 정의 된 상수를 사용하여 동작을 수정할 수있는 경우입니다. 그런 종류의 배열은 대부분 매우 지저분해질 것이며 클래스 디자인의 약점을 나타냅니다.
대부분의 경우 상수를 공용으로 사용하는 것이 더 낫습니다. 그 이유는 모든 것을 더 깨끗하게 만들고 사람들이 하위 클래스를 더 유연하게 만들 수 있기 때문입니다. 대부분의 경우 구성이 상속보다 선호되는 반면 추상 클래스는 상속을 강제합니다.
이것이 어떻게 깨질 수 있는지에 대한 한 가지 예를보고 독립적 인 존재가없는 변수가 의미하는 바를 설명하려면 다음 예제 코드를 시도하십시오.
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 에서 직접 시도해보십시오.
이 클래스는 Test2
정적 멤버에 액세스 할 수 있습니다 test
에서 Test
이름을 규정 할 필요없이 - 그러나 상속하지 않습니다 또는 자신의 사본을 얻을. 그것은 메모리에서 똑같은 물체를보고 있습니다.
final
. 클래스간에 공유되는 가변 정적 필드는 확실히 걱정할 필요가 있습니다. 정적 필드를 업데이트하는 여러 클래스는 신뢰할 수 없거나 따르기 쉽지 않을 것입니다. 특히 보호 된 필드 또는 메서드가 존재한다는 것은 해당 클래스가 다른 패키지의 클래스, 아마도 제어하에 있지 않은 클래스에 의해 확장된다는 것을 의미하기 때문입니다. 보호 된 필드를 포함하는 클래스의 작성자.