内部类访问外部类的变量必须是final吗?
如下:classA{inti=3;publicvoidshout(){classB{publicvoidshout1(){System.out.println(i);}}...
如下:
class A
{
int i = 3;
public void shout()
{
class B
{
public void shout1()
{
System.out.println(i);
}
}
B b=new B();
b.shout1();
}
public static void main(String [] args)
{
A a=new A();
a.shout();
}
}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class A
{
public void shout(int temp)
{
final int i = temp;
class B
{
public void shout1()
{
System.out.println(i);
}
}
B b=new B();
b.shout1();
}
public static void main(String [] args)
{
A a=new A();
a.shout(3);
}
}此时i必须为final,怎么理解呢? 展开
class A
{
int i = 3;
public void shout()
{
class B
{
public void shout1()
{
System.out.println(i);
}
}
B b=new B();
b.shout1();
}
public static void main(String [] args)
{
A a=new A();
a.shout();
}
}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class A
{
public void shout(int temp)
{
final int i = temp;
class B
{
public void shout1()
{
System.out.println(i);
}
}
B b=new B();
b.shout1();
}
public static void main(String [] args)
{
A a=new A();
a.shout(3);
}
}此时i必须为final,怎么理解呢? 展开
推荐于2017-09-29 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464983
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
是的,因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
展开全部
如不是final变量, 当i发生变化, 类B实例不能找到新i变量的地址, 便会出现了歧义. 如不希望final, 可讲i定义为A的类成员变量
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
count++; 指的是方法的局部变量 因为在方法中定义了一个 int count
所以覆盖了所在类的变量 count ,所以参数count的值+1;
this.count++ 指的是所在类的变量count+1,为了与方法的局部变量count区分开来,所以必须用this.
而GroupThree.count++;因为GroupThree中的变量count是类变量,即静态变量有static,所以可以通过类名直接调用,所以GroupThree.count++;指的是
GroupThree的类变量count+1;
最后一个 GroupThree.this.count++;
内包类访问外包类的同名变量时,采用的格式是:外包类名.this.同名变量;
这个慢慢就可以理解了。希望对你有帮助
所以覆盖了所在类的变量 count ,所以参数count的值+1;
this.count++ 指的是所在类的变量count+1,为了与方法的局部变量count区分开来,所以必须用this.
而GroupThree.count++;因为GroupThree中的变量count是类变量,即静态变量有static,所以可以通过类名直接调用,所以GroupThree.count++;指的是
GroupThree的类变量count+1;
最后一个 GroupThree.this.count++;
内包类访问外包类的同名变量时,采用的格式是:外包类名.this.同名变量;
这个慢慢就可以理解了。希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询