Java面向对象之内部类案例讲解
作者:Z && Y 发布时间:2021-09-16 13:28:19
1. 内部类
很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了
1.1 内部类概述
内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我可以把外边的类称为外部类,在其内部编写的类称为内部类。
内部类分为四种:
成员内部类
静态内部类
局部内部类
匿名内部类
1.2 成员内部类(实例内部类、非静态内部类)
注:成员内部类中不能写静态属性和方法
1.2.1 【定义一个内部类】
//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
private int id;
class Inner {
public void in() {
System.out.println("这是内部类方法");
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
1.2.2【实例化内部类】
实例化内部类,首先需要实例化外部类,通过外部类去调用内部类
// 代码接上
class Test {
public static void main(String[] args) {
//实例化成员内部类分两步
//1、实例化外部类
Outer outObject = new Outer();
//2、通过外部类调用内部类
Outer.Inner inObject = outObject.new Inner();
//测试,调用内部类中的方法
inObject.in();//打印:这是内部类方法
}
}
分析:
想想如果你要使用一个类中方法或者属性,你就必须要先有该类的一个对象,同理,一个类在另一个类的内部,那么想要使用这个内部类,就必须先要有外部类的一个实例对象,然后在通过该对象去使用内部类。
1.2.3 【成员内部类能干什么?】
访问外部类的所有属性(这里的属性包括私有的成员变量,方法)
//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
private String id = "11923020124";
class Inner {
public void in() {
System.out.println("这是内部类方法");
}
//内部类访问外部类私有的成员变量
public void getId() {
System.out.println("id: " + id);
}
public void useOut() {
out();
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
class Test {
public static void main(String[] args) {
//实例化成员内部类分两步
//1、实例化外部类
Outer outObject = new Outer();
//2、通过外部类调用内部类
Outer.Inner inObject = outObject.new Inner();
//测试,调用内部类中的方法
inObject.in();//打印:这是内部类方法
inObject.getId();
inObject.useOut();
}
}
如果内部类中的变量名和外部类的成员变量名一样,要通过创建外部类对象 "."属性来访问外部类属性,通过this.属性访问内部类成员属性
//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
private String id = "Outer Id";
class Inner {
private String id = "Inner Id"; //这个id跟外部类的属性id名称一样。
public void getInnerId() {
System.out.println(id);//输出Inner Id,内部类中的变量会暂时将外部类的成员变量给隐藏
}
public void getOuterId() {
System.out.println(Outer.this.id);//输出Outer Id,内部类中的变量会暂时将外部类的成员变量给隐藏
}
}
public void out() {
System.out.println("这是外部类方法");
}
}
class Test {
public static void main(String[] args) {
//实例化成员内部类分两步
//1、实例化外部类
Outer outObject = new Outer();
//2、通过外部类调用内部类
Outer.Inner inObject = outObject.new Inner();
//测试,调用内部类中的方法
inObject.getInnerId();
inObject.getOuterId();
}
}
说明:
如何调用外部类的成员变量呢?通过Outer.this,因为如果想实例化内部类对象,就必须通过外部类对象,当外部类对象new出内部类对象时,会把自己(外部类对象)的引用传到了内部类中,所以内部类就可以通过Outer.this来访问外部类的属性和方法,到这里,你也就可以知道为什么内部类可以访问外部类 的属性和方法,这里由于有两个相同的属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名 不重复,那么我们在内部类中调用外部类的属性和方法时,前面就隐式的调用了Outer.this。
1.2.4 借助成员内部类,来总结内部类(包括4种内部类)的通用用法:
要想访问内部类中的内容,必须通过外部类对象来实例化内部类。
能够访问外部类所有的属性和方法,原理就是在通过外部类对象实例化内部类对象时,外部类对象把自己的引用传进了内部类,使内部类可以用通过Outer.this去调用外部类的属性和方法,一般都是隐式调用了,但是当内部类中有属性或者方法名和外部类中的属性或方法名相同的时候,就需要通过显式调用Outer.this了。
来源:https://blog.csdn.net/I_r_o_n_M_a_n/article/details/119335854
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~package com.cloudtech.web.util; import java.io.Buf
- 本篇使用java自带的MessageDigest实现对文本的md5加密算法,具体代码如下: /** *@Description
- 本文介绍了SpringCloud +Zookeeper完成配置中心,分享给大家,具有如下:使用场景项目配置更改不需要打包,重启提供配置文件的
- 在很多项目中,为了安全安全考虑,需要对数据包进行加密处理,本文实例所述的即为C#加密代码,在应用开发中有很大的实用价值。说起数据包加密,其实
- SQLite 介绍SQLite,是一款轻型的数据库,用于本地的数据储存。先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了
- 一、概述当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。一般情况下,我们知道View类有个View
- spring-cloud-config 配置中心实现Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中
- 介绍超级管理员:系统管理、用户管理、网点管理、运输点管理、快递员管理、网点申请管理(审核)、报价管理(时效报价)等。普通用户:注册登录、个人
- Android中实现全屏、无标题栏的两种办法,另附Android系统自带样式的解释实现全屏无标题栏:1.在xml文件中进行配置 Androi
- 前言之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是
- 前言什么时候需要重处理?在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁失败,等等,这些错误可能是因为
- 引言:在Object基类中,有一个方法叫clone,产生一个前期对象的克隆,克隆对象是原对象的拷贝,由于引用类型的存在,有深克隆和浅克隆之分
- Android 实现获取手机里面的所有图片详解及实例实现代码:public class MainActivity extends Activ
- 1.问题描述在一个目录及子目录下查找 TXT或Java文件,从中搜索所有“对象”字样的行。在D盘中的所有文件中搜索含有“对象”的行。2.解题
- 主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法,具体内容详情如下所示:在Android Studio中
- SpringMVC @NotNull校验不生效是不是少包了。@NotEmpty也找不到。加了两个依赖问题解决 &l
- 前言你可能看到Java程序员每周的工作是编码开发一个可伸缩的Web应用程序,或创建一个动态的网站,或者开发高效的电子商务产品页面,也可能是开
- 前言短信信息的发送目前已经是项目中必不可少的部分,我们怎么通过web页面来实现把信息推送到别人手机上呢?简单点,编码的方式简单点!看完本篇文
- 本文实例讲述了C#获取程序文件相关信息的方法,分享给大家供大家参考。具体实现方法如下:using System.Reflection;usi
- 本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式。所谓懒加载(lazy)就是延时加载,延迟加载。什么