Abstract class 变量和继承

Abstract class Variables and inheritance

摘要 class 有一个变量,method.A class 扩展摘要 class 如下:

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 的构造函数中,它会编译

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

这是什么行为?

area=r*r;//line 22

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

正文中不能有这样的声明。您要么将其包装在一个静态块中,要么将其移动到一个方法中。但是由于 area 是一个实例变量,你也不能将它放在静态块中。

当你将它移动到一个方法时,它编译得很好,因为它是它所属的地方。

仔细看看structure of a java class

您不能在 java class 正文中调用任何类型的表达式。只有参与赋值的表达式才能直接在java class body.

但如果你真的想这样做,你可以执行以下操作。

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. 面积=r*r //面积=0*0
  4. 构造函数体被调用
  5. r=a

最后

r = a;
area = 0;