内部类详解

基于ASP.NET+SQLServer的美妆网站的设计与实现 通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。 阅读详情

文章地址:http://blog.youkuaiyun.com/JavaEETeacher/archive/2011/03/26/6279460.aspx

内部类

内部类包括如下几种形式:

l         作为类成员的内部类;

l         成员方法中定义的内部类;

l         匿名内部类;

l         静态内部类。

http://blog.youkuaiyun.com/javaeeteacher 李绪成

1作为类成员的内部类

1.1内部类的编写

内部类和外部类的定义形式相同,但是需要在类中定义:

public class MyOuter {

       public class MyInner{

       }

}

该文件编译后能够生成两个类:MyOuter.class和MyOuter$MyInner.class。

注意:内部类的访问控制符有:public、protected、private和缺省的,与类的成员变量和成员方法的访问控制符相同,而外部类的访问控制符只有public和缺省的。

内部类可以访问所在的外部类的成员变量,包括私有成员变量,就像类自身的方法能够访问类的所有类型的成员变量一样,例如下面的代码是正确的:

public class MyOuter {

       private String name="test";

       class MyInner{

              public void print(){

                     System.out.println(name);

              }

       }

}

内部类中不能定义static类型的方法,下面的代码是错误的:

public class MyOuter {

       private String name="test";

       class MyInner{

              public static void print(){

                     System.out.println(name);

              }

       }

}

内部类可以是抽象的,内部类可以继承某个类,也可以实现某个接口,

public class MyOuter {

       private String name="test";

       abstract class MyInner1{

              public abstract void print();

       }

       class MyInner2 extends MyInner1 implements Serializable{

              public void print(){

                     System.out.println(name);

              }

       }

}

内部类也可以是final类。

1.2从外部类的代码中使用内部类

可以把内部类的对象作为外部类的成员变量使用,可以在外部类的方法中使用内部类的对象。

下面的代码演示了如何把内部类的对象作为成员并且展示了两种实例化的代码:

public class MyOuter {

       private MyInner in=new MyInner(); //定义的时候实例化

       private MyInner in2; // 先定义

       public MyOuter(){

              in2 = new MyInner(); // 在构造方法中实例化,也可以在其他方法中实例化

       }

    …

}

下面的代码展示了如何在外部类的方法中使用内部类的对象:

public class MyOuter {

       public void makeInner(){

              MyInner in3 = new MyInner(); //方法中定义变量并实例化

              in3.print();

       }

    …

}

上面的实例化代码相当于MyOuter.MyInner in3 = this.new MyInner();,因为在类的内部使用所以在类型前面省略了MyOuter,实例化的时候省略的“this.”。

1.3 从外部类的代码外实例化内部类

在外部类的代码之外使用内部类,就像访问类的实例变量一样,需要先创建外部类的对象,然后通过外部类的对象访问内部类的方法,下面的代码展示了用法:

       public static void main(String[] args) {

              MyOuter.MyInner in = new MyOuter().new MyInner();

              in.print();

             

              MyOuter out = new MyOuter();

              MyOuter.MyInner in2 = out.new MyInner();

              in2.print();

       }

代码中展示了两种方式,两种方式的作用是相同的,下面的代码是错误的:

MyOuter.MyInner in3 = MyOuter.new MyInner();

MyOuter.MyInner in4 = new MyOuter.MyInner();

注意:在外部类的代码之外使用内部类,内部类必须是可见的,下面的代码是错误的:

public class MyOuter {

       private class MyInner{

              public void print(){

                     System.out.println(name);

              }

       }

    …

}

public class Main {

       public static void main(String[] args) {

              MyOuter.MyInner in = new MyOuter().new MyInner();

       }

}

1.4 在内部类中引用外部类实例或者内部类实例

在类中引用当前实例可以使用this,但是内部类中要引用内部类的实例或者内部类所在的外部类的实例如何引用呢?在内部类中引用内部类自身的实例仍然是通过this,在内部类中引用外部类的实例需要使用外部类的名字加上this的方式,下面的代码展示了用法:

public class MyOuter {

       int x=20;

       public class MyInner2{

              int x=10;

              public void print(){

                     int x=5;

                     System.out.println("局部变量x的值:"+x);

                     System.out.println("内部类成员变量x的值:"+this.x);

                     System.out.println("外部类成员变量x的值:"+MyOuter.this);

              }

       }

