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();}...
- 特点:
- 局部类不能用public或者是private进行声明,因为局部类的作用域被限定在声明局部类的方法或者块当中
- “局部类的优点是它可以对外部世界完全隐藏起来”(现在还不能体会隐藏起来有什么鬼用)
- 局部类访问局部变量的时候,必须将局部变量声明为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
- JAVA基础——内部类、匿名内部类
- java基础——内部类
- JAVA基础——匿名内部类
- Java基础——内部类
- java基础——内部类
- java基础篇——内部类
- java基础——内部类
- Java基础——内部类
- Java基础——内部类
- java基础总结——内部类
- java基础——内部类
- Java基础——内部类
- Java基础——内部类
- Java基础——内部类
- java—内部类
- Java—内部类
- JAVA基础——JAVA类,内部类,匿名内部类。
- java基础 内部类
- 【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
- Spring源码学习第一节
- Problem C: 数量的类模板
- [C++]条件编译——#if #ifdef 的作用
- 做项目遇到的种种问题
- Java基础——内部类
- ECSHOP数据库清空 小京东数据库清空
- 【转】ionic的bar-header移除底部边框
- Spring对Controller、Service、Dao进行Junit单元测试总结
- UVa202
- Problem D: 线性表的基本操作
- Spring AOP实现方式
- 新手写LinuxI2C驱动程序
- Android中图片加载框架Picasso的使用