首页 > 编程语言 >Java - 28 内部类

Java - 28 内部类

时间:2024-11-07 19:31:29浏览次数:1  
标签:Java 内部 void 成员 28 访问 Inner public

Java - 内部类

一个类的内部 又完整地嵌套了另一个类结构,被嵌套的内为 内部类

内部类 - 外部类 - 外部其他类

类的五大成员:属性;方法;构造器;代码块;内部类

class Outer{
  class Inner{
    
  }
}

定义在外部类 局部位置 上(通常在 方法 /代码块 中)

局部内部类(有类名)

  • 本质还是一个类,作用域在 定义它的方法或代码块中
  • 可以直接访问外部类的所有成员,包括私有的
  • 不能添加访问修饰符,可以使用 final 修饰
class Outer{
  private int n = 1;
  private void m2(){}
  public void m1(){
    // 不能添加访问修饰符,可以使用 final 修饰
    class Inner01{ // 本质还是一个类,作用域在 定义它的方法或代码块中
      // 可以直接访问外部类的所有成员,包括私有的
      public void f1(){
        System.out.println("n1="+n1);
        m2();
      }
    }
    class Inner02 extends Inner01{}
    
    // 外部类在方法中可以创建Inner对象,然后调用方法即可
    Inner01 in = new Inner01();
    in.f1();
  }
}

匿名内部类(没有类名)

new 类或接口(参数列表){
  
}
  • 本质是类,作用域在 定义它的方法或代码块中
  • 该类没有名字(但系统会分配一个我们看不到的名字)
  • 匿名内部类 使用一次就不能再使用了
  • 可以直接访问外部类的所有成员,包括私有的
  • 同时 还是一个对象
  • 局部变量不能使用访问修饰符
  • 外部类与匿名内部类的成员重名时,匿名内部类的访问遵循就近原则,使用外部类.this.成员 访问外部成员
class A{
  private n1 = 1;
  public A(){}
  
  public void me(){
    // ia编译类型:IA,运行类型:匿名内部类
    // jdk底层创建匿名内部类后立马创建了对象
    IA ia = new IA(){
      @override
      public void cry(){
        System.out.println("...");
      }
    };
    ia.cry();
    ia.getClass(); // A$1
    
    // 参数列表会传给 Father 的构造器
    Father f = new Father("Hu"){
      private n1 = 88;
      @override
      public void test(){
        System.out.println("匿名内部类重写了test()");
        // 访问外部 n1
        System.out.println(A.this.n1); // 1
      }      
    };
    f.getClass(); // A$2
  }
}

interface IA{
  void cry();
}
class Father{
  public Father(String name){}
  public void test(){}
}

最佳实践

当作实参直接传递

class Main{
  public static void main(String[] args){
    f1(new IL(){
      @Override
      public void show(){
        System.out.println("show");
      }
    });
  }
  public static f1(IL il){
    il.show();
  }
}

interface IL{
  void show();
}

定义在外部类 成员位置 上

成员内部类(没用static修饰)

class Main{
  public static void main(String[] args){
    // 外部其它类访问成员内部类1
    Outer ot = new Outer();
    Outer.Inner inner1 = ot.new Inner();
    // 外部其它类访问成员内部类2
    Outer.Inner inner2 = ot.getInnerInstance();
  }
}

class Outer{
  private int n1 = 1;
  
  public class Inner{
    private double sal = 99.8;
    public void say(){
      System.out.println(n1); // 直接访问外部类成员
    }
  }
  
  public void t1(){
    // 创建对象再访问
    Inner inner = new Inner();
    inner.say();
    System.out.println(sal); // 99.8
  }
  
  // 返回成员内部类对象的方法
  public Inner getInnerInstance(){
    return new Inner();
  }
}
  • 作用域为整个类

  • 成员内部类 可以直接访问外部类的所有成员,包括私有的

  • 外部类 访问 成员内部类 需要创建对象再访问

  • 外部其它类访问成员内部类 有两种方法

  • 可以添加任意访问修饰符,因为 它的地位是成员

    • 成员内部类是外部类的一部分,这种嵌套关系使得外部类能够访问内部类的所有成员,包括私有成员
  • 外部类与成员内部类的成员重名时,匿名内部类的访问遵循就近原则,使用外部类.this.成员 访问外部成员

静态内部类(使用static修饰)

class Main{
  public static void main(String[] args){
    // 外部其它类访问静态内部类1
    Outer.Inner inner1 = new Outer.Inner();
    // 外部其它类访问静态内部类2
    Outer.Inner inner2 = new Outer.getInner();
    Outer.Inner inner3 = Outer.get_Inner();
  }
}

class Outer{
  private int n = 10;
  private static String name = "hello";
  
