抽象类变量和继承

时间:2015-07-19 10:24:32

标签: java inheritance constructor abstract-class instance-variables

抽象类有一个变量和一个方法。一个类扩展抽象类,如下所示:

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行给出了一个编译错误。但是如果这一行被移动到类的构造函数中,那么它就会编译

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

这是什么行为?

2 个答案:

答案 0 :(得分:1)

area=r*r;//line 22

不在函数中,而是在类的主体中。

你不能在身体上发表声明。您可以将其包装在静态块中,也可以将其移动到方法中。但由于area是一个实例变量,因此您也无法将其置于静态块中。

当你移动一个方法时,它编译得很好,因为它属于它所在的位置。

仔细查看structure of a java class

答案 1 :(得分:0)

您无法在java类体中调用任何类型的表达式。只有参与赋值的表达式才能直接在java类体中获得。

但如果你真的想这样做,你可以做到以下几点。

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

但是由于Java对象创建生命周期,这段代码无法按预期工作。

将会发生什么。

  1. area = 0 // int的默认值
  2. r = 0
  3. area = r * r // area = 0 * 0
  4. 构造函数体称为
  5. R = A
  6. 最后

    r = a;
    area = 0;