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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内部类可以访问外部类的函数吗? 如何访问?

4 个回复

倒序浏览
给你看看内部类总结吧。看了都明白了。
一、        内部类的访问规则。
1、        内部类可以直接访问外部类的成员,包括私有成员,原因是:内部类中持有一个外部类的引用,格式为:外部类名.this。
2、        外部类访问内部类必须建立内部类对象。
3、        当内部类定义在直接外部类的成员位置上,而且是非私有成员,可以在间接外部类中引用内部类,其格式为:直接外部类名.内部类名 对象名= new直接外部类构造函数名.new 内部类构造函数名,形如Outer.Inner inner = new Outer().new Inner();。
4、        在成员位置上的内部类可以被可以被成员修饰符修饰,比如:private static(当内部类被其修饰,则内部类只能访问直接外部类的静态成员)等内部类相当于外部类的一个成员。内部类有static修饰时则内部类必须是static。
5、        当内部类定义在局部时,1)、不可以被成员修饰符修饰。2)、可以直接访问外部类中的成员,因为该内部类还持有外部类的引用。但不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
实例演示:
package com.abin;
class Outer{
        //定义外部内的私有成员
        private int x=2;
        //创建内部类
        class Inner{
                //定义内部类的私有成员
                private int x = 4;
                public void show(){
                        int x = 6;
                        System.out.println("您正在访问内部类的show()方法");
                        System.out.println("在内部类Inner的方法show()中调用方法内部成员x="+x);
                        System.out.println("在内部类Inner的方法show()中调用内部类私有成员x="+this.x);
                        System.out.println("在内部类Inner的方法show()中调用外部类的私有成员x="+Outer.this.x);
                }
        }
        public void show(){
                System.out.println("您正在访问外部类的show()方法");
                //在外部类中访问内部类需要建立内部类的对象
                Inner inner = new Inner();
                inner.show();
        }
        
}
public class InnerClass {
        public static void main(String[] args) {
                //实例化外部类
                Outer outer = new Outer();
                //调用外部类方法
                outer.show();
        //直接实例化内部类
                Outer.Inner inner = new Outer().new Inner();
                System.out.println("通过内部类实例化的对象调用内部类方法show():");
                inner.show();
        }
}
二、        匿名内部类
1、        匿名内部类其实就是内部类的简写格式。
2、        定义内部类的前提:内部类必须是继承一个类或者实现接口。
3、        匿名内部类的格式:new 父类或者接口名(){定义子类的内容}
4、        其实匿名内部类就是一个匿名子类对象。
示例代码:
package com.abin;
interface inner{
        void method();
}
class OuterA{
        
        static inner show(){
                return new inner() {
                        @Override
                        public void method() {
                                System.out.println("method:嘿,陈从宾我是你定义的匿名内部类中的方法");
                        }
                };
        }
}
public class InnerClass2 {
        public static void main(String[] args) {
                OuterA.show().method();
                show(new inner() {
                        @Override
                        public void method() {
                                System.out.print("method:嘿,陈从宾你以接口作为参数成功¡¤¡¤¡¤");
                        }
                });
        }
        /*
         * 功能:说明匿名内部类的应用:让接口作为函数参数
         * 参数:一个接口
         * 返回值:无
         */
        public static void show(inner in) {
                in.method();
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
可以用以下方式:
外部类名.this.方法名
外部类名.this.属性名。也可以不用this,
因为访问内部类的时候同时也保存着外部类的this指针。
内部类对象可以直接访问外围对象的所有成员(包括私有的),而不需要任何特殊条件,就像调用自己的方法与属性成员一样。但外围类不能直接访问内部类中的方法,除非使用内部类的实例来访问(也能访问私有的)。
class   Outerclass   {
        public   void   outerMethod()   {
                System.out.println( "I 'm   OuterClass 's   Method ");
        }
        class   Innerclass   {
                public   void   innerMethod()   {
                      outerMethod();
                }
        }
}
回复 使用道具 举报
你这问得不够精确,内部类有两种,成员内部类,局部内部类。你是问的成员内部类吗?
如果是,那就可以直接访问,因为成员内部类也是外部类的成员,成员之间自然是可以直接互相访问的
但是要实例化内部类,就不能直接创建对象了,必须外部类对象先存在,然后以.内部类实例化的形式创建内部对象
回复 使用道具 举报
李红飞 发表于 2012-5-29 11:18
可以用以下方式:
外部类名.this.方法名
外部类名.this.属性名。也可以不用this,

  谢谢  成功了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马