-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(); 
    } 

} 

線22給出了一個彙編error.But如果這條線移動到構造它編譯的類別

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

這是什麼行爲?

+2

這確實公頃與抽象類無關。問題在於,Java語法要求您將方法(或構造方法)體內或靜態初始化塊內部的賦值放入其他地方聲明的變量(在您的案例中爲'area')。 –

+0

@MickMnemonic但是可以直接在派生類中使用繼承的變量。不是嗎? – Pradeep

+0

@Pradeep是和你正在使用它..在構造函數 –

回答

1
area=r*r;//line 22 

不在函數中,而是在類的主體中。

你不能在這樣的身體中有一個聲明。您可以將其封裝在靜態塊中或將其移至方法中。但是因爲area是一個實例變量,所以你也不能將它放在靜態塊中。

當你移動它的方法時,它編譯得很好,因爲它是它的所在。請致電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. 使r = 0
  3. 面積值= R * R //面積= 0 * 0
  4. 構造體被稱爲
  5. R = A

所以最後

r = a; 
area = 0;