---------------------- 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天 个人观看视频总结文档
通过阅读《黑马程序员------类加载器学习注意点》这篇博文,以及对`classLoader.txt`文件的分析,我们可以更深入地掌握类加载器的相关知识,这对于解决实际问题和提升系统性能具有极大的帮助。在实践中不断探索和...
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
黑马程序员-SpringCloud-学习笔记01-认识微服务
QPainter类提供了基本的绘图操作,而绘图设备类如QPixmap、QBitmap、QImage和QPicture等,则提供了存储和操作图像数据的能力。 文件系统操作是应用程序中的基础功能。Qt提供了基本的文件操作接口,支持二进制文件和...
在《黑马程序员 - Java基础教学 - 05 - 面向对象(1)》文档中,详细讲解了面向对象的基本概念及其在Java中的应用。 ### 面向对象与面向过程 面向对象和面向过程都是解决问题的思维模式,但面向对象更注重将功能和...
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
行时所需要的基本条件和许多 Java 基础类,例如,IO 类、GUI 控件类、网络类等。JRE 是提供给 普通用户使用的,如果你只想运行别人开发好的 Java 程序,那么,你的计算机上必须且只需安装 JRE。 JDK(Java ...
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
本教程将聚焦于Java中的多线程技术,以“黑马程序员-java多线程技术01”为学习起点,探讨如何在Java中实现并管理线程。 首先,我们来理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个...
JavaBean操作类的学习是Java程序员必备的技能之一,它涉及属性设置、获取、事件处理等基本概念。以下是对JavaBean及其操作的详细解释: 1. **JavaBean规范**: - **命名规则**:通常,JavaBean的类名应该以"Bean...
在IT行业中,注解(Annotation)是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,为编译器、解释器或者其他的工具提供额外的信息。这些信息可以用于代码的验证、编译时处理、运行时反射等操作。在...
Java基础教学 - 数组、进制转换、二维数组 在Java基础教学中,数组是一个非常重要的概念。数组是多个相同类型的变量组成的集合,每个变量被称为一个元素,数组中的每个元素都有自己的下标或索引。下面将详细讲解...
### 黑马程序员Java基础教学知识点详解 #### 一、变量的作用域与生命周期 变量的作用域定义了变量的可见性和生存周期。在Java中,变量根据其声明位置的不同,具有不同的作用域。例如,在给定的示例代码中: ```...
黑马程序员-Python-Django实现从0开发一个博客系统
标题“黑马程序员------hash改变造成的内存泄露”提示我们,这个问题与哈希值的变化有关,这可能会导致程序无法正确地释放不再使用的内存,从而影响系统性能。下面我们将深入探讨这个话题。 哈希(Hash)通常指的是...
Java基础教学 - 面向对象(4)- 多态 在本文中,我们将讨论Java语言中的一种重要概念 —— 多态(Polymorphism)。多态是面向对象编程(OOP)中的一个核心概念,它允许我们编写更加灵活和可扩展的代码。 一、多态...