       public static void main(String args[]){

              new MyOuter().new MyInner2().print();

       }

    …

}

程序的运行结果:

局部变量x的值:5

内部类成员变量x的值:10

外部类成员变量x的值:20

http://blog.youkuaiyun.com/javaeeteacher 李绪成

2 成员方法中定义的内部类

2.1内部类的编写

成员方法中的内部类的编写与作为成员变量的内部类的编写方法基本相同,下面的代码展示了用法:

public class MyOuter2 {

       public void test() {

              class MyInner{

                     public void print(){

                            System.out.println(x);

                     }

              }       

       }

}

方法内部的类具有如下特点:

l         方法内部定义的类就像方法的局部变量,所以在类外或者类的其他方法中不能访问这个内部类。

l         没有访问控制符,因为该类只能在定义该类的方法中并且在类的定义之后使用;

l         不能访问方法的局部变量,除非局部变量是final类型的;

l         能够访问外部类的各种成员变量,如果内部类所在的方法是静态方法,则这个内部类只能访问外部类的静态成员;

l         可以使用final和abstract修饰。

2.2方法中内部类的访问

方法中的内部类只能在定义该内部类的方法中访问,并且是方法中内部类的定义之后访问。下面的代码展示了用法:

       public void main2(String[] args) {

              class MyInner{

                     public void print(){

                            System.out.println(x);

                     }

              }

              MyInner in = new MyInner();

              in.print();

       }

http://blog.youkuaiyun.com/javaeeteacher 李绪成

3 匿名内部类

顾名思义,匿名内部类没有类名,而我们创建对象是根据类名创建的,没有类名如何创建对象的?可以使用类的定义直接创建实例,例如下面的代码:

Parent p = new Parent() {

              public void print() {

                     System.out.println("匿名内部类中的输出方法");

              }

       };

new后面的信息表示创建了一个继承了Parent类的子类的实例。

匿名内部类有两种形式:

l         通过继承父类而形式的匿名内部类;

l         通过实现接口而形式的匿名内部类。

下面分别介绍。

3.1通过继承父类而形成的匿名内部类

看下面的代码:

class Parent {

       public void print() {

              System.out.println("父类的输出方法");

       }

}

public class MyOuter3 {

       Parent p = new Parent() {

              public void print() {

                     System.out.println("匿名内部类中的输出方法");

              }

       };

}

在MyOut3中声明了类型为Parent的成员变量,通过new Parent来实例化对象,但是这里的实例化代码与以前见到过的实例化代码不同,以前的代码这样写:

Parent p = new Parent();

而这里是:

Parent p = new Parent(){

这里的大括号意味着新创建了一个类,这个类是Parent的子类,在子类中可以覆盖父类中的方法或者实现父类中定义的抽象方法,上面的代码重写了父类中的print方法。

    注意在倒数第二行的“};”,这个分号不能省略。

上面的代码中定义的成员变量p指向了匿名内部类的实例,也可以在成员方法中定义局部变量指向匿名内部类的实例。

对于匿名内部类的实例的方法的调用是通过执行该实例的父类引用,利用了Java语言的多态性。下面的代码展示了如何调用(在MyOuter3中增加的代码):

       public static void main(String[] args){

              new MyOuter3().p.print();

       }

输出结果是:

子类中的输出方法

注意:因为匿名内部类中的方法都是通过父类引用访问的,所以不能在匿名内部类中定义父类中没有声明的方法,这样的方法不能被访问到。如果是为了匿名内部类中的方法之间共享代码,可以编写供内部方法调用的在父类中没有定义的方法。

3.2通过实现接口而形成的匿名内部类

匿名内部类也可以通过实现接口来创建,与继承父类没有本质区别。下面的代码展示了使用接口创建匿名内部类:

interface Fly{

       public void takeof(); //起飞

       public void landing(); //降落

}

public class MyOuter3 {

       Fly bird = new Fly(){

              public void takeof(){

                     System.out.println("小鸟起飞了");

              }

              public void landing(){

                     System.out.println("小鸟降落了");

              }

       };

}

代码中new Fly(){…}意味着创建了一个实现了Fly接口的类的对象,这个类就是匿名内部类。这个匿名内部类必须实现接口中定义的所有方法,这与普通类实现接口的要求是相同的。在这个类中也不能定义其他的业务方法,这些方法是通过接口的引用访问的,因为接口中没有声明该方法,所以该方法将不能被访问。

