A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晓风妮子 中级黑马   /  2013-4-18 13:29  /  1604 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 晓风妮子 于 2013-4-20 13:22 编辑

我不明白,在这段代码中内部类Inner中的show方法没有被静态修饰,为什么可以调用其方法,为什么编译可以通过呢?

static.png (16.15 KB, 下载次数: 4)

static.png

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

倒序浏览
因为内部类Inner中的show方法没有被静态修饰 所以要调用该类的show方法  要new一个对象        在method方法中 new了一个这样的对象i  当然 i  就可以调用show啦
回复 使用道具 举报
那是因为method方法和main程序入口不在同一个类中。在类InnerDemo中实例化了一个Outer类的对象,就可以通过对象调用Outer类中的方法了。
但如果是这样的
class InnerDemo
{
        public void method()
        {
                Inner i=new Inner();
                i.show()
        }
        public static void main(String[] args)
        {
                method();
        }
}
上面调用method方法就是错误的,这应该就是你想表达的意思了。
这是因为要在main函数中调用同在一个类中的方法,方法必须是带有static修饰符的静态方法。而要调用不同类中的方法,需要先实例化一个类的对象,通过对象来调用方法

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
需要搞清楚一点:没有被static修饰的成员,我们通过建立对象去调用;
                但如果是被static修饰的成员,我们不仅可以通过对象去调用,还可以通过类名去调用。
在你的程序中,你是通过创建一个对象去调用的,所以有没有static修饰,你都能调用成功,自然可以编译通过。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
static  对内部类是这样的。

当内部类的成员被static修饰时,内部类也必须是static的
但是,如果内部类是static的话。成员可以不是静态的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
外部其他类调用一个类的外部类分为非静态内部类函数,静态内部类非静态函数,静态内部类静态函数

在外部其他类中访问非静态内部类函数访问方式是
Outer.Inner d = new Outer().new Inner(); 用变量d调用内部类的方法

在外部其他类中如何直接访问静态内部类中的非静态成员呢?
Outer.Inner d = new Outer.Inner();用变量d调用内部类的方法
或者new Outer.Inner().function();
在外部其他类中如何直接访问静态内部类中的静态成员呢?
直接访问 Outer.Inner.function();

楼主给的程序段中:
o.method()方法调用Outer里的method方法。而mehod方法中又调用了静态内部类中的非静态方法show
这就是在外部其他类中如何直接访问静态内部类中的非静态成员的问题
Outer.Inner d = new Outer.Inner();再用变量d调用内部类的方法
或者new Outer.Inner().show();
再看看内部类的访问规则:
1).内部类可以直接访问外部类中的成员,包括私有。
  之所以可以直接访问外部类汇总的成员,因为内部类中持有了一个外部类的引用,格式外部类名.this
(2).外部类要访问内部类,必须建立内部类对象。
这就是为什么在Outer中的method方法访问内部类中的show方法时必须要创建内部类对象,否者,无法从静态上下文中引用非静态

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
风乐 中级黑马 2013-4-19 00:00:30
7#
板凳回答的简单明了
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-19 07:16:59
8#
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马