Java 内部类(成员内部类)

【Java】内部类和成员内部类的特点 1.内部类 概念:在一个类的内部再定义一个完整的类。 语法: class Outer { class Inner { } } 编译:Outer$Inner.class 和 Outer.class 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类的私有成员,而不破坏封装 可为外部类提供必要的内部功能组件 1.1 成员内部类 概念:在类的内部定义,与实例变量、实... 阅读详情

内部类:将一个类的定义放在另一个类的内部,这个类就是内部类。

内部类是一种非常有用的特性,他允许你将一些逻辑相关的类组合在一起,并控制位于内部的类的可视性。他了解外部类,并且与之通信。

内部类的分类:

成员内部类

静态内部类

局部内部类

匿名内部类

创建一个内部类

public class OuterClass {

	class InnerClass1 {
		private int i = 11;

		public int value() {
			return i;
		}
	}

	class InnerClass2 {
		private String str;

		public InnerClass2(String str) {
			this.str = str;
		}

		public String readStr() {
			return str;
		}
	}

	public void ship(String str) {
		InnerClass1 class1 = new InnerClass1();
		InnerClass2 class2 = new InnerClass2(str);
		System.out.println(class2.readStr());
	}

	public static void main(String[] args) {
		OuterClass outerClass = new OuterClass();
		outerClass.ship("test");
	}

}

在简单的内部类实现上,与其他类并没有什么区别。只是InnerClass1和InnerClass2类的名字嵌套在OuterClass类中。

上述情况的另一种实现方式,外部类中方法的返回值是内部类的一个引用。

	public InnerClass1 getInnerClass1(){
		return new InnerClass1();
	}
	
	public InnerClass2 getInnerClass2(String str){
		return new InnerClass2(str);
	}

	public void ship(String str) {
		InnerClass1 class1 = getInnerClass1();    
      //实例化的时候直接调用方法
		InnerClass2 class2 = getInnerClass2(str);
		System.out.println(class2.readStr());
	}

   public static void main(String[] args) {
		OuterClass outerClass = new OuterClass();
		outerClass.ship("test1");
		OuterClass.InnerClass1 inner1 = outerClass.getInnerClass1();
		OuterClass.InnerClass2 inner2 = outerClass.getInnerClass2("test");
	}

上边main函数中所展示的代码向我们展示了,如果想在外部类的非静态方法之外的任意位置创建某个内部类的对象,必须具体指明这个对象的类型:外部对象名.内部对象名    该类型就是内部类的类型。

链接到外部类

当生成一个内部类的对象的时候,该对象就与他的外围对象产生了一种联系,它能访问外围对象的所有成员,而不需要任何外部条件,此外,内部类还拥有外围类的所有元素的访问权。

public interface Selector {
   boolean end();
   Object current();
   void next();
}

public class Sequence {
	private Object[] items;
	private int next = 0;
	
	public Sequence(int size) {
		items = new Object[size];
	}
	
	public void add(Object x){
		if(next < items.length){
			items[next++] = x;
		}
	}
	
	private class SequenceSelector implements Selector{
        private int i = 0;
		
		@Override
		public boolean end() {
			return i == items.length;
		}

		@Override
		public Object current() {
			return items[i];
		}

		@Override
		public void next() {
			if(i < items.length){
				i ++;
			}
		}
		
	}
	
	public Selector getSelector(){
		return new SequenceSelector();
	}
	
	public static void main(String[] args) {
	    Sequence sequence = new Sequence(10);
	    for (int i = 0; i < 10; i++) {
			sequence.add(Integer.toString(i));
		}
	    
	    Selector selector = sequence.getSelector();
	    
	    while(!selector.end()){
	    	System.out.println(selector.current());
	    	selector.next();
	    }
	}
}

上述代码是一个往数组添加元素,并打印出来的例子,Selector接口的实现类SequenceSelector中的三个方法表示打印的过程

SequenceSelector是Sequence的一个private 的内部类,在SequenceSelector中的三个方法都引用了Sequence的private 成员items.表示内部类对于外部类的所有成员都具有访问权。

使用.this和.new

