java语法——内部类

深入理解Java匿名内部类:语法、应用与最佳实践 在Java编程中,匿名内部类(Anonymous Inner Class)是一种没有名字的内部类,它通常在创建对象的同时定义类的实现。虽然Java 8引入的Lambda表达式在许多场景下可以替代匿名内部类,但理解匿名内部类的工作机制仍然非常重要。匿名内部类是Java语言中函数式编程的雏形,虽然在Java 8引入了Lambda表达式后,部分场景可以被替代,但理解匿名内部类仍然对掌握Java编程思想至关重要。// 如果取消注释,上面的匿名内部类访问counter会报错。// 示例1:实现接口的匿名内部类。 阅读详情

 

一、 定义
放在一个类的内部的类我们就叫内部类。
二、 作用
1.内部类可以很好的实现隐藏
  一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
三、   例子
1.实现隐藏
   平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子
接口
package insidecategory;

public interface Incrementable
{
  void increment();
}
具体类
package insidecategory;

public class Example {
  
    private class InsideClass implements InterfaceTest
    {
         public void test()
         {
             System.out.println("这是一个测试");
         }
    }
    public InterfaceTest getIn()
    {
        return new InsideClass();
    }
}
上面加粗的部分是内部类,访问修饰符是private
客户端程序
package insidecategory;

public class TestExample {

  public static void main(String args[])
  {
    Example a=new Example();
    InterfaceTest a1=a.getIn();
    a1.test();
  }
}
加粗的那部分就是客户端调用的代码,从这段代码里面我只知道Example的
getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。
2.可以无条件地访问外围类的所有元素
package insidecategory;

public class TagBean {

 private String name="liutao";
   private class InTest
   {
      public InTest()
      {
          System.out.println(name);
      }
   }
   public void test()
   {
    new InTest();
   }
   public static void main(String args[])
   {
       TagBean bb=new TagBean();
       bb.test();
   }
}
看上面加粗部分,name这个变量是在TagBean里面定义的私有变量。这个变量在内部类中可以无条件地访问System.out.println(name);
 3.可以实现多重继承
    个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。大家看下面的例子。
类一
  package insidecategory;

public class Example1 {

   public String name()
   {
       return "liutao";
   }
}
类二
package insidecategory;

public class Example2 {

    public int age()
    {
        return 25;
    }
}

类三
 package insidecategory;

public class MainExample
{
   private class test1 extends Example1
    {
        public String name()
        {
          return super.name();
        }
    }
    private class test2 extends Example2
    {
       public int age()
       {
         return super.age();
       }
    }
   public String name()
    {
    return new test1().name();
   }
   public int age()
   {
       return new test2().age();
   }
   public static void main(String args[])
   {
       MainExample mi=new MainExample();
       System.out.println("姓名:"+mi.name());
       System.out.println("年龄:"+mi.age());
   }
}
大家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和Example2的方法和属性,也就间接地实现了多继承。
四、 避免修改接口而实现同一个类中两种同名方法的调用。
  大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
 package insidecategory;

public interface Incrementable
{
  void increment();
}

类  MyIncrement
   package insidecategory;

public class MyIncrement {

    public void increment()
    {
      System.out.println("Other increment()");
    }
    static void f(MyIncrement f)
    {
        f.increment();
    }

}
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
package insidecategory;

public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
      {
        //代码
       }
}
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
package insidecategory;