注意:new Fly(){…}实例化的对象是实现了Fly接口的类的对象,而不是实例化Fly接口,接口是不能被实例化的。

这些匿名内部类被实例化以后通过父类引用或者接口引用访问,通常都会有一个引用指向这个新创建的匿名内部类的实例。有个特殊的应用不需要创建引用指向匿名内部类的实例,而是传递给形参,看下面的代码(在MyOuter3中添加如下代码):

       public static void main(String[] args){

        // 直接把匿名内部类的实例作为实参使用

              new MyOuter3().printFly(new Fly(){

                     public void takeof(){

                            System.out.println("飞机起飞");

                     }

                     public void landing(){

                            System.out.println("飞机降落");

                     }

              });

       }

       public void printFly(Fly fly){ // 参数需要是实现Fly接口的类的对象

              fly.takeof();

              fly.landing();

       }

注意:我们自己在开发程序的时候尽量不要使用内部类,内部类不利于代码重用,如果非常确定这个类只会使用一次,可以使用匿名内部类。

http://blog.youkuaiyun.com/javaeeteacher 李绪成

4 静态内部类

4.1静态内部类的定义

静态内部类与作为成员的内部类基本相同,只是这个内部类是静态的,使用static,类似于静态成员变量和静态成员方法。下面的代码展示了如何定义静态内部类:

public class MyOuter4 {

       static class MyInner{

       …

       }

}

与静态方法一样,在静态内部类中只能访问外部类的静态方法,看下面的代码:

public class MyOuter4 {

       int x = 10;

       static int y = 20;

       static class MyInner{

              public void print(){

                     System.out.println(x);  // 错误

                     System.out.println(y);  // 正确

              }

       }

}

System.out.println(x);是错误的,因为它试图访问非静态成员变量x,System.out.println(y)是正确的。

4.2静态内部类的使用

在实例化作为实例成员变量的内部类的时候,要先创建外部类的对象,然后通过对象的new操作符创建内部类的实例。而静态内部类就像静态方法一样,可以通过类名直接访问而不用创建实例。下面的代码展示了在外部类的内容和外部类的外部如何访问静态内部类(第一个方法是在MyOuter4中添加的代码,第二个方法是测试类中的代码):

       public void outprint(){

              MyInner inner = new MyInner();

              inner.print();

       }

       public static void main(String args[]){

              MyOuter4.MyInner inner = new MyOuter4.MyInner();

              inner.print();

       }

http://blog.youkuaiyun.com/javaeeteacher 李绪成

SAP 合并报表(EC-CS)完整方法论 + 全业务操作步骤 SAP合并报表(EC-CS)方法论与操作指南摘要 SAP EC-CS模块提供完整的集团合并解决方案,其核心方法论基于会计准则和集团管控逻辑,通过6大维度构建标准化合并体系:组织架构标准化、数据采集标准化、外币换算规则化、内部交易自动化抵消、股权与商誉规范化、报表出具灵活化。 实施过程分为两个阶段: 上线前配置阶段(12个步骤):包括合并架构搭建、科目表配置、外币规则设定、抵消规则定义等基础工作 日常操作阶段(10个步骤):涵盖数据报送、外币换算、内部对账、自动抵消、调整分录等月结流程 系统优势包括: 支持多 阅读详情

相关推荐

COMSOL实现裂缝性储层油水两相流模拟的关键技术

多孔介质中的流体流动模拟是油气藏开发的核心技术,其基本原理基于达西定律和质量守恒方程。在裂缝性储层中,离散裂缝网络与基质系统的耦合流动带来了特殊的数值挑战。通过COMSOL Multiphysics平台实现的多物理场耦合技术,可以精确模拟油水两相在复杂裂缝系统中的渗流行为。该技术采用Level Set方法表征裂缝几何形态,结合自适应网格生成技术解决狭窄裂缝的网格剖分难题,并创新性地引入Bang-Larsen毛管压力滞后模型,显著提高了采收率预测精度。这些方法在致密油藏开发、水驱优化等工程实践中具有重要应用价

weixin_34005090的博客 229

.NET中的内部类型

本文介绍了.NET中的内部类的使用及替代方案,如果你有更好的看法,欢迎交流.

nsDragon的专栏 1033

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1510

四大内部类详细解析(全网最细)

