Нет волшебства переопределение по названию для полей. Если у вас есть поле в классе и поле с тем же именем в подклассе, у вас есть два разных поля.
Shape.name
и Ball.name
- полностью отдельные объекты.Если установить оба поля public
, вы получите:
Shape s = new Ball();
s.getName(); // => returns "shape"
s.name // yields "shape", because you are accessing a class of type `Shape`.
((Ball)s).name // yields "ball", because you are accessing a class of type `Ball`
На данный момент Ball
на самом деле имеет два различных name
поля: один наследуемые от Shape
и заявленных в самом Ball
классе.
Если у вас есть name
внутри Ball
, вы получите первый, определяемый правилами поиска символов, который равен Ball.name
. Если Shape.name
- protected
или public
, он будет доступен super.name
. Примечание еще раз: есть два отдельных поля имени, по одному для каждого класса. Они просто имеют одно и то же имя поля, но в остальном полностью разделены.
Те же правила подстановки применяются также для Shape
: Когда Shape.getName()
собран, он пытается найти поле с именем name
во время компиляции и использует это находит, который является единственным доступным в данный момент: один в Shape
. Поиск является статическим.
Однако, если Shape.name
является закрытым, вы не можете получить к нему доступ из класса Ball
.
'имя' является' частным'. Он существует независимо, каждый «класс». –
@BoristheSpider Даже если 'name' был общедоступным, у вас все равно будет два отдельных поля. Это всего лишь два поля, которые имеют одно и то же имя в двух разных классах. – dhke