如果你想在内部类中生成外部类对象的引用,可以使用外部类的名称后面紧跟.this,这样产生的引用自动的具有正确的类型

public class DotThis {
	public void f(){
		System.out.println("DotThis.f()");
	}
    
	public class InnerClass{
		public DotThis outClass(){
			return DotThis.this;
		}
	}
	
	public innerClass getInnerClass(){
		return new innerClass();
	}
	
	public static void main(String[] args) {
		DotThis dotThis = new DotThis();
		DotThis.InnerClassclass1 = dotThis.getInnerClass();
		class1.outClass().f();
	}
}

在InnerClass类中的outClass()返回值是外部类对象,可以进行调用f();所以当内部类要调用外部类的对象的时候,使用外部类名.this

有时候想要告知某些其他对象去创建内部类的对象时,必须在new 表达式中提供其他外部类对象的引用

public class DotNew {
	public class InnerClass{}
    public static void main(String[] args) {
		DotNew dotNew = new DotNew();
		DotNew.InnerClass innerClass = dotNew.new InnerClass();//表示是该外部类对象中建立的内部类对象
	}
}

想要直接创建内部类对象,必须使用外部类对象去创建该内部类的对象。在拥有外部类对象之前是不可能拥有内部类对象的。除非是静态内部类。

内部类与向上转型

将内部类向上转型成为其基类:与从实现了某个接口的对象,得到对此接口的引用,实质上是一致的。就是可以在使用的时候通过其基类进行访问,而看不到具体的实现,只是提供统一的接口。


public interface Contents {
     int value();
}

public interface Destination {
    String readLabel();
}

public class Parcel {
    //此内部类是一个实现了Contents接口的private修饰的类,表明此类有相应的可调用的类,但是只能被 
    //Parcel类访问,其他类不可访问ContentsImp 类
    private class ContentsImp implements Contents{
        private int i ;
		@Override
		public int value() {
			return i;
		}
    }
    //DestinationImpl类是实现了Destination接口的类,并且被protected修饰符修饰,只有Parcel类
    //及其子类还有同包下的类可对他进行访问。
    protected class DestinationImpl implements Destination{
        private String label;
        
        public DestinationImpl(String label) {
        	this.label = label;
		}
		@Override
		public String readLabel() {
			return label;
		}
    	
    }
    
    public Contents getContents() {
           return  new ContentsImp();
	}
    
    public DestinationImpl getDestination(String label) {
		return new DestinationImpl(label);
	}
   
}
//Test类与Parcel 在同一个包下
public class Test {
	 public static void main(String[] args) {
			Parcel parcel = new Parcel();
//			Parcel.ContentsImp contentsImp = parcel.new ContentsImp();   报错 因为正在
//Test类中对ContentsImp进行访问
		    Parcel.DestinationImpl destinationImpl =parcel.new DestinationImpl("test");
//可以访问 因为当前类和他在同一个包下。
//			System.out.println(contents.value());
			System.out.println(destinationImpl.readLabel());
		}
}
//Test1类与Parcel  不在一个包下
public class Test1 {
      public static void main(String[] args) {
		Parcel parcel = new Parcel();
//		Parcel.DestinationImpl destinationImpl =parcel.new DestinationImpl("test");  
//报错 因为现在	Test1类与Parcel  不在一个包下   不能访问内部类 DestinationImpl 	
		
		Contents contents = parcel.getContents();
		Destination destination = parcel.getDestination("test");
//正确的访问方式,这种情况即是向上转型,当取得了基类或者接口的引用时,可能无法找到他的正确类型
//不可直接去访问具体实现类,具体实现的细节也被隐藏起来了。
		System.out.println(contents.value());
		System.out.println(destination.readLabel());
	}
}

在一个类与外部类同级并且继承自内部类,那么在该类的构造方法中应该传入的是外部类的对象,并且在其中调用外部类对象.super(内部类构造方法所需参数)

class NewClass extends Parcel.DestinationImpl{

	public NewClass(Parcel parcel, String label) {
		parcel.super(label);
	}
	
}

最后对于成员内部类做一个总结:

