Ваш код эффективно выполняет
Ford myFord; // a a;
BlueFord yourFord; // b b;
myFord.printMileage(); // a.print();
yourFord.driveAndPrintMileage(); // b.print(); <- does more than printing!
myFord.printMileage(); // a.print();
Нет никаких причин, по которым пробег myFord
должен меняться при движении yourFord
.Это один и тот же тип автомобиля (а Ford
, последний - специальное синее издание), но они не тот же автомобиль (один ваш, другой мой).Вождение одного не меняет пробег другого.
Вы используете одно и то же имя для типа (Ford
) и экземпляра (myFord
) каждого класса / переменной,Это принципиально разные вещи, и присвоение им одного и того же имени не делает их одним и тем же (это только делает вещи более запутанными для вас).
Если i
переменная static
будет синхронизирована«это между всеми экземплярами - как будто каждый Ford
автомобиль всегда был подключен к Интернету и транслировал изменения на i
на все остальные Ford
s.Представьте себе static int i
как счетчик "общее количество миль, пройденных всеми (синими) бродами".Но обратите внимание, что переменная static
больше не живет в одном из экземпляров (она хранится не в каждом Ford
), а где-то централизованно (на каком-то сервере компании Ford).
Но вся идея объектно-ориентированного программированияизбавляется от глобального состояния (которое включает в себя static
переменных) и каждый экземпляр управляет своим собственным состоянием.Я не хочу, чтобы мои Ford
постоянно общались со всеми другими Ford
, полагаясь на какое-то внешнее соединение.