Java基础——内部类

来源:互联网 发布:mui案例源码下载 编辑:程序博客网 时间:2024/05/17 03:33

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

内部类

意义

  • 意义:
    内部类和接口的结合能够很好的解决多重继承的问题,举例说明:
public class A{}public class B{}public class C{    //分别用两个内部类集成了A和B,然后在C中的方法生成内部类对象,这样等同与类C继承了A和Bpublic:    class innerClass extends A    {...}    class innerClass extends B    {...}    ...}
  • 书本中关于内部类出现的原因有三个:
a.内部类可以访问外部类的所有数据和方法,包括privateb.内部类可以对同一个包中的其它类隐藏起来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
原创粉丝点击