  static class Inner{
    public void say(){
      System.out.println(name);
    }
    public Inner getInner(){
      return new Inner();
    }
    public static Inner get_Inner(){
      return new Inner();
    }
  }
}
  • 作用域为整个类
  • 静态内部类 可以直接访问外部类的所有静态成员,包括私有的,但不能访问非静态成员
  • 外部类 访问 静态内部类 需要创建对象再访问
  • 外部其它类访问静态内部类 有两种方法
  • 可以添加任意访问修饰符,因为 它的地位是成员
  • 外部类与静态内部类的成员重名时,静态内部类的访问遵循就近原则,使用外部类.成员 访问外部静态成员

标签:Java,内部,void,成员,28,访问,Inner,public
From: https://www.cnblogs.com/wxrwajiez/p/18523930

相关文章

  • Java - 27 抽象类 + 接口
    Java抽象类+接口抽象类当父类的某些方法需要声明,但又不确定如何实现时(父类方法不确定性问题),可以将其声明为抽象方法,这个类就是抽象类publicabstractclassAnimal{abstractpublicvoideat();//抽象方法没有方法体}一般来说,抽象类会被继承,由其子类具体实现细节......
  • PowerShell 脚本(.ps1)、批处理文件(.bat)、VBScript(.vbs) 和 旧版 JavaScript(.js) 都可以在
    PowerShell脚本(.ps1)、批处理文件(.bat)、VBScript(.vbs)和旧版JavaScript(.js)都可以在Windows系统中运行,但它们的兼容性和支持范围有一定的差异,尤其是在不同的Windows版本上。下面是它们在Windows系统中支持的情况:1. PowerShell脚本(.ps1)兼容性: PowerShell是自Window......
  • 高级java每日一道面试题-2024年10月29日-JVM篇-简述分代垃圾回收器是怎么工作的?
    如果有遗漏,评论区告诉我进行补充面试官:简述分代垃圾回收器是怎么工作的?我回答:在Java高级面试中,分代垃圾回收器的工作原理是一个重要的考点。下面将详细解释分代垃圾回收器是如何工作的:分代垃圾回收器的基本概念分代垃圾回收器是一种基于对象生命周期的垃圾回收方......
  • 高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?
    如果有遗漏,评论区告诉我进行补充面试官:RabbitMQ的使用场景有哪些?我回答:RabbitMQ是一个开源的消息代理和队列服务器,它遵循高级消息队列协议(AMQP)。RabbitMQ的核心作用是作为应用程序之间的中介,实现异步消息传递。它可以帮助解耦系统组件、提供消息的持久化、支持消息......
  • Javaweb之servlet常见面试题
    目录什么是Servlet?解释请求转发forward()方法和请求重定向sendRedirect()方法的区别?什么是Session?Session的工作原理?什么是Session?Session的工作原理:Session的特点:说一说HttpServletRequest、ServletContex和HttpSesssion三个对象的作用域?解释下Servlet生命周期?JSP和S......
  • 283. 移动零
    题目自己写通过的:classSolution{public:voidmoveZeroes(vector<int>&nums){intslow=0,fast=0;while(fast<nums.size()){if(nums[slow]==0&&nums[fast]!=0){......
  • 国标GB28181公网平台EasyGBS国标GB28181软件构建标准化视频监控网络
    在当今的数字化时代,视频监控已成为公共安全、企事业单位等领域不可或缺的一部分。为了规范这一领域的信息传输、交换和控制,我国推出了GB/T28181标准,并在此基础上,国标GB28181公网平台EasyGBS以其丰富的视频能力和灵活的部署方式,为视频监控领域带来了诸多创新和便利。国标GB/T2......
  • 国标GB28181网页直播平台EasyGBS国标GB28181摄像机接入对接国标协议平台的全方案
    随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。国标GB28181协议作为我国制定的专门用于视频监控联网的协议标准,在这场技术变革中发挥了重要作用。而国标GB28181网页直播平台EasyGBS作为安防视频监控平台,通过与国标GB28181协议的对接,提供......
  • 基于JAVA的在线购物平台设计与实现-计算机毕设 附源码 26720
    基于JAVA的在线购物平台设计与实现摘要基于JAVA的在线购物平台设计与实现是一个涉及到软件开发和电子商务的综合课题。在这样的平台上,用户可以浏览商品、将商品加入购物车、进行下单购买等操作。为了实现这一功能,需要考虑到前后端的交互、数据库的设计、安全性和用户体......
  • 在Windows上同时运行多个java程序如何区分
    显示命令行后通过jar文件路径区别也可以通过内存大小来判定是哪个程序在服务中也能找到PID用*.bat来启动UdpListener8102效果,会在应用中显示用服务启动则在后台进程中显示 ......