一.内部类的分类: 定义在外部类局部位置上(比如方法体内) 局部内部类(有类名) 匿名内部类(无类名) 定义在外部类的成员位置上(作为成员): 非静态成员内部类 静态成员内部类 二.局部内部类 定义在外部类的局部位置,比如方法中,并且有类名。 1.局部内部类可以直接访问外部类的所有成员,包扩私有 public class INNER { private int n1 = 100; private void m1() {} public void m2()

qq_40979103的博客 1750

macOS安装Cplex+yalmip

macOS安装Cplex+yalmip

DS 4250

AI应用安全 - Prompt注入攻击

随着大模型的爆火,各行各业都在使用大模型进行智能化改造。但是如何做一个可靠的大模型应用,就需要考虑各种安全问题。本文主要介绍一种常见的安全问题,即prompt注入攻击,并介绍一些防范手段。Prompt Injection Attack(提示注入攻击)是针对大型语言模型(LLM)的一种新兴安全威胁,攻击者通过精心构造的输入提示(prompt)来操纵模型行为,使其产生非预期输出或执行恶意操作。它主要包括两种注入方式,一是直接注入,而是间接注入。

sinat_28694519的博客 1932

详解 Java 内部类

前言 内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点。 从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看: 普通内部类 这个是最常见的内部类之一了,其定义也很简单,在一个类里面作为类的一个字段直接定义就可以了,例: pub...

指点 6万+

全球SAR卫星大盘点与回波数据处理专栏目录

本专栏将详细介绍各国各地区的SAR卫星的特点和性能,以及SAR回波数据的处理方法和技巧。主要介绍民用和商用SAR卫星,帮助你了解商业SAR卫星的最新动态和技术,MATLAB代码将全部开源。以下是专栏目录,持续更新中。

3166

Java 内部类详解

目录1. 静态内部类定义:访问规则:2. 非静态内部类定义:访问规则:3. 内部类使用方法外部类中使用内部类:外部类以外的地方使用内部类:4. 内部类与外部类变量同名总结 在某些情况下,一个类会放在另一个类的内部定义,这个定义在其他类内部的类就称为内部类,包含内部类的类则被称为外部类。内部类主要有几个作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问 2.内部类成员可以直接访问外部类的私有数据,因为内部类相当于外部类的成员 3.匿名内部类可用于创建那些仅需一次使用的

Yaber的博客 1203

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 51

深度强化学习在机器人控制中的应用

非常感谢您提供如此详细的任务要求和约束条件。作为一位世界级的人工智能专家和计算机领域大师,我将全身心投入到这篇技术博客的撰写中。 深度强化学习在机器人控制中的应用 1. 背景介绍 近年来,随着人工智能技术的飞速发展,深度学习和强化学习在各个领域都得到了广泛应用,尤其是在机器人

AI天才研究院 1326

Java内部类详解

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

轻口味的专栏 1361

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

Applitools是一款基于人工智能的视觉验证测试工具,专门用于自动化和验证应用程序的用户界面(UI);Applitools使用视觉回归测试来检测应用程序界面的变化,确保 UI 在不同版本之间的一致性;Applitools的核心功能是通过视觉比较,检测 UI 元素的差异,而无需手动编写复杂的界面检查代码;通过集成Applitools,测试人员可以轻松捕捉和验证界面中的视觉差异,无论是在Web移动端或桌面应用的测试环境;

blues_C的博客 2923

内部类(四种内部类详解)

== = = = = = = 内部类(四种内部类详解)= = = = = = = == 一、基本介绍:一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员【思考:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类]】,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系,注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类. 如果定义类在局部位置(方

qq_45821255的博客 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

详解Java的内部类

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class)嵌套其他类的类称为外部类(outer class)。它是我们类的第五大成员,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。①局部内部类(有类名)②匿名内部类(没有类名,重点)①成员内部类(没用static修饰)②静态内部类(使用static修饰)

weixin_69053029的博客 1004

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA内部类详解

最近在看hystrix源码的时候,发现Netflix的牛人们,使用了大量的匿名内部类。于是又回头翻了翻《java编程思想》。书中所讲、与自己理解,记录于瓷片文章。 内部类的定义:     将一个类的定义放在另一个类定义的内部,这就是内部类。 为什么需要内部类  &a

是夜色太荒芜的专栏 969

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 编程能力强化(4)——模拟SQL语句解析
下一篇: Java基础:多线程
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值