2015-03-28 2 views
0

взгляд на этот кодJava Наследование и это ключевое слово

public class Machine { 
    public String name = "Machine"; 
    public static int j = 5; 

    public void run() { 
     System.out.println("Machine is running"); 
     System.out.println(this.name); 
    } 

    public void run2() { 
     System.out.println("Machine is running"); 

     System.out.println(this.name); 
     this.run(); 
    } 
} 

public class Computer extends Machine { 
    String name = "Computer "; 

    public void run() { 
     System.out.println("Computer is running"); 
    } 
} 

public class Cpu extends Computer { 
    public String name = "Cpu "; 

    public Cpu() { 
     System.out.println("Constructor of cpu"); 
    } 

    public void run() { 
     System.out.println("Constructor cpu is running"); 
     System.out.println(this); 
    } 

    public void getComputerName() { 
     System.out.println(super.name + " Really?"); 
    } 
} 

public class main { 

    public static void main(String[] args) { 
     Cpu c = new Cpu(); 
     c.run2(); 
    } 
} 

Печать:

Constructor of cpu 
Machine is running 
Machine 
Constructor cpu is running 
[email protected] 

мой вопрос, почему, когда мы используем this ключевое слово с функцией, он идет туда, где this относится и активная функция , но когда мы используем его с полем, он просто идет с полем текущего класса? как в примере

+0

Просто прочитайте это [SO ответ] (http://stackoverflow.com/a/3879343/225503). Поля не унаследованы –

+0

Какой запутанный пример. – CKing

+0

@DiegoFreniche Поля не являются полиморфными, но они наследуются (как бы унаследовали геттеры и сеттеры частного поля?). Они могут быть недоступны (например, частные поля), но они есть. – Pshemo

ответ

2

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


не связана с проблемой, но:

CPU не должна распространяться Computer, так как CPU не Computer. Используйте трюк «is-a», чтобы определить, следует ли расширять. A Computer 'has-a' CPU, поэтому следует использовать композицию.

+0

Но как я не могу переопределить переменные, не переопределено ли имя переменной? или он делает это, потому что его по своему охвату? – MaxDevelop

+0

@Saif Вот как работает наследование. Вы можете переопределять методы, а не переменные. –

0

Когда вы выполняете метод run2 для Cpu, вызывается родительский метод в Machine, потому что он не переопределяется в Cpu. В этой области this.name ссылается на поле Machine.

Когда run2() в Machine вызывает this.run(), он вызывает его на объект, который выполняется - Cpu. Cpu переопределяет run(), и поэтому этот метод вызывается. Внутри области Cpu.run имя поля соответствует имени класса Cpu. «this» относится и к классу Cpu.

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