---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------
内部类是指在一个外部类的内部再定义一个类,内部类是作为外部类的成员而存在的,其依附于外部类。
为什么需要内部类呢?每个内部类可以独立的继承继承一个接口的实现,当然也可以实现不同的接口,所以无论外部类是否已经继承该接口的实现,对于内部类没有影响。所以相当于一个类继承了某接口的实现,在其内部又有个内部类继承了另外一个接口的实现,这算多继承的一种实现吧。
为什么可以把它看做多继承实现呢?因为内部类一般定义出来只是给外部那个类使用的,基本上没有谁会定义一个内部类还想把他给外部类之外的类使用,要使用的话也会非常麻烦的。
内部类分为成员内部类,局部内部类,静态内部类和匿名内部类
成员内部类:顾名思义就是外部类的一个成员,可以有不同的访问修饰符,在使用局部内部类的时候,需要有一个外部类的对象供其依附:
public class Test { private String str = "22222"; public static void main(String[] args) { new Test().f(); } public void f() { new Inner().f();//默认this.new Inner().f(); } private class Inner { public void f() { System.out.println("ssss" + str); } } }
成员内部类中不可以定义静态成员,这大概是因为成员内部类要实例化必须先有外部类对象,如果要实例化多个内部类对象,还公用一个静态成员,那么将静态成员分给外部类的普通成员更合理吧。
2、局部内部类
在方法中定义的内部类,与局部变量类似,局部内部类不能有访问修饰符,但它可以访问当前代码块的常量(用final修饰的局部变量),和外围类的所有成员
public class Test { private String str = "22222"; public static void main(String[] args) { new Test().g(1); } public void g(final int i){ class Inner_1{ public void f(){ System.out.println(str + i); } } new Inner_1().f(); } }
3、静态内部类,和静态成员一样理解,普通的内部类对象隐含地保存了一个引用只想创建它的外部类对象,而静态内部类就不需要有外部类对象存在,直接用外部类名就可以创建了,在静态内部类中不能访问外部类的非静态成员。
4、匿名内部类,这种类多用在事件处理上
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
(粘自网络)
如果匿名类的几类有带参数的构造函数,是可以写new ClassA(参数){}因为参数不在匿名类内部直接被使用
java中的枚举用的就是内部类来实现:
package exercise; public class TestTraffic { public static void main(String[] args) { TrafficLamp lamp = TrafficLamp.GREEN; System.out.println(lamp + ":" +lamp.getTime()); System.out.println(lamp.nextLamp() + ":" + lamp.nextLamp().getTime()); } public enum TrafficLamp { GREEN(45) { public TrafficLamp nextLamp() { return YELLOW; } },//相当于匿名类,并实现了抽象方法 RED(30) { public TrafficLamp nextLamp() { return GREEN; } }, YELLOW(5) { public TrafficLamp nextLamp() { return GREEN; } };//定义3个枚举变量,相当于通过TrafficLamp来实例三个交通灯颜色,这段代码必须放到最前边 private final int time; //定义TrafficLamp的构造方法 private TrafficLamp(int time) { this.time = time; } //定义一个抽象方法,每次实例该枚举的时候,都必须实现该方法 public abstract TrafficLamp nextLamp(); public int getTime() { return time; } } }
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
相关推荐
黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档
黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档
黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
黑马程序员-SpringCloud-学习笔记01-认识微服务
黑马QT讲义,适合QT入门,使用,教程很比较基础,新手可以看看,另外视频链接在哔哩哔哩中。
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901
行时所需要的基本条件和许多 Java 基础类,例如,IO 类、GUI 控件类、网络类等。JRE 是提供给 普通用户使用的,如果你只想运行别人开发好的 Java 程序,那么,你的计算机上必须且只需安装 JRE。 JDK(Java ...
黑马程序员-梅兰商城项目实战,包含图片素材和编写源码。
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490903
C++黑马程序员-演讲比赛流程管理系统记录
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983