编译不通过,怎么解决50分

e_he 2003-02-19 08:51:05
public class app13
{
public static void main(String args[])
{
CCircle cir1,cir2; //final CCircle cir1,cir2;
cir2=new CCircle();
(new CCircle(22.0){void show(){
System.out.println("area new="+cir2.pi*cir2.radius*cir2.radius);}}).show();
}
static class CCircle //定义类CCircle
{
private static double pi=3.14;
private static double radius;
public CCircle()
{}
public CCircle(double r) //CCircle构造函数
{
radius=r;
}
}
}
以上编译不成功,必须将第五行cir1和cir2声明成final才可以,这是为什么?
...全文
31 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieshen 2003-02-19
  • 打赏
  • 举报
回复
学习
Norwaywoods 2003-02-19
  • 打赏
  • 举报
回复
这是因为你的类CCircle是静态类,所以你的内部的静态类CCircle只能访问外部的常量。

具体原因:
虽然类app13包裹着类CCircle,但是两者之间没有必然的联系。(可以从编译出来两个类文件看出来,app13.class 和 app13$CCircle.class)。因此,内部的类CCircle产生的实例的生存周期可以比外部类的实例长。试想如果内部类实例去访问一个已经不存在的外部类app13的实例的普通成员变量,而这个实例可能已经不存在了,会出现什么情况。因此,内外通讯的唯一允许变量类型就是常量(final)。这是因为类常量在内存中存放的地方与实例成员变量不同。它的生命周期长,而且可以不依赖。类实例而存在(可以这样用,app13.FinalVariable).

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