Java超全面梳理内部类的使用
作者:orangemilk_ 发布时间:2021-09-06 11:24:07
一、内部类
1.内部类的概念
内部类是定义在类中的类。
内部类把逻辑上相关的类放在一起。而有的内部类不会在其他地方用到,它没有类名,在定义的时候就生成一个该类的实例,称为匿名内部类。匿名内部类是一种特殊的内部类。
当然啦!可以把内部类看作外部类的一个成员,它拥有自己的成员变量和成员方法。通过实例化对象可以访问其成员变量或调用成员方法。
2.内部类的定义
把类的定义放在一个用于封装它的类的内部。
内部类不能与外部类同名。
在封装它的类内部使用内部类与普通类相同,在外部使用要在内部类前加上它所属的外部类的名字。在用new创建内部类时也要在new前加上对象变量。
3.内部类与外部类的访问规则
在外部类中,通过一个内部类对象引用内部类中的成员,同样啦!在内部类中也可以直接引用它的外部类的成员,内部类也可以通过创建对象从外部类之外被调用,但必须在内部声明为public。
原理:
在内部类对象中保存了一个对外部类对象的引用,当在内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义这个变量,调用就会被传递给内部类保存的那个对外部类的引用,通过这个外部类对象的引用去调用这个变量。
//filename:Group.java
public class Group{
private int age;
public class Student{
String name;
public Student(String n,int a){
name=n;
age=a;
}
public void show(){
System.out.print("姓名:"+this.name+"年龄:"+age);
}
}
public void show(){
Student stu=new Student("张三 ",18);
stu.show();
}
public static void main(String[] args){
Group g=new Group();
g.show();
}
}
//姓名:张三 年龄:18
在内部内调用外部类的方法也是同样的原理。
内部内编译完成后,产生的文件名为:外部类名$内部类名.class。
4.内部类的注意事项
内部类定义为抽象类,需要有其它内部类来继承或者实现。
内部类可以声明为protected,private。
内部类不能与包含它的外部类名相同。
内部类既可以使用外部类的成员变量,也可以使用内部类所在方法的局部变量。
内部类不光可以在类中定义,也可以在程序块之中定义。比如在方法中定义内部类,但是只能访问方法中final类型的局部变量。
内部类可以声明为static,静态内部类自动转换为顶层类,即它没有父类,而且不能引用外部类成员或其他内部类中的成员,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员。
二、匿名内部类
是指可以利用内部类创建没有名字的内部类,进一步声明内部类和创建一个该类的对象。
创建匿名类的用意是:补充内部类中没有定义到的方法。
匿名内部类直接使用父类的名字或者实现接口的名字。
匿名类的定义和实例化对象同时进行。
匿名内部类没有名字,所以它的前面不能有访问权限修饰符,也没有构造方法。因为默认构造方法没有参数,所以创建对象时不能带参数。
使用方法:
//filename:A_1.java
public class A_1{
public static void main(String[] args){
(
new Inner(){
void setName(String n){
name=n;
System.out.print("姓名:"+name);
}
}
).setName("张 三");
}
static class Inner{
String name;
}
}
//姓名:张 三
思路:
在上面例子中创建一个匿名内部类对象,但却没有名称,所以叫做“匿名内部类”。
匿名内部类编译完成后,所产生的文件名:外部类类名$编号.class。编号为1,2,3…,代表第几个匿名内部类。
来源:https://blog.csdn.net/zhangxia_/article/details/124194772


猜你喜欢
- 前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数
- 今天聊一个小伙伴在星球上的提问:问题不难,解决方案也有很多,因此我决定撸一篇文章和大家仔细说说这个问题。1. 配置文件位置首先小伙伴们要明白
- //FilterKalman.csnamespace FusionFiltering{public class FilterKalman &
- 给对象中的包装类设置默认值处理方法如下主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况/**
- 在很多场景中我们需要验证时间日期的是否属于正确的格式,验证时间是否符合常规的。1、验证 yyyy-MM-dd HH:mm:dd 格式的日期S
- 讲完了inbound事件和outbound事件的传输流程, 这一小节剖析异常事件的传输流程传播异常事件简单的异常处理的场景@Override
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- 1.<constant name="struts.i18n.encoding" value="UTF-8
- 今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分
- Java集合ArrayDeque类实例分析前言ArrayDeque类是双端队列的实现类,类的继承结构如下面,继承自AbastractColl
- 简介有时候会需要在c#特别是WPF环境下调用其他的程序,这类型的程序以命令行为执行环境,这里就说明下如何调用exe并传递参数一般有两种方法一
- ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、分布
- 前言:在我们使用C# WinForm中,我们有时候是需要或者自己本机的IP地址进行处理,今天我们学习一下如何使用C# Winform获取主机
- 本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下关于下拉导航选择菜单效果在新闻客户端中用
- 本文介绍了JAVA利用HttpClient进行HTTPS接口调用的方法,分享给大家,具体如下:1.为了避免需要证书,所以用一个类继承Defa
- 成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看代码编写的30条建议吧。(1) 类名首字母应该大写。字段
- 当我们对一些需要用到的资料进行整理时,会发现文件的内存占用很大,不过是下载或者存储,都不是很方便,这时候我们会想到把文件变成zip格式,即进
- 本文实例为大家分享了Android多媒体之画画板开发的具体代码,供大家参考,具体内容如下先看看效果:其实画画板的原理很简单,就是首先记录下按
- 随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要
- 为什么要用Jupyter Notebook推荐新手写python用什么编辑器就有有人问:为什么没有Jupyter Notebook。本来想数