-1

Абстрактный класс имеет переменную и класс method.A расширяет абстрактный класс следующим образом:Аннотация Переменные класса и наследование

abstract class shape 
{ 
    int area; 
    void printArea(){System.out.println("Area = "+area);}  
} 

class circle extends shape 
{ 
    int r; 
    circle(int a){r = a;}  
    area=r*r;//line 22 
} 

public class Abstraction{ 
    public static void main(String[] args) {    
     circle c=new circle(10); 
     c.printArea(); 
    } 

} 

Line 22 дает компиляцию error.But, если эта строка перемещается в конструктор класса компилирует

class circle extends shape 
{ 
    int r; 
    circle(int a){r = a;area=r*r;}   
} 

Что такое поведение?

+2

Это действительно га s не имеет ничего общего с абстрактными классами. Проблема в том, что синтаксис Java требует, чтобы вы заключили назначения в переменные, объявленные в другом месте ('area' в вашем случае) в телах метода (или конструктора) или внутри статических блоков инициализатора. –

+0

@MickMnemonic Но унаследованная переменная может быть непосредственно использована в производном классе. Не так ли? – Pradeep

+0

@Pradeep да, и вы используете его .. в функции конструктора –

ответ

1
area=r*r;//line 22 

не имеет функции, но в кузове класса.

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

Когда вы перемещаете его методом, он компилируется отлично, потому что он принадлежит ему.

Посмотрите внимательно на structure of a java class.

+0

Но унаследованная переменная может использоваться непосредственно в производном классе. Не так ли? – Pradeep

+0

Проблема не в области переменной области. Проблема состоит в том, что ** РАЗМЕЩЕНИЕ ** этого заявления. Если это проблема с областью, ваш код не будет компилироваться, даже если вы переместили оператор в метод circle. – Alp

0

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

Но если вы действительно хотите пойти таким путем, вы можете сделать следующее.

class circle extends shape 
{ 
    int r; 
    circle(int a){r = a;} 
    { 
     area=r*r;//line 22 
    } 
} 

Но этот код не будет работать так, как вы ожидали, из-за жизненного цикла создания объектов Java.

Что произойдет.

  1. область = 0 // Значение по умолчанию для Int
  2. г = 0
  3. области = г * г // площадь = 0 * 0
  4. Constructor тела называется
  5. г = а

Итак, наконец

r = a; 
area = 0; 
Смежные вопросы