Java的内部类

2023-11-03

//学习笔记

内部类

内部类访问特点:
1,内部类可以直接访问外部类中的成员。
2,外部类要访问内部类,必须建立内部类的对象。

一般用于类的设计。

分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就是“还有的事物”定义成内部类来描述。

    class Outer
    {
    	private static int num = 31;
    
    	class Inner// 内部类。
    	{
    		void show()
    		{
    			System.out.println("show run..."+num);
    		}
    		/*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的。
    		{
    			System.out.println("function run ...."+num);
    		}
    		*/
    	}
    
    	public void method()
    	{
    		Inner in = new Inner(); //外部类要访问内部类,必须建立内部类的对象
    		in.show();
    	}
    }
    
    
    class InnerClassDemo
    {
    	public static void main(String[] args) 
    	{
    //		Outer out = new Outer();
    //		out.method();
    	
    		//直接访问外部类中的内部类中的成员。
    //		Outer.Inner in = new Outer().new Inner();   //注意格式
    //		in.show();
    
    		//如果内部类是静态的。 相当于一个外部类
    //		Outer.Inner in = new Outer.Inner();  //格式不同
    //		in.show();
    
    		//如果内部类是静态的,成员也是静态的。
    //		Outer.Inner.function();  //不需要对象了
    		
    	}
    }

为什么内部类能直接访问外部类中成员呢?
那是因为内部类持有了外部类的引用: 外部类名.this

    class Outer
    {
    	int num = 3;
    	class Inner
    	{
    		int num = 4;
    		void show()
    		{
    			int num = 5;
    			System.out.println(Outer.this.num);  //输出3
    			System.out.println(this.num);        //输出4
    		}
    	}
    	void method()
    	{
    		new Inner().show();
    	}
    }
    
    
    class InnerClassDemo2 
    {
    	public static void main(String[] args) 
    	{
    		new Outer().method();
    	}
    }

内部类可以存放在局部位置上。
内部类在局部位置上,只能访问局部中被final修饰的局部变量。

    class Outer
    {
    	int num = 3;
    	Object method()
    	{
    
    		final int x = 9;
    
    		class Inner
    		{
    			void show()
    			{
    				System.out.println("show..."+x);
    			}
    		}
    
    		Object in = new Inner();
    		return in;//0x0045
    //		in.show();
    	}
    
    
    	
    }
    
    class InnerClassDemo3 
    {
    	public static void main(String[] args) 
    	{
    		Outer out = new Outer();
    		Object obj = out.method();//0x0045
    		System.out.println(obj);
    
    	}
    }

匿名内部类

匿名内部类。就是内部类的简写格式。

必须有前提:
内部类必须继承或者实现一个外部类或者接口。

匿名内部类:其实就是一个匿名子类对象

格式:new 父类or接口(){子类内容}

    abstract class Demo
    {
    	abstract void show();
    }
    
    class Outer
    {
    	int num = 4;
    	
    	public void method()
    	{
    		
    		new Demo()//匿名内部类,其实这是Demo的子类
    		{
    			void show()  //覆盖了父类中的抽象方法
    			{
    				System.out.println("show ........"+num);
    			}
    		}.show();   //就是一种简写格式
    	}
    }
    
    
    class InnerClassDemo4 
    {
    	public static void main(String[] args) 
    	{
    		new Outer().method();  //输出4
    	}
    }

