Я хотел бы знать причину проблемы хрупкого базового класса в java.
Вот код, и я не могу найти причину запуска метода дочернего класса, даже если я дал инструкцию для запуска метода в родительском классе
в публичном классе Array
public class Array {
private ArrayList<Object> a = new ArrayList<Object>();
public void add(Object element)
{
a.add(element);
}
public void addAll(Object elements[])
{
for (int i = 0; i < elements.length; ++i)
add(elements[i]);
}
}
в классе ArrayCount ... этот класс отвечает за хранение счетчика списка
public class ArrayCount extends Array {
public int count = 0;
@Override
public void add(Object element)
{
super.add(element);
++count;
}
@Override
public void addAll(Object elements[])
{
super.addAll(elements);
count += elements.length;
}
}
основной класс следующим образом
public class Main {
public static void main(String[] args) {
ArrayCount ac = new ArrayCount();
Object [] objArray = new Object[7];
objArray[0] = "xxx";
objArray[1] = "xxx";
objArray[2] = "xxx";
objArray[3] = "xxx";
objArray[4] = "xxx";
objArray[5] = "xxx";
objArray[6] = "xxx";
ac.addAll(objArray);
System.out.println("count is : " + ac.count);
//COUNT IS 14 NOT 7
}
}
хорошо .. но в методе AddAll ArrayCount я вызвал super.addAll(), а в методе addAll класса Array он вызвал метод add(). проблема в том, что вместо этого он вызывает для класса Array add() его вызов для метода add() класса ArrayCount из метода addAll() класса Array
"проблема в том, что вместо этого он вызывает для класса Array add () его вызов для класса ArrayCount add ()" => Это основная концепция ООП! Полиморфизм! Вызов методов - динамически связанный. И - собственно, по этой причине базовый класс называется хрупкий.
здесь все работает как положено.
@NuOneTAttygalle, что не означает, что остальная часть этого метода не работает
Практическое правило здесь: Не вызывайте переопределяемые методы внутри вашего базового класса.
создал объект для ArrayCount и вызвал метод того же класса. но внутри Arraycount вы вызываете метод базового класса. Так что он перейдет к базовому классу.
проблема в том, что он не попадает в базовый класс. а на выходе значение счетной переменной будет 14, а не 7
Работает нормально, здесь нет проблем.
Счетчик равен 14, потому что выполняются как ++count; из ArrayCount.add(), так и count += elements.length; из ArrayCount.addAll(). Процесс выглядит следующим образом: ArrayCount.addAll() -> Array.addAll() -> ArrayCount.add() -> Array.add(), где части, которые должны вас удивить, это то, что add() в Array.addAll() фактически является тем же из ArrayCount.add().




вы объявили его как экземпляр ArrayCount и инициализировали как ArrayCount, поэтому можно ожидать, что он ведет себя как ArrayCount