黑马程序员技术交流社区
标题:
关于内部类访问的问题
[打印本页]
作者:
yllw258
时间:
2012-6-15 09:35
标题:
关于内部类访问的问题
class Outer
{
private int x = 3;
class Inner
{
int x = 4;
void function()
{
int = 6;
System.out.println(x);//按照老师说的内部类中持有了一个外部类的引用,格式为:Outer.this.x,且此应用默认省略,因此输出是不是6?
}
}
void method()
{
Inner in = new Inner();
in.function();
}
}
作者:
赵玮_Tom
时间:
2012-6-15 09:53
你的代码肯定没有运行过!int = 6;这种错误让人情何以堪?当然,我知道这是int x = 6;的简写形式{:soso_e113:}
内部类的确有一个外部类的引用,但在访问同名变量时,总是有一个规律,那就是,先在近处找,找不到再到远处找。
内部类内部又x,外部类也有,先在内部类找,找到了,就不去外部类找了,输出的是内部类的x。如果内部类没有,此处输出的才是外部类的x。
当你在内部类中可以直接访问到外部类的x,也就证明内部类持有外部类的引用。
作者:
孙峰
时间:
2012-6-15 09:55
class Outer
{
private int x = 3;
static class Inner
{
int x = 4;
void function()
{
int x= 6;
System.out.println(x);// 这种情况下输出 6, 调用的就是本函数的局部变量
//println(this.x)时输出4, 这里this 是指 Inner
// println(new Outer().x)时输出 3. 因为Inner是静态的,所以先建立外部类对象:new Outer(),然后调用它的x.
}
}
static void method()
{
Inner in = new Inner();
in.function();
}
public static void main(String[] args)
{
method();
}
}
作者:
杨朔
时间:
2012-6-15 10:22
你的这个程序是肯定没法运行,外部类调用内部类的方法应该是Outer inner in=new Outer().Inner()。那个输出结果应该是6,内部类持有外部类的引用,可以直接调用外部类的对象,但是如果变量同名时,它会先调用自身的变量,如果在x前面加一个Outer就调用外边的。
作者:
郑冬
时间:
2012-6-15 10:51
如果按楼主写的程序,则必须使用Outer.Inner in=new Outer().new Inner()来创建内部类实例,如果外部类属性,内部类属性与内部类里方法的局部变量同名,则可通过使用this,外部类类名.this作为限定来区分。
作者:
柯玲
时间:
2012-6-15 12:26
典型的对知识点一知半解。代码也没有执行过。
“内部类中持有了一个外部类的引用,格式为:Outer.this.x,且此应用默认省略”是有条件的:外部类和内部类未定义过名字相同的变量
如以下程序就是内部类持有一个对外部类的引用:
class Outer{
private int x=3;
class Inner{
void show(){
System.out.println("x="+x);
}
}
void method(){
Inner in=new Inner();
in.show();
}
}
class InnerDemo4{
public static void main(String[] args){
Outer outer=new Outer();
outer.method();
}
}
复制代码
若是你写的这个程序,输出x值为function()中定义的6.这个可以用就近原则解释:对象最终调用的function(),而int x=6存在于function()里,一旦找到,就没必要向上抽取同名的变量。
希望对你有帮助,还有我的建议是:不要一个知识点看了一半,就抛出问题。不管结果如何,有个好的过程,能实实在在的学到东西才是最终目标。何况技术是层出不穷的,更多的是靠自己的自学和思考能力。
作者:
yllw258
时间:
2012-6-15 13:23
标题:
已解决
本帖最后由 yllw258 于 2012-6-15 13:26 编辑
我明白了,谢谢大家{:soso_e100:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2