java内部类

外部类:外部类必须是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是10
Demo:name是小黑    age是9
static class Inner :name是小红 age是11
Demo:getMessage是sdf age是9
形参中的name是堆堆 Demo:name9
形参中的name:怼怼 age是9

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值