2015-06-30 4 views
0
class Parent { 
    public Parent() { 
     System.out.println("Parent Default.."); 
     System.out.println("Object type : " + this.getClass().getName()); 
     this.method(); 
    } 

    private void method() { 
     System.out.println("private method"); 
    } 
} 

class Child extends Parent { 
    public Child() { 
     System.out.println("Child Default.."); 
    } 

    public static void main(String[] args) { 
     new Child(); 
    } 
} 

Когда я запускаю этот код он печатает имя класса «этого» = ребенка, но «это» объект способен вызвать частный метод родительского класса почему?Закрытый метод вызова от дочернего объекта

+0

Вам нужно удалить 'this' в родительском классе, потому что когда вы вызываете выполнение наследования в это время, это указывает на ссылку на дочерний класс, поэтому он не будет называть это. –

+0

, потому что это частный метод родительского, если this = parent, тогда он вызывает его собственный метод. –

+0

@DanialHussain Сначала запустите код и затем примите решение. И это может вызвать частный метод. –

ответ

1

Прежде всего, при вызове new Child(), так как не объявлено, не аргумент конструктора в Child классе, это будет простой вызов super() который вызов Parent конструктора.

Затем, при выполнении this.getClass().getName(), здесь this означает экземпляр Child, поэтому в результате вы получаете «Ребенок». Помните, что Object#getClass() возвращает наиболее специфический класс, к которому принадлежит объект. см. больше от here.

О чем причина this.method() работает. Во-первых, поскольку Child распространяется Parent, экземпляр Child также является экземпляром Parent. Модификатор области java контролирует, к каким методам или полям можно получить доступ. Принимая в качестве примера Parent#method(), модификатор private указывает, что этот метод может быть доступен (вызван) только в классе Parent. И это именно то, как вы это делаете. он вызывает метод внутри конструктора класса Parent, который компилирует правило. Подробнее см. В разделе управления доступом java от here

+0

_ «здесь это означает экземпляр Child». _ Экземпляры не создаются, носят для ребенка или для родителя, если вы используете код Harshit Gupta. Я уверен, что «вещь», как «Ребенок» существует где-то в памяти (куча), но не экземпляр ... проверьте «jvisualjvm», чтобы убедиться в этом. Если вы делаете что-то вроде «Child ch = new Child()», то наверняка вы можете увидеть созданный «экземпляр», но опять же не для класса Super, как мы знаем. – Nirmal

0

private не имеет никакого отношения к фактическому классу объекта. К объекту private можно получить доступ к любому коду внутри того же класса верхнего уровня. (Класс верхнего уровня является тот, который не вложен, который не имеет отношения к наследству)

method определяется в Parent, и вызов this.method() также находится в Parent, так что это разрешено.

-1

Это очевидно, вы можете вызвать любых частных членов класса, но не вне класса.

В этом случае это законно. В этой программе сначала вызывается конструктор родителя, и вы можете вызвать частный метод внутри класса.

+0

Но сначала посмотрите на тип объекта, с которым я звоню в этот метод. –

+0

Что ты имеешь в виду? вы используете объект родительского класса для вызова его mehtod. – RajSharma

+0

, если вы запустите код, вы увидите, что объект «this» печатает имя класса дочернего объекта. –

2

Когда вы расширяете класс, частные методы не будут наследоваться. Но объект дочернего класса содержит объект родительского класса, поэтому, когда вызывается конструктор суперкласса. Вы можете вызвать закрытый класс суперкласса внутри супер класс

0

Родительский экземпляр здесь не создается, вы можете подтвердить это с помощью jvisualjvm в папке/bin вашей установки jdk, и дочерний экземпляр не будет создан. Родительский конструктор все еще вызывается.

выход:

Parent Default.. 
Object type : com.packagename.Child 
private method 
Child Default.. 

родительский конструктор может быть вызван классом ребенка. Хотя в конструкторе родителя, как отмечал выше Кришанти Моханачандран, частный метод может быть законным.

Смежные вопросы