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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-6-18 12:39  /  1319 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙胜录 于 2012-6-18 23:06 编辑

匿名内部类的构造函数怎么写?
当匿名内部类中的成员变量名和外部类的成员变量名相同时,想要在内部类中调用外部类的非静态成员变量,要怎么调?是否可以用super();

4 个回复

倒序浏览
内部类的构造函数跟外部类一样
内部内要访问外部类成员,如果不同名那么外部类的变量加final
如果相同则要使用 外部类.this.变量名

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主看下和运行下以下的例子,会有一些了解!

class Outer {
        private int x = 3;

        class Inner// 内部类
        {
                int x = 4;
                void function() {
                        int x = 6;
                        System.out.println("innner :" + Outer.this.x);
                        System.out.println("innner :" + this.x);
                        System.out.println("innner :" + x);
                }
        }

        /**/
        void method() {
                Inner in = new Inner();
                in.function();
        }
}

class Test{
        public static void main(String[] args) {
                Outer out = new Outer();
                out.method();

                // 直接访问内部类中的成员。
                // Outer.Inner in = new Outer().new Inner();
                // in.function();
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是匿名内部类的例子:(哥们说的那个匿名内部类的构造函数应该是不能有)
public class ExamFrame extends JFrame {
          public ExamFrame() {
                init();
        }
        public ExamFrame(ClientContext context) {
                this();
                this.context = context;
        }
        public void init() {
                setSize(600, 500);
                setTitle("在线评测");
                setContentPane(createContentPane());
                                 //这里就使用了匿名内部类
                addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                context.exit(ExamFrame.this, "是否离开!");}
                });
        }
}
构造函数是在实例化对象时用到的,也就是给属性赋值。
如果内部类有了构造函数的话就是想要对内部类进行实例化.....下边是我对内部类的理解
内部类继承自某个类或实现某个接口,内部类的代码是对它外变类的对象(仅仅是次外层)进行操作的。所以可以认为内部类提供了某种进入其外围类的窗口。

使用内部类最吸引人的原因是:   
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
直接访问内部类中的成员:外类名.内类名  起一个名 = new  外类名().new 内类名();

对于当匿名内部类中的成员变量名和外部类的成员变量名相同时,想要在内部类中调用外部类的非静态成员变量时
可以用:外部类.this.变量名,

至于super吧,上边说的感觉很清楚了,既然不使用构造函数,就用不着super了吧
回复 使用道具 举报
变量有其作用域的,如果声明在构造方法里,只是一个局部变量而已,方法外访问不到

不过有个变通的方法,你可以在构造方法里把viewScroll传递给 treeInit(),也就是treeInit改成带参数的方法

要在内部类中调用在内部类以外定义的方法,变量等需要将这些方法或者变量定义为终态final的,但是这里又出现一个问题当变量声明为final的时候是不允许改变的.为了要达到我们的目的我们需要借助数组这个东东:
比如: final int[] a = {0};
我们在内部类中使用这个数组a的0号元素. 如果我门要改变他的值只需要对a[0]改变.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马