public class Callee2 extends MyIncrement
{
  private int i=0;
  private void incr()
  {
       i++;
       System.out.println(i);
  }
  private class Closure implements Incrementable
  {
      public void increment()
      {
        incr();
      }
  }
  Incrementable getCallbackReference()
  {
      return new Closure();
  }
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。

 

 

1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。

2、成员内部类:形式如下
    class Outer {
        class Inner{}
    }       
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
成员内部类内不允许有任何静态声明!下面代码不能通过编译。
    class Inner{
        static int a = 10;
    }
能够访问成员内部类的唯一途径就是通过外部类的对象!

A、从外部类的非静态方法中实例化内部类对象。

简述内部类的作用? 内部类通过。 阅读详情

相关推荐

STM32 Proteu直流电机正反转控制系统限位开关-0035

硬件组成:STM32F103C6单片机 +L298N电机控制电路+直流电机+3个按键(正转、反转、停止)+LED指示灯(正转、反转、停止)+限位开关(正限位 反限位) 1.通过3个按键(正转、反转、停止)控制电机的正转、反转、停止。 2.有3个LED指示灯,正转时正转指示灯亮。反转停止对应反转停止指示灯亮。 3.有自动正转反转停止功能,正转时当正限位按键按下时说明正转到最大距离。此时自动停止。反转一样。

zhaxiaobian_er的博客 2003

java内部类的四大作用

一、内部类的作用 我们为什么需要内部类?或者说内部类为啥要存在?其主要原因有如下几点: 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据 内部类可以对同一包中的其他类隐藏起来 内部类可以解决java 单继承的缺陷 当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现 举例说明如下: 可以无条件地访问外围类的所有元素 为什么可以引用:内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this

cristianoxm的博客 7141

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器?

本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。

weixin_30134145的博客 360

内部类的作用

内部类的作用 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 内部类的方法可以直接访问外部类的所有数据,包括私有的数据 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便 内部类允许继承多个非接口类型(具体将在以后的内容进行讲解) 1.成员内部类 1.因为内部类相当于成员变量,所以内部类可以使用任意的访问修饰符 2.内部类可以直接访问外部类的所有属性和方法,反之则不行 3.内部类必须由外部类来创建 内部类 对象名 = 外部类对象.new 内部类()

weixin_51667325的博客 1576

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文详细解析了OpenCV图像去畸变的原理与实战方法,对比了三种核心函数(标准、鱼眼、全景模型)的适用场景与效果。重点提供了完整的代码示例,并深入探讨了alpha、焦距、中心点等关键参数的调优技巧,以帮助开发者有效矫正镜头畸变,提升计算机视觉任务精度。

life6的博客 554

Megatron-LM深度解析:万亿参数大模型的3D并行训练之道

训练框架,采用创新的"层内模型并行"设计,通过将Transformer层的计算拆分到多个GPU上并行执行,显著提升训练效率。该系统支持3D并行策略(数据并行、张量并行、流水线并行)和序列并行等新技术,成功应用于训练5300亿参数的MT-NLG模型。相比DeepSpeed、TPU GSPMD等框架,Megatron-LM在NVIDIA GPU上展现出卓越性能,并与TensorRT等工具深度集成,形成从训练到部署的完整解决方案。该项目持续演进,已成为大模型训练的重要基准。

数据与算法架构提升之路专栏 2099

什么是内部类?内部类的种类?内部类的作用?

一、什么是内部类 将一个类定义在一个类或者一个方法里面,这样的类称着内部类 https://www.jianshu.com/p/83a50ef23279 https://blog.youkuaiyun.com/lianxu3344/article/details/79473607 https://blog.youkuaiyun.com/flyfeifei66/article/details/82686086 https:...

T-bright的博客 1万+

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4013

内部类的作用(转载)

[code="java"] 一、 定义 放在一个类的内部的类我们就叫内部类。 二、 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访问权限 3.可是实现多重继承 4.可以避免修改接口而实现同一个类中两种同名方法的调用。 三、 例子 1. 实现隐藏 平时我们...

lrz1011的专栏 364

《无线传感网络 matlab》:从入门到实践

这就是如何使用Matlab建立一个简单的无线传感网络并进行仿真的方法。当然,这只是一个入门级的示例,真正的无线传感网络可能会更加复杂和庞大。首先,我们需要创建一个无线传感网络的基础结构。接下来,我们需要定义一个数据包的格式,以便节点之间可以交换信息。无线传感网络是一种由无线传感器节点组成的、自组织的网络。现在,我们可以开始编写节点代码了。我们将使用Matlab提供的工具箱来构建一个简单的无线传感网络,并对其进行仿真和分析。现在,我们可以将这个节点复制9次,以创建一个包含10个节点的无线传感网络。

NoerrorCode的博客 297

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java语法学习内部类

局部内部类本质上同时有局部变量和类的特点局部变量:局部变量的作用域,导致内部可以访问外部,但是外部不能直接访问内部 ,而如果想访问重名的外部类的属性,需要:外部类.this.属性局部变量没有修饰符(但是类可以用final),本质上属于外部类,所以可以访问外部类的private类:访问局部内部类需要创建对象才能访问,局部内部类也可以继承,实现接口,但是要在同一个作用域才行(局部内部类也可以继承外部其它类),也可以有属性,方法,代码块,构造器,内部类与局部内部类差别在所处的位置。

2403_82385265的博客 1436

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

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

Java基础语法——内部类

基本介绍基本介绍一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系基本语法class OuterClass { // 外部类// ...class NestedClass { // 嵌套类,或称为内部类// ...内部类的分类定义在外部类局部位置上(不如方法内):局部内部类(有类名)匿名内部类(没有类名)

2402_86637890的博客 938

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java 内部类语法

weixin_43918196的博客 268

Java语法糖4:内部类

内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类。 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.class。所以内部类的名字完全可以和它的外部类名字相同。 内部类分为四种:成员内部类、局部内部...

飞奔的小土豆@1024 217

Java基础语法练习36(内部类)

1.局部内部类(有类名) 2.匿名内部类(没有类名,重点!!!!

weixin_68453343的博客 552

一篇文章理解Java的匿名内部类语法

什么是匿名内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,类B则称为外部类。 匿名内部类 是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用 匿名内部类。 特征:声明匿名内部类的同时创建该类的对象 前提 存在一个类或者接口,这里的类可以是抽象类也可以是普通类。 语法格式: 继承父类: new 父类名称([实参列表]){ // 类的成员列表 }

sun10367的博客 404

java内部类的this和new语法

wzx19840423的专栏 1339

Java中匿名内部类的语法及使用

1.内部类: 什么是内部类? 在类的内部又定义了一个新的类,称为内部类。 内部类的分类: 静态内部类:类似于静态变量。 实例内部类:类似于实例变量。 局部内部类:类似于局部变量。 使用内部类编写的代码,可读性很差,能不用尽量不用。 测试代码 class A { //静态内部类 static class Inner1 { } //静态变量 static String country = "China"; //实例内部类 public class In

pipizhen_的博客 745

Java 关于匿名内部类语法的思考

蚂蚁最近在学习Java和Android时,遇到了一个匿名内部类语法的使用问题。 很多书籍,包括网络,都有特别指出:匿名内部类必须在抽象类或接口的基础上,才可以定义。比如: interface AnInterface{ void info(); } abstract class AnAbstractClass{ abstract void info(); } 完全可以使

silencecyn的博客 410

java 匿名类语法_JAVA匿名内部类语法分析及实例详解

1.前言匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在完成了手头的开发任务后,查阅了一下JAVA官方文档,将匿名内部类的使用进行了一下总结,案例也摘自官方文档。感兴趣的可以查阅官方文档(https://docs.oracle.com/javase/tuto...

weixin_34377186的博客 444

Java内部类语法总结

Java内部类语法总结从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。几种内部类的共性:A、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。B、内部类不能用...

肖申克的救赎r的博客 422

Java学习day043 内部类(使用内部类访问对象状态、内部类的特殊语法规则、内部类是否有用、必要和安全、局部内部类)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。 day043 内部类(使用内部类访问对象状态、内部类的特殊语法规则、内部类是否有用、必要和安全、局部内部类) 内部类(inner class)是定义在另一个类中的类。为什么需要使用内部类呢?其主要原因有以下三点: •内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。 •内部...

Zzehao的博客 536

深入理解Java内部类:语法、应用与底层原理剖析

内部类(Inner Class)是定义在另一个类内部的类,主要作用包括:实现代码逻辑的更好封装直接访问外部类的私有成员构建更简洁的回调机制支持多继承的变通实现。

KBkongbaiKB的博客 1014
上一篇: java ssh中文乱码问题综合
下一篇: java语法——JDBC
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值