【Java学习笔记】内部类

FTViewSE利用VB脚本制作简易日报表 罗克韦尔SE用VB做的简单的报表 阅读详情
-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java学习笔记之内部类

一、简介
       内部类,简而言之就是在“内部”的类。这个内部包括类内部或者方法内部。因此,内部类可以分为局部内部类和成员内部类。局部内部类就是在方法体中,实例内部类就是在类中。本篇博客的内容主要有:
       1、内部类的概念
       2、内部类的实例及特点

二、内部类的概念
       根据简介的介绍,我们可以画出内部类的分类图

       我个人更倾向于这样分类:

三、内部类实例
      3.1局部内部类
//外部类
public class Outer {

	private int PrivateNum;
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.PrivateNum = 111;
		System.out.println("外部类:PrivateNum = "+outer.PrivateNum);
		Object obj = outer.PrintNum();
		System.out.println(obj.toString());
		
	}

	//成员方法
	private Object PrintNum(){
		int MothodNum = 222;
		System.out.println("成员方法:MothodNum = "+MothodNum);
		class Inner{//局部内部类
			private int PrivateNum = 333;
			Inner(){
				System.out.print("内部类:");
				}
			public String toString(){
				return "PrivateNum = "+this.PrivateNum;
			}
		}
		return new Inner();
	}	
	
}
运行后:
       外部类:PrivateNum = 111
       内部类:PrivateNum = 333

*那么,内部类Inner可不可以访问外部类Outer的成员变量PrivateNum或者成员方法PrintNum中的局部变量MothodNum呢?答案是否定的。因为类和成员方法或者局部变量的生命周期不同。Java的垃圾回收机制,方法在调用的时候会实例化,在调用结束后,就会销毁。而类实在实例化之后产生引用,当指向类的引用全部释放之后,类才会销毁。因此,方法中的内部类,只能访问方法中的fin
al成员变量和成员方法。
我们对代码做修改,将局部变量MothodNum修改为final型,然后在内部类中打印输出:
//外部类
public class Outer {

	private int PrivateNum;
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.PrivateNum = 111;
		System.out.println("外部类:PrivateNum = "+outer.PrivateNum);
		Object obj = outer.PrintNum();
		System.out.println(obj.toString());
		
	}
	
	private void OuterMothod(){
		System.out.println("OuterMothod()方法被内部类调用。");
	}

	//成员方法
	private Object PrintNum(){
		final int MothodNum = 222;
		class Inner{//局部内部类
			private int PrivateNum = 333;
			Inner(){
				System.out.print("内部类:");
				}
			public String toString(){
				OuterMothod();//调用外部类的成员方法
				System.out.println("成员方法:MothodNum = "+MothodNum);//打印方法中的局部变量
				return "PrivateNum = "+this.PrivateNum;
			}
		}
		return new Inner();
	}	
	
}
运行结果:
       外部类:PrivateNum = 111
       内部类:OuterMothod()方法被内部类调用。
       成员方法:MothodNum = 222
       PrivateNum = 333


      3.2匿名内部类
       匿名内部类,字面理解就是作为内部类的一种,它的名字是隐藏的,看不到的。看下面的代码片段
v.setOnClickListener(
				new OnClickListener(){
					@Override
						public void onClick(View v) {
							// TODO Auto-generated method stub
						}
				});
这里的new OnClickLiatener就是一个一个匿名类,需要注意的是,匿名类只是类没有名字,不代表new的这个匿名类不存在,实际上,匿名类是要预先定义的。
 public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }
       既然匿名类,它没有名字,那么就没有构造函数,类也无法添加任何修饰符。因为匿名内部类是局部内部类的特殊形式,所以,匿名内部类也只能只能访问方法中的final成员变量和成员方法。
public static void main(String[] args) {
		Outer outer = new Outer();
		Inner inner = outer.GetInnerName();
		System.out.println(inner.getName());
		
	}
	
	
	private Inner GetInnerName(){
		return new Inner(){//匿名内部类
			@Override
			public String getName() {
				return "我是匿名内部类";
			}
			
		};
		
	}
运行结果:
       我是匿名内部类

       3.3实例内部类
