java中的内部类

内部类

  将一个类定义在另一个类的内部(也是是在方法中,包括静态方法),这个类就叫做内部类。另一个类也可以是接口,也就是说内部类也可以存在接口中。

public class OutClass {
    private Integer a;
    class Inner {
    }
}

普通内部类

  内部类的定义非常简单,就像上面的Inner,当然,内部类也具有自己的访问权限。那我们如何创建一个内部类对象呢?在外部类的非静态方法之外的任意位置创建(外部类的静态方法内,和其他类任意位置),必须向下面main方法一样

 public static void main(String[] args) {
        OutClass out=new OutClass();
        Inner in= out.new Inner();
    }

  out.new ,需要一个外部内的引用out。我们也可以在外部类的方法中返回内部类对象,这样就可以调用方法直接得到一个内部类对象。
内部类,可以任意访问外部类的所有元素,即使外部类的元素是私有的。可以通过外部类.this来获取外部类对象。普通内部类不能拥有静态资源,除非是静态内部类。

public class OutClass {
    private Integer a;
    class Inner {
        int b=OutClass.this.a;
    }
}

静态内部类

  可以将内部类定义成static,这样的内部类叫做嵌套类。
  创建一个嵌套类对象,不再需要外部内的引用,可直接创建。

public class OutClass {
    private Integer a;
    static class Inner {
    }
    public static void main(String[] args) {
        Inner in= new Inner();
    }
}

  嵌套不能再通过 外部类.this获得外部类对象。

匿名内部类

public class OutClass {
    private Integer a;
    class Inner {
    }
    public static Animal info(){
        return new Animal(){
            String name="猫";
            public void show(){
                System.out.println("我是"+name+"今年"+age);//我是猫今年18
            }
        };
    }
    public static void main(String[] args) {
        OutClass.info().show();
    }
}
---------------------------------------------------------------
interface Animal {
    int age=18;
    void show();
}

  匿名内部类是创建继承其他类或者接口的匿名类对象,怎么理解这句话呢?我们看上面的info方法,返回一个Aniaml对象。实际返回的是new Aniaml(){},这个{}里面可以写方法和属性,这其实是Animal的子类,向上转型再返回。因为没有名字所以叫做匿名类,同时你也不能给它加构造方法,只能靠构造块。

public abstract class Animal {
    public Animal(int a,int b){}
    int age=18;
    abstract void show();
}

  如果你继承的类拥有含参数的构造方法,那这个匿名类对象也必须通过这个构造方法初始化,那应该怎么操作呢?

public static Animal info(int a,int b){
        return new Animal(a,b){
            String name="猫";
            public void show(){
                System.out.println("我是"+name+"今年"+age);
            }
        };
    }

   Animal(a,b)。参数的来源可以是info方法的局部变量,也可以是它本身的参数,也可以是外部类的属性。在匿名类的{}中,你不一定要通过 Animal(a,b)这样传参才能使用外部的参数、属性、局部变量。你可以直接使用,这里只是因为继承的类有有参构造。
  你在匿名类中使用了前面所说的变量,那些变量必须是final的,旧版本你必须显示申明,高版本默认是final。前面所说的外部类的属性例外,我测试的一下,我使用了这样的属性,但是外部类的那个属性不用赋初值,可以证明它不是final。但是在匿名内部类中你不能改变他的值或者指向新的对象。

局部内部类

  局部内部类是声明在方法中的,但和匿名内部类是有差别的。

public class OutClass {
    public OutClass() {
    }
    public  void info(){
         class Inner {
        }
    }
}

  局部内部类相当于这个方法的变量,所以这能用final修饰,同时作为一个类,你可以使用abstract。
  每个类都可以独立去继承一个类,而内部类可以访问外部类所有元素。从某种程度来说,可以通过内部类实现“多继承“。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值