Java疯狂讲义笔记——内部类
【定义】
内部类:定义在其它类内部的类。
外部类:包含内部类的类,也称 宿主类。
局部内部类:定义在方法里的内部类。
【接口内部类】
接口中也可以定义内部类,必须为public static修饰(自动添加),接口内部类只能时静态内部类。
【接口的内部接口】
接口的内部接口为接口成员,必须为public static(自动)。
【与外部类关系】
1,成员内部类是类成员。
成员内部类:静态内部类、非静态内部类
2,局部内部类和匿名内部类不是类成员。
【内部类的作用】
1,内部类提供了更好的封装,其隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2,内部类成员可以直接访问外部类的私有数据,因为内部类被当成为外部类的成员,同一个类的成员间可以相互访问。
但外部类不能访问内部类的实现细节,例如内部类的成员变量。
3,匿名内部类适合用于创建那些仅需要一次使用的类。
【内部类与外部类定义时的区别】
1,内部类比外部类可以多使用三个修饰符:private、protected、static ——外部类不可以使用这三个修饰符。
2,为外部类定义子类,子类创建一个与父类的内部类同名的内部类不是重写,而是重新创建了一个新的属于子类的内部类。因为它们的命名空间不同。
内部类的类名不是简单地由内部类的类名组成,而是还把外部类的类名作为一个命名空间,作为内部类类名的限制。
【内部类和外部类的作用域】
1,外部类:
同一个包内----默认(default)
任何位置------public
2,内部类:
同一个类----private
同一个包----default
同一个包的其他类和外部类的子类------protected
任何位置----public
【非静态内部类】
1,非静态内部类对象里,保存了一个它所寄生的外部类对象的引用,即
当调用非静态内部类的实例方法时,必须有一个非静态内部类实例,非静态内部类实例必须寄生在外部类实例中。
2,外部类实例:OutterClass.this.
内部类实例:this.
3,如果外部类要访问非静态内部类的成员,必须显示创建非静态内部类对象来调用访问其实例成员。
4,非静态内部类不能拥有静态成员。
5,不能在外部类的静态成员中直接使用非静态内部类。
6,非静态内部类的子类不一定是内部类,它可以是一个外部类。
但对于非静态内部类的子类实例一样保留了一个引用,该引用指向其父类所在外部类的对象。
如果有一个内部类的子类存在,则一定存在与之对应的外部类对象。
【静态内部类】
1,静态内部类属于外部类本身,不属于外部类的某个对象。也称 类内部类。
2,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
3,静态内部类的实例方法也不能访问外部类的是实例成员,只能访问外部类的静态成员。
4,外部类不可直接访问静态内部类成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,
使用静态内部类的对象作为调用者来访问静态内部类的实例成员。
【局部内部类】
【匿名内部类】
定义:
new 实现接口() | 父类构造器(实参列表)
{
//匿名内部类的类体部分
}
特点:
1,适用于创建只需要一次使用的类。
2,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
3,匿名内部类必须继承一个父类或实现一个接口,但最多只能继承一个父类,实现一个接口。
4,匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。
5,匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器。
匿名内部类可以定义初始化块,通过实例初始化块来完成构造器完成的事情。
匿名内部类的实现:
1,通过实现接口
匿名内部类不能显式创建构造器,因此匿名内部类只有一个隐式的无参数构造器,故new接口名后的括号里不能传入参数值。
2,通过继承父类
匿名内部类将拥有和父类相似的构造器,此处的相似指拥有相同的形参列表。
【Java8增强的匿名内部类】
1,从Java8以前,匿名内部类、局部内部类访问的局部变量必须用final修饰。
从Java8开始,匿名内部类、局部内部类允许访问非final的局部变量。
2,如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。
3,Java8将这个功能称为"effectively final",它的意思是对于被匿名内部类访问的局部变量,可以用final修饰,也可以不用final修饰,
但必按照有final修饰的方法来用——也就是一次赋值后,以后不能重新赋值。
例子:
class Demo
{
public static void main(String[] args) {
int age = 8;
/*
age = 2; //报错
Demo.java:11: 错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
System.out.println(age);
^
1 个错误
定义age时指定了初值,后又对其赋值,导致Java8无法自动使用final修饰age局部变量,因此编译器会报错。
(被匿名内部类访问的局部变量必须被final修饰)
*/
A a = new A() {
public void test() {
//在Java8以前下面语句将提示错误:age必须使用final修饰
//从Java8开始,匿名内部类、局部内部类允许访问非final的局部变量
System.out.println(age);
}
};
a.test(); //输出:8
}
}
interface A
{
void test();
}
Java疯狂讲义笔记——内部类的更多相关文章
- Java疯狂讲义笔记——枚举类
枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...
- Java疯狂讲义笔记——Lambda表达式
Java8新增的Lambda表达式 [特性]支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. [组成部分]1,形参列表 ...
- java8--类加载机制与反射(java疯狂讲义3复习笔记)
本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...
- 参考《Java疯狂讲义》
参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda ...
- java8--NIO(java疯狂讲义3复习笔记)
NIO采用内存映射文件的方式处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入输出比传统的 ...
- 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制
内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...
- 《Java疯狂讲义》(第3版)学习笔记 1 - 如何学习Java
1.Java是一种面向对象语言,不要简单当做脚本使用.从基础学起,不要从Spring.J2EE.Hibernate和EJB开始学. 2.不要浮躁,应该扎扎实实先学好Java语言,然后按Java本身的学 ...
- java8--网络编程(java疯狂讲义3复习笔记)
重点复习一下网络通信和代理 java的网络通信很简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信. 需要重点看的工具类:I ...
- java8--异常处理(java疯狂讲义3复习笔记)
try,catch,finally,throw,throws java将异常分为两种,Checked异常和Runtime异常. IndexOutOfBoundsException NumberForm ...
随机推荐
- python基本数据预处理语法函数(1)
numpy包: ####数组###########from numpy import * shape #获取维度 size #获取长度 arange(0,5,1) #生成数组函数,从0到5以1为间隔 ...
- 4,fail-fast错误机制
一,fail-fast简介 在JDK的Collection中我们时常会看到类似于这样的话: ArrayList 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出 ...
- codeforces 848B - Rooter's Song(构造+几何)
原题链接:http://codeforces.com/problemset/problem/848/B 题意:好多个人分别从x,y轴不同位置不同时间往垂直坐标轴方向移动,一旦相遇他们转向,问所有人的到 ...
- Solidworks 2019 无法获得下列许可solidworks standard无效的(不一致的)使用许可号码(-8,544,0)
若出现如下述错误,只需将C:\***(C盘中生成注册表的文件夹)\Program Files\SOLIDWORKS Corp\SOLIDWORKS下的netapi32.dll文件复制到所安装路径中SO ...
- php面试专题---16、MySQL创建高性能索引考点
php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...
- save change is not permitted
https://support.microsoft.com/en-my/help/956176/error-message-when-you-try-to-save-a-table-in-sql-se ...
- Docker 里面新建mysql 容器
1.获取MySQL镜像, a.直接从docker hub 下载docker镜像 docker pull +镜像名称 b.从别的项目上把镜像export出来 dockr load i + 镜像的TAR ...
- JAVA中short和short相加自动转化为int
精度小于int的数值运算的时候都回被自动转换为int后进行计算 所以,下面的代码会报编译错误 short s1 = 1;short s2 = 1;s1= (s1+s2); 必须改成: short s1 ...
- 批处理脚本学习笔记1--vmware虚拟机启停控制
起因 因工作需要,在WIN10笔记本上通过vmware workstation装了两台CentOS虚机(CentOS_1.CentOS_2),经常需要进行虚机的启停切换操作,通过vmware的控制台操 ...
- Bootstrap 学习笔记8 下拉菜单滚动监听
代码部分: <nav class="navbar navbar-default"> <a href="#" class="navba ...