成员内部类不能存在static 关键字,即,不能声明静态方法,静态属性,静态代码块等。【非静态内部类也可以定义静态成员但需要同时有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。】
创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数),可以理解为饮食的保存了一个引用,指向创建他的外部类对象。
在内部类中访问外部类的成员或方法的时候:外部类名.this.成员名/方法
内部类在编译之后生成一个单独的class文件,里面包含该类的定义。所以内部类中定义的方法或者成员名称可以跟父类的相同。生成的class文件名称是外部类名$内部类名.class
外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
与外部类平级的类继承内部类时,其构造方法需要传入父类的实例对象,且在构造方法的第一句调用“外部类实例.super(内部类参数)”
django3-newspaper:报纸应用 立即下载

相关推荐

抖音视频数据抓取

最近经常有人问我抓取抖音视频的数据,问我一些很小白的问题,算法给他也不会用。 还是先抓包,获取需要的接口和参数,相关的算法在其它文章里面有描述。 搜索个视频看看 查看抓的包信息: 可以看到,这里是post请求...

2501_91048859的博客 3098

Java实验五

package Ex5.Firstquestion; import java.io.*; /** * @author 15328 * 1、编写一个Java应用程序,将已存在的扩展名为.txt的文本文件加密后存入另一个文本文件中。 * 按模板要求,将【代码1】~【代码7】替换为Java程序代码。 */ public class SecretExample { public static void main(String a[]) { File fileone=ne.

ALAN_CF的博客 2180

数字图像处理第九章笔记

目录一、腐蚀与膨胀1、腐蚀2、膨胀3、对偶性4、开操作与闭操作二、一些基本的形态学算法1、边界提取2、孔洞填充3、连通分量提取4、凸壳5、细化6、粗化7、骨架8、形态学重建三、灰度级形态学1、腐蚀和膨胀2、开运算和闭运算3、灰度级形态学算法 一、腐蚀与膨胀 1、腐蚀 腐蚀可以去除图像的某些部分。 2、膨胀 膨胀可以连接裂缝。 3、对偶性 膨胀和腐蚀彼此关于集合求补运算和反射运算是对偶的 4、开操作与闭操作 开操作:B对A先腐蚀,再进行膨胀 可以平滑物体轮廓,断开较窄的狭颈并消除较细的突出物。 闭操作

方悔读书迟 1375

JAVA基础之内部类、匿名类、异常类

1.内部类 Java支持在一个类中定义另一个类,这样的类称为内部类,包含内部类的叫外嵌类。 内部类可以使用外嵌类的成员变量和外嵌类的方法,内部类的类名中不可以声明类变量和类方法(用空括号()表示),内部类仅供外嵌类使用,其它类不可以用其它类的内部类去声明对象 public class ZZZ{ String H = "1232"; AAA aaa;//内部类声明对象 class AAA { //内部类声明 void speck(){ System.out.printl

ioccc785的博客 783

EV1527、PT2262傻傻分不清?一文讲透常见315/433MHz遥控编码协议区别与选型

本文深度对比了EV1527、PT2262和SC5262三种常见的315/433MHz遥控编码协议,详细解析了它们的技术特点、成本效益和适用场景。EV1527作为低成本方案的首选,特别适合智能家居和简易安防设备;PT2262在稳定性和兼容性上表现优异;而SC5262则在安全性方面具有显著优势。文章还提供了实用的选型框架和工程建议,帮助开发者在不同应用场景中做出最优决策。

weixin_33640562的博客 349

1000Base-T1协议解读(基于802.3bq-2016 和Test Suite)

1000Base-T1是由一对双绞线实现全双工传输的以太网标准,采用PAM3编码方式(-1,0,1),编码后的实际传输符号速率为750Mbps。该标准的车载最大传输距离可达15米,主要应用于汽车产品开发过程。测试过程示波器要求带宽≥2G,采样率≥7.5Gbps,网分带宽≥1G。

qflook的博客 5334

Java面向对象程序设计——第六章内部类、匿名类和Lambda表达式、异常类。

一:内部类 类可以有两种重要的成员,成员变量和方法,实际上java还有另一种类:内部类; 1.内部类和外嵌类之间的关系 ——1内部类的外嵌类的成员变量在内部类中仍然有效, 内部类的方法也可以调用外嵌类的方法 ——2内部类中的类体不可以声明类变量和类方法, 外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员 ——3内部类仅供他的外嵌类使用,其他类不可以用某个类的内部类声明对象 *内部类的外嵌类的成员变量在内部类中有效,使得内部类和外嵌类的交互更加方便 例子: 某类型的农场饲养了一种特殊种

m0_68363675的博客 1425

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

Java内部类和异常类/程序设计语言的基本概念

CET4P211 weaken dumb landlord horrible intense scope recovery refusal edition glove handwriting educate speculate mechanism

想带狗熊去吹风 887

FPGA实现串口的任意字节数接收

基于FPGA的任意字节数(单字节、多字节)的串口(UART)接收,真的不来看看吗?

孤独的单刀 1万+

Spark Catalog详解

旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗?我:你应该静下心来好好把spark基础知识进行全面学习。实习生:难道spark有这功能,而我没有学习过?咋弄啊?我:学习一下Spark Catalog。实习生:啥是Catalog啊?Spark Catalog是Spark SQL中的一个元数据管理组件,它提供了一个集中化的存储和查询表、视图和函数的位置。

SunnyRivers 1814

内部类_简单应用

内部类:在一个类中定义另一个类,类中的类称为内部类(相对于外嵌类)。基本属性:    外嵌类的属性在内部类中有效,内部类可以在方法中调用外嵌类的方法;    外嵌类的类体可以用内部类声明对象作为外嵌类的属性;    除外嵌类,其他类不可以用内部类声明对象。以下为简单的内部类应用的例子:RedCowForm.javapublic class RedCowForm { public static S...

学无止境,Fighting! 825

第二节:Vben Admin 登录逻辑梳理和对接后端准备

第一节,我们已经配置了前端环境,运行起来了我们的Vben Admin的项目。本节内容,我们先熟悉下项目的目录和文件,然后开始准备对接后端程序路由在 src/router页面在 sr/views本节前端登录逻辑梳理完成了,后端只要在/api/login 接口编写返回逻辑,前后段就可以打通了,具体详情我们下一节介绍。

cuiwin的专栏 5084

java-成员内部类

java-成员内部类1 源码 package com.InnerClass; public class MemberInnerClass01 { public static void main(String[] args) { Outer08 outer08 = new Outer08(); outer08.t1(); } } class Outer08 {//外部类 private int n1 = 10; public String name = “张三”; //1. 注意:成员内部类 是定义在外

m0_59605707的博客 1625

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java内部类-成员内部类

成员内部类是一种非静态的内部类,它定义在另一个类的内部,并且作为外部类的成员存在。成员内部类与外部类的关系类似于外部类的成员变量或成员方法。成员内部类可以访问外部类的所有成员,包括私有成员。成员内部类是在外部类的类体中定义的类,使用方法类似于外部类的成员变量和方法。成员内部类的对象必须依赖于外部类的对象才能创建。在这个例子中,InnerClass是一个成员内部类,它可以直接访问外部类OuterClass的私有字段outerField。

Flying_Fish_roe的博客 1229

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java 内部类怎么调用成员变量_JAVA内部类之成员内部类

JAVA有一个特殊的类形式——内部类(这个词有点为难普通话不好的南方朋友)。今天我们就来聊聊内部类的一种:成员内部类。如何定义成员内部类那要如何定义成员内部类呢。既然叫成员内部类,说明和成员变量是有类似的地方。从代码的层次结构上来看他是和成员变量处于相同层级的。我们来举个例子。上图代码中,在类OutClass中定义了一个成员变量name。在OutClass中又定义了一个类InClass,这个InC...

weixin_34123197的博客 3511

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java的static成员和内部类

static 成员的介绍和注意事项 代码块的概念和使用 内部类的种类和使用 快捷的对象的打印

m0_66483195的博客 758

JAVA成员内部类

成员内部类可以看作是外部类的非静态成员的内部类。内部类和外部类的其他成员是同一级别的,也是外部类的一个成员。 package JAVA_Project_01_05; //成员内部类可以看作是外部类的非静态成员的内部类。内部类和外部类的其他成员是同一级别的,也是外部类的一个成员。 //使用成员内部类的技术要点如下: // //· 成员内部类的语法格式:class外部类名{(public/pri...

江南一只猫 383

Java小白对成员内部类的总结

Java成员内部类的总结 说实话,Java内部类我是理解了很久(2-3天吧),因为经常搞混,又特无语 以下总结是为了更好的理解,首先来成员内部类吧 成员内部类创建对象格式 有两种命名时期的格式(如何用在下面的 访问成员内部类的访问格式 中介绍) 在其他类中创建成员内部类对象 外部类.内部类 XXX=new 外部类().new 内部类(); //定义一 外部类.内部类 XXX=外部类.new ...

Alopecia的博客 608

java内部类之成员内部类、局部内部类和匿名内部类

内部类概念 一个类中包含另外一个类。 分类 1、成员内部类。 2、局部内部类(包含匿名内部类)。 成员内部类 定义格式: 修饰符 class 类名称 { 修饰符 class 类名称 { //... } //... } 注意: 内部类使用外部,可以随意访问,但是外部类使用内部类要借助内部类的对象。 使用成员内部类 两种方法: 1...

green703338130的博客 6713

Java内部类——成员内部类

成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义。。。 class InnerClass { //变量,函数定义。。。 } } 关于成员内部类的...

asd22110的博客 152

java学习--内部类之成员内部类

成员内部类是定义在外部类成员位置的内部类,属于外部类的非静态成员。核心特点包括:必须通过外部类实例创建,可直接访问外部类所有成员(包括私有成员);可通过"外部类名.this"访问外部类实例;支持public/private等访问修饰符控制访问权限。创建语法分三种情况:外部类内部直接new、外部类外部通过"外部实例.new"创建、静态方法中需先创建外部类实例。典型应用场景是与外部类强关联的辅助组件,如汽车与发动机的关系。与静态内部类相比,成员内部类能直接访问外部类非静态

感谢你的关注~~~~ღ( ´・ᴗ・` ) 827

java成员内部类_Java成员内部类

Java成员内部类1 什么是Java成员内部类在类内部但在方法外部创建的非静态类称为成员内部类。2 Java成员内部类的语法class Outer{//codeclass Inner{//code}}3 Java成员内部类的例子在此示例中,我们在成员内部类中创建msg() 方法,该方法正在访问外部类的私有数据成员。package com.yiidian;/*** 一点教程网: http://www...

weixin_29063979的博客 760

Java 成员内部类

成员内部类是什么样的、有什么特点?无static修饰,属于外部类的对象可以直接访问外部类的静态成员,实例方法中可以直接访问 外部类的实例成员成员内部类如何创建对象?外部类.内部类名 对象名 = new 外部类构造器.new 内部类构造器();//创建成员内部类对象 People . Heart h = new People() . new Heart();//调用内部类对象方法 h . show();} }注意:在成员内部类中访问所在外部类对象,格式:外部类.this。...

weixin_45102678的博客 600

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

通过【Java多态十六:匿名内部类】这篇博文给出的范例可知,匿名内部类可应用于这种场景:一个接口A、或一个抽象类B中定义了一个未实现的方法a(自然一个普通类C的已经实现了的方法也行,这样的话就是重写了),在其另一个类D中,需要调用这个方法a,这个时候就可以在类D的调用方法这个方法的地方使用匿名内部类的方法,完成对方法a的具体实现,以完成具体的功能调用。 可以发现,上面的过程并没有写出包含a方法具体实现的匿名类的名字,也没有该匿名类的实例对象,,,但通过系统浏览器可以发现,在程序编译后,有该匿名内部类的.c

小枯林的博客 945

java 成员内部类

内部类:指一种嵌套的结构关系。即在一个类的内部除了属性和方法还可以继续定义一个完整的类。

m0_74037729的博客 538
上一篇: 关于数据库索引
下一篇: Java 线程池
Embra_ce
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值