黑马程序员技术交流社区
标题:
关于day10 -06 课堂上将的一道练习题
[打印本页]
作者:
喜欢流浪
时间:
2013-5-30 21:38
标题:
关于day10 -06 课堂上将的一道练习题
本帖最后由 喜欢流浪 于 2013-5-30 22:23 编辑
写出下列代码的结果
class TD
{
int y=6;
class Inner
{
static int y=3;
void show()
{
System.out.println(y);
}
}
}
class TC
{
public static void main(String[] args)
{
TD.Inner ti=new TD().new Inner();
ti.show();
}
}
复制代码
老师给出的直接答案是:
编译失败,非静态内部类中不可以定义静态成员。
内部类中如果定义了静态成员,该内部类必须被静态修饰。
我直接将原题进行编译 会出现
内部类不能有静态声明的提示;
查阅发现有这样解释:
内部类的对象默认持有创建它的那个封装类的一个对象的句柄。
然而,假如我们说一个内部类是static的,这种说法却是不成立的。static内部类意味着:
(1) 为创建一个static内部类的对象,我们不需要一个外部类对象。
(2) 不能从static内部类的一个对象中访问一个外部类对象。
所以我想说本题的直接错误是 内部类中不能有静态声明 因此
修改:内部类中不能有静态声明 修改 将static 去掉
不知道对不对啊!
作者:
逸盏清茶
时间:
2013-5-30 22:04
class TD
{
int y=6;
static class Inner
{
static int y=3;
void show()
{
System.out.println(y);
}
}
}
复制代码
修改:内部类中不能有静态声明 修改 将static 去掉
不对,这个可以有 ,把内部类也变成静态的就可以有了
作者:
喜欢流浪
时间:
2013-5-30 22:22
逸盏清茶 发表于 2013-5-30 22:04
不对,这个可以有 ,把内部类也变成静态的就可以有了
ok ,谢谢了。这样改的话,就是直接用,不用再创建对象了!
作者:
xiatian
时间:
2013-5-30 22:29
可以把static去掉,就可以了。要是把内部类修饰为静态的,调用方法要改成TD.Inner ti = new TD.Inner(); ti.show(); 输出都是3。
作者:
原满
时间:
2013-5-30 22:29
非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关
因此,非静态内部类中不能定义静态域/方法,编译过不了
要想编译通过 有几种改法
1、第六行 static去掉
2、第六行 static final int y=3; //变成静态常量
3、把class Inner 也变成静态 但17行得 改为 TD.Inner inner= new TD.Inner();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2