수퍼 클래스의 생성자가 서브 클래스에서 호출되고 서브 클래스가 생성자가 호출하는 수퍼 클래스의 메서드를 숨길 것이라고 가정합니다. 그런 다음 java는 수퍼 클래스의 생성자에서 하위 클래스의 메서드를 사용합니다. 그러나 대부분의 경우에 이것은 수퍼 클래스가 서브 클래스를 염두에두고 설계되지 않기 때문에 바람직한 행동이 아닙니다. 다른 방법입니다.java에서 클래스 자신의 메서드를 사용하는 생성자를 적용하는 방법
최종 클래스 나 정적 클래스를 만들지 않고 이름을 변경하거나 코드를 생성자에 복제하지 않고 어떻게 슈퍼 클래스 자체 메서드로 초기화를 수행 할 수 있습니까? (예, 왜?이 만족스럽지 못한 행동의 숨겨진 원리 어떤 경우 또는 자바는? constuctors에서 재정의 방법을 사용하여 낙담/지원하지 않는?)
내가 명시 적 캐스트를 시도 ...((SuperClass) this).method()
...이 작동하지 않습니다.
예 :
Exception in thread "main" java.lang.NullPointerException
at testingJava.SubClass.set(SubClass.java:19)
at testingJava.SuperClass.<init>(SuperClass.java:7)
at testingJava.SubClass.<init>(SubClass.java:10)
at testingJava.MainClass.main(MainClass.java:9)
편집 :
3 class SuperClass {
4 private int[] valField = new int[10];
5
6 SuperClass(int[] cloneField) {
7 for (int i = 0; i < 10; i++) set(i, cloneField[i]);
8 }
9
10 void set(int pos, int val) {
11 if (val < 0) throw new IllegalArgumentException("val must be positive; val was " + val);
12 if (pos < 0 || pos > 10) throw new IllegalArgumentException("pos must be within [0, 10]; pos was " + pos);
13 valField[pos] = val;
14 }
15
16 int get(int pos) {
17 return valField[pos];
18 }
20 }
6 class SubClass extends SuperClass {
7 private Set<Integer> isZero = new HashSet();
8
9 SubClass(int[] cloneField) {
10 super(cloneField);
11 isZero.clear();
12 for (int i = 0; i < 10; i++)
13 if (this.get(i) == 0)
14 isZero.add(i);
15 }
16
17 void set(int pos, int val) {
18 super.set(pos, val);
19 if (val == 0) isZero.add(pos);
20 else isZero.remove(pos);
21 }
22 }
이 결과 일부 추가 테스트 및 탐사 이상한 솔루션이 밝혔다. 수퍼 클래스를 두 부분으로 나누고 생성자에서 super.method()를 사용하면 자바 인터프리터에 올바른 메서드를 정렬 할 수있는 명확한 부호를 부여하는 것처럼 보입니다.
I am the super class.
"constuctors에서 재정의 할 수있는 메소드를 사용하거나 지원하지 못하도록합니다."- [예, 방해하지 않습니다] (http://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls- in-constructors) – resueman
당신은 [이 질문] (http://stackoverflow.com/a/3404369/4216641)을보고 싶습니다. 짧은 대답 : 자바에서는 불가능합니다.어쩌면 반사에 의해 숨겨진 방법을 얻을 수있는 방법이 있을지도 모르지만, 이것은 성과가없고 유지하기가 어렵습니다. – Turing85
정말 오버라이드 된 메소드를 호출해야하는 경우 항상 서브 클래스의 생성자에서 super.method()를 사용할 수 있습니다. –