private int PrivateNum;
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.PrivateNum = 5;
		System.out.println("Outer:");
		System.out.println("PrivateNum  = "+outer.PrivateNum);
		Outer.Inner inner = outer.new Inner(); 
		//inner = outer.GetInner();
		inner.PrintString();
		
	}
	
	class Inner{//实例内部类
		Inner(){}
		
		private void PrintString(){
			System.out.println("Inner:");
			System.out.println("PrivateNum + 3 = "+(PrivateNum+3));
		}
	}
	
	private Inner GetInner(){
		return new Inner();
	}
运行结果:
       Outer:
       PrivateNum  = 5
       Inner:
       PrivateNum + 3 = 8

实例内部类就如同类的成员方法一样,只不过实例内部类的结构更复杂而已。实例内部类可以访问外部类的成员和方法。这里就不做详述了。下来介绍它的特例,静态内部类:
//外部类
public class Outer {

	private int PrivateNum;
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.PrivateNum = 5;
		System.out.println("Outer:");
		System.out.println("PrivateNum  = "+outer.PrivateNum);
		Outer.Inner inner = new Outer.Inner();//静态内部类可以直接创建对象
		inner.PrintString(outer);
	}
	
	private static class Inner{//静态内部类
		Inner(){ }
		private void PrintString(Outer outer){
			System.out.println("Inner:");
			System.out.println("PrivateNum + 3 = "+(outer.PrivateNum+3));
		}
	}
}
静态内部类不能直接访问外部类的非静态成员变量和方法。静态内部类智能访问外部类的静态成员和静态方法,或者,通过外部类的引用来访问,即例子中的outer.PrivateNum这种方式。
从语法上也可以看出,
       静态内部类:Outer.Inner inner = new Outer.Inner();
       非静态内部类:Outer.Inner inner = outer.new Inner();
在创建非静态内部类之前,都要先在外部类中用new关键字来创建内部类的对象,因此,非静态内部类的对象是依附在外部类对象上的。而静态内部类的创建,是不需要定义绑定在外部类的实例上的。


*关于静态内部类和非静态类的区别
       1、静态内部类可以创建静态成员和静态方法,非静态内部类不可以。
       2、静态内部类不可以直接访问非静态成员变量和方法,非静态内部类可以。

【疑问】
       为什么静态内部类不能直接访问外部类的非静态成员和方法?
       我个人的看法是,静态内部类的初始化不依赖于外部类,所以,静态内部类会先于外部类完成初始化,这样的话,当直接访问外部类的非静态成员,此时外部类的成员变量可能还没有初始化,即编译器还不知道所访问的变量到底是整形数还是数组或者其他类型,所以就会报错。当通过外部类的引用调用外部类的成员方法或者成员变量时,那么外部类肯定已经完成初始化了,这样,静态内部类就可以访问非静态成员了(即便成员为空指针,程序会抛出空指针异常)。
       个人看法,也不知道对不对,希望明白其中道理的朋友能回复评论,谢谢。


金融行业大数据可视化:实时监控与风险预警系统构建 随着金融业务数字化转型,日均产生的交易数据、市场数据、客户行为数据呈指数级增长(单家银行日交易数据量可达TB级)。数据实时性不足(分钟级延迟难以应对高频交易风险)风险特征挖掘浅层(仅基于规则引擎,漏报率高达30%+)可视化分析能力薄弱(静态报表无法支持动态决策)本文聚焦构建具备毫秒级数据响应智能风险建模交互式可视化决策能力的新一代系统,覆盖数据采集、实时处理、多维可视化、智能预警四大核心模块,适用于银行、证券、保险等金融细分领域。章节核心内容技术亮点核心概念可视化系统架构/数据流模型。 阅读详情

相关推荐

Visio中高效绘制空间坐标系的实用技巧

本文详细介绍了在Visio中从零开始高效绘制精准空间坐标系的实用技巧。文章摒弃了现成形状的局限,重点讲解了如何利用直线、箭头和文本框等基础工具,结合网格设置、绘图比例调整和图层管理,构建完全可控的三维坐标系。通过分步指南,帮助用户掌握刻度添加、标注对齐及模板创建等高级方法,从而在科研绘图与工程制图中实现专业级的视觉效果。

e3f4g5的博客 558

Java 内部类学习笔记

