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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tianhaolin 初级黑马   /  2018-12-25 17:22  /  718 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tianhaolin 于 2018-12-25 17:25 编辑

Java中的外部类和内部类


外部类
1.外部类的修饰符可以使用public/[default]
2.外部类不可以使用static修饰

内部类
成员内部类
1.成员内部类是最普通的内部类,它的定义位于另一个类的内部
[Java] 纯文本查看 复制代码
class Circle {
    double radius = 0;
     
    public Circle(double radius) {
        this.radius = radius;
    }
     
    //成员内部类
    class Draw {     
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

2.成员内部类可以使用public/[default]/protected/private修饰,可以用static修饰
[Java] 纯文本查看 复制代码
public class Circle {
    public static abstract class Draw{}
}

3.成员内部类可以看做外部类的一个成员,成员内部类可以无条件的访问外部类的所有成员(包括private成员和静态成员)
[Java] 纯文本查看 复制代码
class Circle {
    private double radius = 0;
    public static int count =1;
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println(radius);  //外部类的private成员
            System.out.println(count);   //外部类的静态成员
        }
    }
}

4.在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
class Circle {
    private double radius = 0;

    public Circle(double radius) {
        this.radius = radius;
        getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问
    }
     
    private Draw getDrawInstance() {
        return new Draw();
    }
     
    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println(radius);  //外部类的private成员
        }
    }
}
局部内部类
1.局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class People{
    public People() {
         
    }
}

class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}
2.局部内部类和局部变量一样不可以使用public/[default]/protected/private修饰,也不可以用static修饰
3.局部内部类只能访问final修饰的局部变量
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args)  {
         
    }
     
    public void test(final int b) {
        final int a = 10;//如果去掉final会编译报错
        new Thread(){
            public void run() {
                System.out.println(a);
                System.out.println(b);
            };
        }.start();
    }
}

匿名内部类
1.一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
[Java] 纯文本查看 复制代码
new OnClickListener() {
             
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 
            }
        }

2.匿名内部类一般用于减少代码书写量
3.匿名内部类是唯一没有构造器的类
4.匿名内部类只能访问final修饰的局部变量
静态内部类
1.静态内部类是使用static修饰的内部类
2.静态内部类中不可以访问非静态方法和变量
为什么匿名内部类和静态内部类只能访问final修饰的局部变量
因为两种类的生命周期都大于方法!!!!



Reference
本文参考http://www.cnblogs.com/dolphin0520/p/3811445.html,此链接中有更详细的原理解释,感兴趣的同学可以去原贴学习


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马