2016-03-01 2 views
0

Я выполнил следующую программу, и мне интересно, какой результат я получил, когда выход функции печатается первым, даже если это была переменная, которую я пытался напечатать первым.Почему функция «Переопределенная» вызывает вызов первым?

class Baap{ 

    public int h = 4; 
    public int getH(){ 
     System.out.println("Baap "+h); return h; 
    } 

} 

public class Beta extends Baap{ 

    public int h = 44; 
    public int getH(){ 
     System.out.println("Beta "+h); return h; 
    } 
    public static void main(String args[]){ 
     Baap b = new Beta(); 
     System.out.println(b.h+" "+b.getH()); 
     Beta bb = (Beta)b; 
     System.out.println(bb.h+" "+bb.getH()); 
    } 

} 

Выход был следующим

Beta 44 
4 44 
Beta 44 
44 44 

Может кто-нибудь помочь мне понять, почему функциональный блок запускается на выполнение первой?

+0

@Nambari, это не то, что он имеет в виду. – Dave

ответ

4

Ваша линия System.out.println печатает String.

String оценивается во время выполнения, как b.h + " " + b.getH(), так что сцепляет b.h, пространство и результат метода b.getH(), поэтому он вызывает getH() который печатает Beta 44, а затем выводит результат 4 44.

0

Когда вы вызываете функцию, сначала необходимо оценить все ее параметры. В вашем случае единственным параметром System.out.println является выражение b.h + " " + b.getH().

Поскольку это еще выражение, следующим шагом является оценка этого выражения, что означает определение значения выражения. Он состоит из 2 плюс операторов, которые имеют 3 операнда. Чтобы оценить плюсовые операторы, программа должна оценить значения операндов.

Значение b.h оценивается в 4, поскольку переменные разрешены статически-иш в Java. Тип переменной b равен Baap, поэтому мы получаем 4.
Следующее значение: " ", которое уже является буквальным, поэтому нечего делать.
После этого у нас есть вызов функции b.getH(). Функциональные вызовы в Java всегда разрешаются практически, поэтому мы фактически вызываем функцию, называемую getH типа Beta. Эта функция видит только свою область видимости, где переменная h объявлена ​​в классе Beta «теней», объявленной в классе Baap, что означает, что переменная hBaap скрыта для каждого члена Beta.
Чтобы оценить вызов функции, мы должны выполнить функцию, которая печатает «Beta 44» и возвращает значение 44.

Теперь, когда у нас есть значения для всех трех операторов, мы можем оценить выражение с помощью операторов +. В результате получается строка «4 44», которая теперь передается в System.out.println и, наконец, печатается на экране.

+0

Спасибо. Понял. – eccentricCoder

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