通常的使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个。
可以用匿名内部类作为实际参数进行传递。

    interface Inter
    {
    	void show1();
    	void show2();
    }
    class Outer
    {
    	
    	class Inner implements Inter
    	{
    		public void show1()
    		{
    		}
    		public void show2()
    		{
    		
    		}
    	}
    	
    
    	public void method()
    	{
 

			Inter in = new Inter()
			{
				public void show1()
				{
					
				}
				public void show2()
				{
				
				}
				
			};
		in.show1();
		in.show2();
	}
    }
    class InnerClassDemo5 
    {

	class Inner
	{
	}
		public static void main(String[] args) 
		{
		
			
			show(new Inter()
			{
				public void show1(){}
				public void show2(){}
			};
		}
	}

细节:

        class Outer
    {
    	void method()
    	{
    		Object obj = new Object()
    		{
    			public void show()
    			{
    				System.out.println("show run");
    			}
    
    		};
    		obj.show();//因为匿名内部类这个子类对象被向上转型为了Object类型。
    					//这样就不能在使用子类特有的方法了。
    
    
    	}
    }
    
    class InnerClassDemo6 
    {
    	public static void main(String[] args) 
    	{
    		new Outer().method();
    	}
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的内部类 的相关文章

随机推荐

  • uni-app使用uView

    uni app使用uView 三配置前提 先安装uview 1 使用HBuilder创建uni app项目 这步过后就可以使用npm安装第三方组件了 cmd进入当前根目录执行 npm init y 执行后项目中会生成package json
  • 游戏开发unity插件Magica Cloth:学习贴汇总(持续更新)

    插件说明 高效的布料系统 支持jobs 开源 官方下载地址 https assetstore unity com packages tools physics magica cloth 160144 unity插件初步配置 BoneSpri
  • linux下载出现:Failed to connect to raw.githubusercontent.com port 443: Connection refused

    linux下载出现 Failed to connect to raw githubusercontent com port 443 Connection refused 原因 github域名被污染 解决方式 打开网站 https www
  • 【patchwork++】——PCA主成分分析法

    降维算法 gt 保留最大有用值信息 gt 换坐标轴 找坐标系 首先 去中心化 把坐标原点放在数据中心 然后 找坐标系 找到方差最大方向 数据线性变换 拉伸 旋转 注意 离群点对PCA影响较大 参考视频 用最直观的方式告诉你 什么是主成分分析
  • 一串首尾相连的珠子(m个),有n种颜色(n<=10) 设计一种算法去除其中一段,要求包含所有的N种颜色

    继续上代码 include
  • Hadoop3.2.1版本的环境搭建

    最近有人提出能不能发一些大数据相关的知识 No problem 今天先从安装环境说起 搭建起自己的学习环境 Hadoop的三种搭建方式以及使用环境 单机版适合开发调试 伪分布式适合模拟集群学习 完全分布式适用生产环境 这篇文件介绍如何搭建完
  • java xrunjdwp_Java远程断点调式 -Xdebug

    前言 我们在开发的过程中 难免会遇到调用别人机器上的代码 或者测试服务器上的代码 再调用过程中 难免会用到断点调式的功能 但是运行的不是本地的代码怎么办呢 现在我们就来了解下Java远程断点调用 需要 本地必须有源码 才能进行远程断点 一
  • Instant-ngp Windows11安装、使用记录

    Instant NeRF Study Debug 本机配置 Y9000P RTX3060 Win11 Instant NeRF Study Debug 1 Git 2 Cmake 3 instant ngp 示例数据 自定义数据 注意事项
  • 一次composer错误使用引发的思考

    一次composer错误使用引发的思考 2019 03 05 12 19 by 轩脉刃 阅读 评论 收藏 编辑 一次composer错误使用引发的思考 这个思考源自于一个事故 让我对版本依赖重新思考了一下 事故现象 一个线上的管理后台 一个
  • LeetCode题解——42.连续子数组的最大和(动态规划思想)

    题目地址 剑指 Offer 42 连续子数组的最大和 力扣 LeetCode 一 解题思路 在这道题中 数组连续是一个很重要的信息 我们可以创建一个数组用于记录每一位对应的最大值 所谓每一位的最大值 意思就是以这一位为结尾的数组的最大值 那
  • 面试过程中会遇到的机器学习教科书中 7 大经典问题

    如果希望了解机器学习 或者已经决定投身机器学习 你会第一时间找到各种教材进行充电 同时在心中默认 书里讲的是牛人大神的毕生智慧 是正确无误的行动指南 认真学习就能获得快速提升 但实际情况是 你很可能已经在走弯路 科技发展很快 数据在指数级增
  • SQL Server 基础语法2(超详细!)

    文章目录 选择数据库school 查询所有学生的学号 姓名和年龄 查询结果列项是中文名 查询 计算机 系的所有学生的基本信息 查询所有女同学的姓名及所在的系 显示结果不允许重复出现 查询课程号不为 1 4 或 7 的课程的信息 查询课程号不
  • 处理Matlab Coder之后, Compiler can't find "tmwtypes.h"问题

    作为一个强大的科学计算软件 matlab广泛应用于较多领域 以其简单的编程风格 便利的调试环境等众多优点 在编写算法与测试的时候通常用到 然而很多的实际运用上matlab毕竟还不是很普及 相反还是c与c 更多 同时正版matlab这样一个昂
  • Hive表的分区与分桶

    1 Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容 会消耗很多时间做没必要的工作 Hive可以在创建表的时候指定分区空间 这样在做查询的时候就可以很好的提高查询的效率 创建分区表的语法 create tabl
  • 论文阅读记录: Automatic Image Colorization sig16

    sig论文阅读记录 Let there be Color Joint End to end Learning of Global and Local Image Priorsfor Automatic Image Colorization
  • JSP、servlet运行原理

    一 jsp和servlet的区别 servlet是用Java编写的服务器端程序 其主要功能在于交互式地浏览和修改数据 生成动态Web内容 狭义的Servlet是指Java语言实现的一个接口 广义的Servlet是指任何实现了这个Servle
  • es-5数据同步

    向ES里面添加数据 logstash kabina javaapi restful api 重点介绍一下logstash 是一个数据同步工具 可以动态地将来自不同数据源的数据统一起来 并将数据标准化到其他任何数据源 其实最常见的使用场景是将
  • 思考::战略藐视:RTOS 高级多任务调度器 (***)

    战略藐视 RTOS 高级任务调度器 压力大 将 RTOS 视为操作系统 则似乎有很大的学习心里压力 复杂 耗时 有难度 减压 将它们视为是 某种 高级多任务调度器 来学习 就好了 这样似乎就简单了 心里压力也就小了 或者 将它们视为是 某种
  • 基于Python生成Markdown的标题序号

    import sys import os import time import re headline title sign list 用于判断标题产生环境 titles added number 保存嵌入了编号的标题 用于产生新编号 is
  • Java的内部类

    学习笔记 内部类 内部类访问特点 1 内部类可以直接访问外部类中的成员 2 外部类要访问内部类 必须建立内部类的对象 一般用于类的设计 分析事物时 发现该事物描述中还有事物 而且这个事物还在访问被描述事物的内容 这时就是 还有的事物 定义成