内部类是Java中一个强大的特性,能够帮助开发者实现更灵活的类设计和代码组织。通过合理使用内部类,可以解决多重继承问题、提高代码的封装性和可读性。但在实际开发中,应避免滥用内部类,以免增加代码的复杂度和维护成本。

2301_78498098的博客 1507

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

Java学习笔记之---内部类

Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的 可以使用外部类.this.成员的方法,访问外部类中同名的信息 外部类访问内部类信息,需要通过内部类实例,无法直接访问 内部类编译后.clas...

weixin_30840253的博客 87

学习利用ce修改游戏生命参数

易语言代码 游戏的简陋界面 用ce查找存储这个1000即生命值的内存地址(得先附加到目标程序上,点击左上角那个电脑按钮) 看到有很多值为1000的,但哪个是生命值呢?真相只有一个 我们点击一下打我这个按钮,看下面的ce界面上地址为004A65C0处的值变了,所以这个就是我们要找的生命值 接下来我们对生命值进行修改,修改为99

zsd747289639的博客 5万+

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 479

Java学习笔记——内部类(成员类,局部类,匿名类)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!private 为了保证数据的安全性package review.InnerDemo;class Computer{private class Chip{public void function(){System.out.println(“芯片工作”);}}public void show(){Chip c = new Chip();c.function();}}public class demo3 {pub

2401_84152825的博客 1042

基于JavaFX的Http Server模拟器

源码地址 GitHub - DayRain/http-server-simulator: http server 模拟器 功能描述 HttpServer模拟器,通过简单的配置即可模拟第三方服务端,用于接收和响应HTTP请求。 支持同时模拟多个服务、动态添加接口、动态配置返回值。 使用说明 运行 exe运行 编译代码后,点击exe直接运行 代码运行 下载好代码后,运行主类ApplicationStarter即可 新建服务 主界面如下 点击 文件-新建 创建新的服务 ...

小楼夜听雨的博客 2534

《Java面向对象程序设计》学习笔记——静态内部类的访问方法(static/无static)

没有用static修饰内部类,则需要new一个外部类实例,再通过外部实例创建内部类。用static修饰内部类,可以直接通过内部类类名访问静态内部类。

奇妙方程式的博客 938

基于方差分解分析气象/水文干旱驱动因素(含MATLAB全代码)

简介基于方差分解方法分析气象/水文干旱驱动因素

WW、forever的博客 801

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3826

【狂神说java学习笔记】十二:java面向对象(抽象类、接口、内部类)

本文整理了狂神说Java课程的面向对象编程笔记,包括Java面向对象编程中的几个重要概念:抽象类、接口和内部类。抽象类通过abstract关键字定义,可以包含抽象方法和普通方法,但无法实例化,必须由子类继承实现。接口使用interface声明,只包含抽象方法和常量,实现类必须重写所有抽象方法,支持多继承。内部类分为四种:成员内部类可访问外部类私有属性;静态内部类不依赖外部类实例;局部内部类定义在方法内;匿名内部类无需显式定义类名。这些特性为Java提供了更灵活的代码组织和设计模式实现方式。

weixin_41637679的博客 454

Python 爬虫实战:雪球用户数据爬取与投资行为分析(含 API 签名算法解析)

雪球作为国内领先的投资者社区,拥有丰富的用户数据和投资信息。通过爬取雪球用户数据并进行分析,我们可以深入了解用户的持仓偏好、交易行为和投资策略,为企业和投资者提供有价值的市场洞察。

yansideyucsdn的博客 2246

【JAVA学习笔记】匿名内部类与静态内部类

匿名内部类是一种没有名字的内部类,它在定义的同时就被实例化,通常用于简化代码,特别是在需要一次性实现某个类或接口的时候。静态内部类是使用static关键字修饰的内部类,它与外部类的其他成员不同,不依赖于外部类的实例,可以直接通过外部类的类名来访问。// 静态内部类// 非静态内部类// 实例化静态内部类// 输出:This is a static inner class.// 实例化非静态内部类需要先创建外部类实例。

weixin_48272591的博客 1798

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

拉勾教育 Java就业急训营 学习笔记——内部类

拉勾教育 Java就业急训营 学习笔记——内部类

Portia356的博客 332

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java--内部类学习笔记

本文介绍了什么是内部类,Java中的内部类:实例内部类. 静态内部类.局部内部类.匿名内部类的语法和注意事项,以及每个内部类的运用场景,以及简单介绍了匿名内部类更简洁更特殊的语法->lambda表达式

记录并分享学习编程时的知识点... 2912

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java内部类学习笔记

实际开发过程中,经常使用到内部类。每次遇到也没有及时的总结,导致不断的遗忘。为此记录下Java内部类相关知识。 疑问列表: 什么是内部类? 内部类分为几种?每种内部类的形式特点?如何使用? 内部类有什么优点?为什么要使用内部类? 内部类相关的几个问题。 一、内部类定义: 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四...

FDoubleman的博客 317

【Java】内部类【主线学习笔记】

内部类;Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。

CBCY_csdn的博客 693

Java内部类学习笔记   

  本文主要讲述Java内部类学习笔记,更多Java技术知识,请登陆疯狂软件教育官网。加微信号疯狂软件,或者用微信搜索疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵。  一直以来认为内部类只是名字隐藏和组织代码的模式,今天从Java mindview中看到一些内部类的用法,当生成一个内 部类的对象时,此对象与制造它的外围对象之间有了一种联系,所以它能访问其外围对...

weixin_34413357的博客 182

Java-内部类学习笔记

在一个类的内部再定义一个完整的类。

weixin_44467904的博客 203

Java学习笔记——内部类

什么是内部类 一个类里面又完整地嵌套了另一个类结构。 类的五大成员 成员属性、成员方法、构造器、代码块、内部类 内部类的特点 内部类的最大特点就是可以直接访问私有属性 内部类的分类 定义在外部类局部位置上(比如方法内) 局部内部类(有类名) 通常定义在外部类的局部位置,通常在方法/代码块 不能加修饰符 能加final 加了final之后其他类不能继承它 作用域 仅仅在定义它的方法或者代码块中 内部类如何访问外部类:内部类可以直接访问外部类的所有成员,包含私有的 class OuterClas

weixin_46324286的博客 936

java内部类学习笔记

注意:纯属个人笔记。 笔记1:常规内部类(有包名) package cn.hncu.map.inner; public class MyOuter { private int x = 100; // 创建内部类 class MyInner { private String y = "Hello!"; public void innerMethod() { System

java编程 873

JAVA学习笔记——内部类

目录基本概念使用内部类访问对象状态内部类的特殊语法规则局部内部类访问外部变量匿名内部类静态内部类 基本概念 内部类 (inner class) 是定义在另一个类中的类。主要特点有: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。 内部类可以对同一个包中的其他类隐藏起来。 当想要定义一个回调函数且不想编写大量代码时,使用匿名 (anonymous) 内部类比较便捷。 使用内部类访问对象状态 public class TalkingClock { private int interval

weixin_43410001的博客 636

匿名内部类【Java学习笔记】

匿名内部类是一种特殊的局部内部类,所谓匿名就是指程序员不需要这个类声明名字,但是这个类默认有个隐藏的名字。

sheep_apple的博客 632

Java基础内部类学习笔记

Java基础内部类学习笔记一.什么是内部类?二.内部类的分类1.局部内部类2.匿名内部类(很重要)3.成员内部类4.静态内部类 一.什么是内部类? 一个类的内部嵌套了另一个类,这个类叫内部类,是类的第五大成员(属性,方法,构造器,代码块,内部类)。 内部类最大的特点就是可以直接访问私有属性,它本质上还是一个类。 基本语法: public class Localinner { //外部其他类 public static void main(String[] args) { } } clas

cc1373709409的博客 711

我的Java学习笔记(七)——匿名内部类、抽象类和接口

我的Java学习笔记(七) 匿名内部类 创建格式: new 父类构造器(参数列表)|实现接口(){ //匿名内部类的类体实现 } 注意事项: 使用匿名内部类时,必须继承一个类或实现一个接口; 匿名内部类由于没有名字,因此不能定义构造函数; 匿名内部类中不能含有静态成员变量和静态方法 ; 抽象类和接口 区别: 一个子类只能继承一个抽象类,但能实现多个接口; 抽象类可以有构造方法,接口没有构造方...

DTBIGhead的博客 469
上一篇: 【Java学习笔记】继承和多态
VisionDo
博客等级 码龄11年 8粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值