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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄克帅 中级黑马   /  2012-5-26 00:44  /  1911 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄克帅 于 2012-6-11 13:31 编辑

1 匿名内部类是否一定是局部内部类?
2 为什么在静态方法中不能new 非静态的内部类?

public class Person {

        public String name = "lisi";
        public  int age = 40;

}

public class Student {

        private int age=20;

        class Head extends Person {
                Head h = new Head();//这里运行会报错  为什么?  是不是成员内部类不能继承其他类?
                String name = h.name;

                public void thinking() {
                        System.out.println(name);
                }

        }

        static class Body {
                // Head h = new Head(); new非静态内部会报错
                Person p = new Person(); // new 其他非静态内部类完全没有问题
                int nianling = p.age;

                public void write() {
                        System.out.println(nianling);
                }

        }

        public void doSomething() {
                // 匿名内部类定义在外面会报错  为什么?  是不是成员内部类不能继承其他类?
                new Person() {

                };
        }

}

public class Test {
        public static void main(String[] args) {
                Student.Body stb = new Student.Body();
                stb.write();
                Student.Head sth = new Student().new Head();
                sth.thinking();
        }

}

输出结果
40
Exception in thread "main" java.lang.StackOverflowError
        at duotai.Student$Head.<init>(Student.java:8)

3 个回复

正序浏览
本帖最后由 黄克帅 于 2012-5-26 11:23 编辑

还是不是很懂  
1  为什么 静态内部类里面可以创建另一个非静态类,却不可以创建同一个类中的非静态内部类
2 既然成员内部类可以可以继承其他类,为什么不可以直接用匿名内部类的格式。
回复 使用道具 举报
对2楼的回答进行补充:

①先回答你的前面两个问题:
匿名内部类,就是以后都不会用的类所以不用起名字,当然你可以把他看做局部类。

补充:内部类既可以放在外部类的定义属性的位置上,也可以放在外部类中方法的里面。

静态方法 和所有静态的东西,里面都不能有非静态成员。

补充:凡是被static修饰过的类,方法,变量等,她们都是随着类的加载而加载,都存放在内存中的方法区里,优先于对象建立,而非静态的东西要末存放在堆内存里(对象等),要末存放在栈内存里(变量等),他们不在同一块内存上。非静态成员可以访问静态成员和非静态成员,静态成员只能访问静态成员。


②是不是成员内部类不能继承其他类?------能。   


补充:内部类首先是个类,他可以继承其他类,可以实现接口,这和一般类没有区别。但他是内部类,别的类访问他时,是需要通过外部类访问的。

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
职业规划-刘倩老师 + 1 赞一个!
xieshuhua + 6 老师这个回答的水平很高哦。

查看全部评分

回复 使用道具 举报
哥们,你这段代码问题太多了,留下一句都会报错。。。
①先回答你的前面两个问题:
匿名内部类,就是以后都不会用的类所以不用起名字,当然你可以把他看做局部类。
静态方法 和所有静态的东西,里面都不能有非静态成员。就如同贴个男生宿舍的标签,里面不能有女生,对吧。
②是不是成员内部类不能继承其他类?------能。    如下代码所示。
  1. class Person {
  2. public String name = "lisi";
  3. public int age = 40;
  4. }
  5. class Student {
  6. class Head extends Person {
  7. /*Head h = new Head();//这里运行会报错 为什么? 是不是成员内部类不能继承其他类?*/
  8. }
  9. }
  10. public class cw{
  11. public static void main(String[] str ){
  12. Student s1=new Student();
  13. Head h1=s1.new Head();
  14. System.out.println(h1.age);
  15. }
  16. }
复制代码
你这个new Head 是个死循环啊。。。
希望能够帮到你~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马