Java基础——内部类

内容整理自《Java核心技术 卷一》

内部类

意义
  • 意义:
    内部类和接口的结合能够很好的解决多重继承的问题,举例说明:
public class A{}
public class B{}
public class C{
    //分别用两个内部类集成了A和B,然后在C中的方法生成内部类对象,这样等同与类C继承了A和B
public:
    class innerClass extends A
    {...}
    class innerClass extends B
    {...}
    ...
}
  • 书本中关于内部类出现的原因有三个:
a.内部类可以访问外部类的所有数据和方法,包括private
b.内部类可以对同一个包中的其它类隐藏起来
c.当想要定义一个回掉函数,但是又不想编写大量代码的时候,使用匿名内部类比较比较便捷
基本知识
  • 定义:所谓的内部类即是在一个类的内部声明和定义一个类
  • 主要特点:内部类既可以访问自身的数据域,也可以访问创建它的外部类对象的数据域,包括private属性的
  • 在Java中,只有内部类能够声明为priavte
  • 内部类的构造函数,不管内部类是否定义了构造函数,它的构造函数中都包含了一个参数:this,this是该内部类的外部类的引用
...
//内部类构造函数
public innerClass(outerClass var)
{
    outer = var;//内部类通过outer引用来访问外部类的数据和方法
}
...

成员内部类

  • 定义:所谓的成员内部类,就是将内部类看作是外部类的一个成员,类成员拥有的所有特点它都具备。如果将一个内部类看作是外部类的一个“成员函数”,就能够理解为什么内部类能够访问外部类的所有数据域和方法。
  • 使用方法:
public class outerClass
{
    ...
    public class innerClass{
        String data1;
        public void innerClassFunction(){}
    }
    ...

    public void function()
    {
        //第一种使用方式:在外部类方法中声明内部类对象
        innerClass a = new innerClass();
        a.innerClassFunction();
    }
}

public class Demo
{
    public static void main(String name)
    {
        //第二种使用方法:先实例化外部类对象,通过外部类对象创建内部类对象
        outerClass outerclass = new outerClass();
        outerClass.innerClass interclass = outclass.new innerClass();
    }
}

局部内部类

  • 定义:局部类就是在一个方法中声明和定义的内部类
  • 使用情况:有时候内部类只在一个方法(或者一个块中)中被使用的时候
  • 使用方法:
...
public void function()
{
    class innerClass
    {
        public void function(){}
        ...
    }
    innerClass interclass = new innerClass();
    innerclass.function();
}
...
  • 特点:
    1. 局部类不能用public或者是private进行声明,因为局部类的作用域被限定在声明局部类的方法或者块当中
    2. “局部类的优点是它可以对外部世界完全隐藏起来”(现在还不能体会隐藏起来有什么鬼用
    3. 局部类访问局部变量的时候,必须将局部变量声明为final,编译器会将该final变量传递给局部类的构造函数,局部类会讲该变量保存(以val$varName的方式,注意,该名字是编译器自动生成的)
  • 优点:减少了代码量

匿名内部类

  • 定义:匿名内部类,就是没有名字的内部类
  • 使用情况:该类对象只被使用一次,通常通过该类实现的接口来创建该对象
  • 使用方法:
public class Demo
{
    public static void main(String[] args)
    {
        ArrayList<Person> list = new ArrayList<Person>();
        // 添加对象到ArrayList中
        list.add(new Person("ccc", 20));
        list.add(new Person("AAA", 30));
        list.add(new Person("bbb", 10));

        Collections.sort(list, new Comparator<Person>()
        {
            public int compare(Person a,Person b)
            {
                ...
            }
        });//通过匿名内部类定义了一个比较器    
    }
}
  • 相关问题:
    1.问:上述代码new Comparator<Person>是否是实例化了一个接口,而java是不能实例化接口的,是否错误?
    答:没有错误,因为此处实例化的是一个匿名的类,并且这个类实现了这个接口
    2.问:若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数
    答:不用,每一个类必须实现接口声明的所有方法,但是所有类默认实现equals()方法

静态内部类

  • 定义:在成员内部类之前加上static关键字,就是静态内部类
  • 使用情况:有时候,内部类的作用仅仅是需要对同一个包下的其它类进行隐藏,并不需要使用外部类,所有此时可以将类声明为static,从而取消产生的外部引用outer
  • 使用方式:
public class OuterClass
{
    public static class innerClass
    {
    }
}
  • 特点:隐藏效果好
  • 注意:只有内部类才能声明为static
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值