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 是一个实例变量,你也不能将它放在静态块中。
当你将它移动到一个方法时,它编译得很好,因为它是它所属的地方。
您不能在 java class 正文中调用任何类型的表达式。只有参与赋值的表达式才能直接在java class body.
但如果你真的想这样做,你可以执行以下操作。
class circle extends shape
{
int r;
circle(int a){r = a;}
{
area=r*r;//line 22
}
}
但是由于 Java 对象创建生命周期,此代码将无法按您预期的那样工作。
接下来会发生什么。
- area = 0// int 的默认值
- r = 0
- 面积=r*r //面积=0*0
- 构造函数体被调用
- r=a
最后
r = a;
area = 0;
摘要 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 是一个实例变量,你也不能将它放在静态块中。
当你将它移动到一个方法时,它编译得很好,因为它是它所属的地方。
您不能在 java class 正文中调用任何类型的表达式。只有参与赋值的表达式才能直接在java class body.
但如果你真的想这样做,你可以执行以下操作。
class circle extends shape
{
int r;
circle(int a){r = a;}
{
area=r*r;//line 22
}
}
但是由于 Java 对象创建生命周期,此代码将无法按您预期的那样工作。
接下来会发生什么。
- area = 0// int 的默认值
- r = 0
- 面积=r*r //面积=0*0
- 构造函数体被调用
- r=a
最后
r = a;
area = 0;