java内部类

来源:互联网 发布:爱普生清零软件中文版 编辑:程序博客网 时间:2024/06/03 21:42

外部类:外部类必须是public,不能更改访问权限修饰符。
内部类: 把一个类写在了另一个类或方法中, 可以设置访问权限修饰符。

成员内部类

  1. 在类中创建的类称为成员内部类。
  2. 可以拥有private、protected访问权限修饰符。
  3. 实例化是时必须先new出外部类的对象。
  4. 外部类和内部类属性同名,默认使用内部类。
  5. 若要使用外部类的方法和属性:外部类名.this.变量名或方法名

局部内部类

被定义在某个方法或者代码块中。 仅限于方法体内使用。

匿名内部类

没有名称
所有的匿名内部类必须继承一个类或实现一个接口。
匿名内部类引用外部参数时,必须为常量。

静态内部类

被static修饰的成员内部类是静态内部类
不依赖于外部类,可以直接创建对象。

外部类和内部类会生成两个class文件,内部类有外部类的指针引用存在。
代码示例

public abstract class Animal {    public abstract void eat();}
public interface Fly {    void fly();}
public class Demo {    private String name="小黑";    private int age=9;    /*     * 成员内部类     */    class Inner{        private String name="小白";        private int age=10;        public void say(){            System.out.println("InnerClass:name是"+name+"\tage是"+age);            System.out.println("Demo:name是"+Demo.this.name+"\tage是"+Demo.this.age);        }    }    /*     * 静态成员内部类     */    static class InnerTwo{        private String name="小红";        private int age=11;        public void say(){            System.out.println("static class Inner :name是"+name+"\tage是"+age);        }    }    /*     * 局部内部类     */    public void getMessage(final String name){        class InnerMethod{            private int age=12;            public void say(){                System.out.println("Demo:getMessage是"+name+"\tage是"+Demo.this.age);            }           }        InnerMethod inme=new InnerMethod();        inme.say();    }    /*     * 匿名内部类     */    class Noname{        public void noName(final String name){            Animal dog=new Animal() {                   @Override                public void eat() {                    System.out.println("形参中的name是"+name+"\tDemo:name是"+Demo.this.age);                                  }            };            dog.eat();        }    }    class Noname2{        public void noName(final String name){            Fly bird=new Fly() {                        @Override                public void fly() {                    // TODO Auto-generated method stub                    System.out.println("形参中的name:"+name+"\tage是"+Demo.this.age);                }            };            bird.fly();        }    }}
public class Test {    public static void main(String[] args) {        /*         * 实例化成员内部类         */        Inner inner=new Demo().new Inner();        inner.say();        /*         * 实例化静态内部类         */        InnerTwo innertwo=new InnerTwo();        innertwo.say();        /*         * 调用局部内部类         */        Demo demo=new Demo();        demo.getMessage("sdf");        /*         * 匿名内部类实例化         */        Noname noname=new Demo().new Noname();        noname.noName("堆堆");        /*         * 匿名内部类实例化         */        Noname2 noname2=new Demo().new Noname2();        noname2.noName("怼怼");    }}
InnerClass:name是小白  age是10Demo:name是小黑    age是9static class Inner :name是小红 age是11Demo:getMessage是sdf age是9形参中的name是堆堆 Demo:name9形参中的name:怼怼 age是9

为何局部内部类和匿名内部类里只能接收final的参数呢?
https://www.cnblogs.com/dolphin0520/p/3811445.html

阅读全文
0 0
原创粉丝点击