2015-09-24 4 views
-1

Я играл с классами, так как я изучаю синтаксис Java, и я наткнулся на эту странную ситуацию. Поэтому, учитывая класс A и B:Наследование и статический тип java

public class A { 
    public int x() { 
     return x; 
    } 
} 

public class B extends A { 
    int x = 5; 
    public int x() { 
     return x + 2; 
    } 
    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b.x()); 
} 

Выполнение основного метода я получаю ошибку во время компиляции, что он не находит переменную x и это призывающий метод из A, поскольку ошибка показывает return x вместо return x + 2. Так как статический тип b - B, почему он ищет в A для x?

error: cannot find symbol 

return x; 

symbol: variable x 
location: class A 
+1

класса 'A' ​​есть это не распространяется переменная' x', что вы пытаетесь вернуться в функции 'A # x'. – SomeJavaGuy

+2

У вас нет объявлений 'int x' в вашем классе A. – drgPP

+4

' return x; '==>' x' определен в 'B',' A' не имеет возможности это знать – TheLostMind

ответ

3

Класс A не знает, что он будет продлен B, где будет существовать переменная x.

Для того, чтобы сделать эту компиляцию, сделать A.x() аннотация и обеспечить реализацию в рамках подкласса:

public abstract class A { 
    public abstract int x(); 
} 

public class B extends A { 
    int x = 5; 

    @Override 
    public int x() { 
     return x + 2; 
    } 
.. 
} 
+0

Отлично, я понимаю, что теперь я слишком сосредоточен на объявлении нового объекта и думал, что с ним что-то связано. Спасибо всем! –

0

При создании объекта класса B, то он автоматически ссылаться на х() класса А, А x не инициализируется в этом классе. Поскольку это локальная переменная, она не может использоваться без инициализации. поэтому он дает ошибку.

Попробуйте следующий код, он работает правильно

class A 
{ 
    int x =10; 
    public int x() 
    { 
     return x; 
    } 
} 
class B extends A 
{ 
    int x = 5; 
    public int x() 
    { 
     return x + 2; 
    } 
    public static void main(String[] args) 
    { 
     B b = new B(); 
     System.out.println(b.x()); 
    } 
} 
Смежные вопросы