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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yan 中级黑马   /  2013-8-11 19:26  /  1419 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class outer
{
  
class inner
{
   void show()
{
System.out.println("hello");
}
}
static void function()
{
  new inner().show();
}
}
class  Demo
{
        public static void main(String[] args)
        {
                outer o=new outer();
                o.function();
        }
}
提示是new inner().show();无法从静态上下文引用非静态变量
但是在方法里面不是已经建立了一个匿名对象new inner()了吗
对象不是可以直接调用子的方法吗?可为什么通不过编译呢?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

3 个回复

倒序浏览
就如错误所提示的一样,因为静态成员时先于对象被加载的,所以你这样调用也必须保证内部类已经被加载了
回复 使用道具 举报
因为静态方法随着类的加载而加载,因为show是非静态的即使创建了内部类对象也不能调用内部类的非静态方法,静态方法只能访问静态成员。
回复 使用道具 举报
是你创建内部类对象的方式不对。
内部类需要持有外围类对象的隐式引用,在一个非static方法中创建内部类对象,相当于使用了this引用 。即相当于this.new inner();
然而在一个static方法中创建内部类对象,static方法是属于类的而非属于对象的,因此没有隐式的this引用,这时想要创建内部类对象需要指明其外围类对象。
即需要改成new outer().new inner().show();
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马