首页 > 其他分享 >6.3 内部类

6.3 内部类

时间:2024-11-28 12:05:03浏览次数:6  
标签:内部 int void public 6.3 new class


内部类(inner class)是定义在另一个类中的类。
使用内部类的原因 :

  • 内部类可以对同一个包中的其他类隐藏。
  • 内部类方法可以访问定义在这个类的作用域中的数据,包括原本私有的数据。
    在Java中内部类的对象有一个隐式的引用,指向实例化这个类的外部对象。通过这个指针它可以访问外部类的全部状态。
    但静态内部类没有附加这个指针。

6.3.1 使用内部类访问对象状态


可以使用内部类访问外部类的字段及方法

package innerClass;  
  
  
public class Test02 {  
    private int age = 10;  
    public void h() {  
        System.out.println("haha");  
    }  
    public class Inner {  
        public void m() {  
	        // Test02.this 得到外部类的引用
            System.out.println(Test02.this.age);  
            Test02.this.h();  
        }  
    }  
    public static void main(String[] args) {  
        Test02 test02 = new Test02();  
        Inner inner = test02.new Inner();  
        inner.m();  
    }  
}

6.3.2 内部类的特殊语法规则


在内部类中使用外部类引用 : OuterClass.this

在Java中,当你创建一个外部类的对象时,内部类的对象并不会自动创建。外部类和内部类是独立的实体,它们的生命周期和创建方式是分开的。

通过外部类创建一个内部类 : new OutClass().new InnerClass()
静态内部类可以脱离外部类直接创建 : new OutClass.InnerClass()

6.3.3 内部类是否有用,必要和安全


内部类是一个编译器现象,与虚拟机无关。编译器将内部类转换为常规的类文件,用$分隔外部类名与内部类名,而虚拟机对此一无所知。

6.3.4 局部内部类


局部内部类被定义在方法的内部。
声明局部内部类时不能有访问修饰符(public或private)
局部类的作用域被限定在声明这个局部类的块中。

6.3.5 由外部方法访问变量


局部类不仅能够访问外部变量,也能访问局部变量,但那些局部变量必须是实际最终变量(effectively final)

package innerClass;  
  
public class OutClass02 {  
    public void f() {  
        String text = "hello";  
        class InnerClass02 {  
            public void m() {  
                System.out.println(text);  
            }  
        }  
        InnerClass02 class02 = new InnerClass02();  
        class02.m();  
    }  
    public static void main(String[] args) {  
        new OutClass02().f();  
    }  
}

6.3.6 匿名内部类


如果只是想创建一个类甚至不需要给这个类取名字,这种类叫匿名内部类(anonymous inner class),匿名内部类通常与接口一起使用。

由于构造器名必须和类名保持一致,但匿名内部类没有类名,所以匿名内部类没有构造器,但它当扩展一个类时还是可以调用父类的构造器。

虽然匿名内部类没有构造器,但他可以有对象初始化块

这里还有一个小技巧,用于初始化数组或列表

package anonymousInnerClass;  
  
import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  
  
public class Test01 {  
  
    public static void f(List<String> list) {  
        list.stream().forEach(System.out::println);  
    }  
  
    public static void main(String[] args) {  
        List<String> list = Arrays.asList("abc", "efg");  
        f(list);  
		 // 双括号初始化 (double brace initialization)
		f(new ArrayList<String>() {{  
            add("abc");  
            add("efg");
        }});  
    }  
}

在匿名内部类中获得外部类

package anonymousInnerClass;  
  
import java.util.ArrayList;  
  
public class Test02 {  
    public static void main(String[] args) {  
        System.out.println(new ArrayList() {  
        }.getClass().getEnclosingClass().getName());  
    }  
}

6.3.7 静态内部类


有时候使用内部类只是想把类隐藏在另一个类的内部,并不需要内部类有外部类的引用,此时可以将类声明成static,这样就不会产生那个引用了。

package anonymousInnerClass;  
  
import innerClass.Test02;  
  
import java.util.Arrays;  
  
public class Test03 {  
    public static class Pair {  
        private int first;  
        private int second;  
  
        public Pair(int first, int second) {  
            this.first = first;  
            this.second = second;  
        }  
  
        public int getFirst() {  
            return first;  
        }  
  
        public int getSecond() {  
            return second;  
        }  
    }  
  
    public static Pair find(int ...numbers) {  
        int max, min;  
        max = min = numbers[0];  
        for (int i = 1; i < numbers.length; i++) {  
            max = Math.max(max, numbers[i]);  
            min = Math.min(min, numbers[i]);  
        }  
        return new Pair(max, min);  
    }  
  
    public static void main(String[] args) {  
        Test03.Pair pair = find(1, 2, 4);  
        System.out.println(pair.getFirst());  
        System.out.println(pair.getSecond());  
    }  
}

只要内部类不需要访问外围对象,就应该使用静态内部类。有人也称其为嵌套类(nested class)表示静态内部类。

标签:内部,int,void,public,6.3,new,class
From: https://blog.csdn.net/StarPlatinum2/article/details/144107519

相关文章

  • 《民用建筑隔声设计规范》(GB 50118-2010)是中华人民共和国的国家标准,旨在指导民用建筑
    《民用建筑隔声设计规范》(GB50118-2010)是中华人民共和国的国家标准,旨在指导民用建筑的隔声设计,以确保建筑内部的居住和工作环境具备良好的声学条件,减少外界噪声干扰,提升建筑的舒适性与安全性。规范概述:标准编号:GB50118-2010发布单位:中华人民共和国住房和城乡建设部发布日期:201......
  • react父组件调用子组件内部的dom或方法
    在React中,通过 React.forwardRef 和 useImperativeHandle 可以实现将父组件的 ref 转发给子组件,从而引用子组件的DOM或方法。以下是实现的步骤和代码示例:importReact,{forwardRef,useImperativeHandle,useRef}from"react";constChild=forwardRef((props,......
  • 中断的压栈操作、中断内部不可以有延时的动作?
    中断与压栈操作1.中断时的压栈操作当一个中断发生时,处理器会自动保存当前的状态(即上下文),以确保中断处理完成后能够恢复到中断发生前的状态。这些状态通常包括程序计数器(PC)、状态寄存器、通用寄存器等。具体过程:程序计数器(PC):保存当前执行的指令地址。当中断发生时,处理器会将当......
  • 驱动开发系列28 - Linux Graphics DRM代码分析 - 内部机制
    一:概述       本文介绍DRM的内部机制,这些特性与驱动程序作者和为现有驱动程序添加新功能的开发人员息息相关。       首先,我们将介绍一些典型的驱动程序初始化要求,如设置命令缓冲区,创建初始化输出配置和初始化核心服务。随后将更详细介绍核心内部结构,并提供......
  • 阿里内部高并发优化实操手册流出;网友:这才是真正的技术实力
    前言学习本文之前,先问大家几个问题:并发编程对于很多人说都是比较难的,总是出现一些莫名其妙的bug,让我们很是苦恼,那么他到底是难在哪里呢?很多人对并发的学习,主要是通过看视频和博客进行的,知识体系不够系统,为了更好地应对接下来的工作,谨以从并发编程开始,接入高并发知识来系统地......
  • Day37--N种内部类
    Day37--N种内部类内部类内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。成员内部类静态内部类局部内部类匿名内部类示例:创建外部类Outer,并设置属性privateintid;方法publicvoidout......
  • Java面向对象:内部类(INNER CLASS)
    内部类(InnerClass)是Java中的一种特殊类,它定义在另一个类的内部。内部类可以访问其外部类的成员变量和方法,包括私有成员。这使得内部类非常适合用于封装与外部类紧密相关的逻辑。下面是一个关于内部类的示例代码及其解释:publicclassOuterClass{privateStringouterF......
  • 10108-机械手柔性生产线物料分拣控制系统设计(说明书+设计资料源文件+运行软件+PLC组态
    10108-机械手柔性生产线物料分拣控制系统设计(说明书+设计资料源文件+运行软件+PLC组态王仿真+PPT)功能描述:机械手臂的应用主要是由内部执行机构驱动器以及内部电气控制设备组合而成。通过气动设备来实现机械手的快速精确运转,来保证货物可以被有效的抓取和移动。在机械手的......
  • PHP 正则表达式 修正符【m s x e ? (?i)】内部修正符 贪婪模式 后向引用 断言【总结篇
    1.正则表达式修正符在PHP中,正则表达式中的修正符(modifier)可以改变模式的行为,使得其功能更加灵活。1.m修正符(多行模式)作用:在多行模式下,^和$元字符除了匹配整个字符串的开头和结尾外,还可以匹配每一行的开头和结尾。举例: "Hello\nWorld",当使用/^World/m时,^会匹配"W......
  • 最新版今日头条独家内部玩法,单号轻松简单日入2张
    今日头条作为流行的新闻和内容平台,为内容创作者提供了一个展示和盈利的机会。本文档详细介绍了利用特定工具在今日头条上进行文章创作的流程和优势。项目背景随着移动互联网的普及,越来越多的用户通过手机应用获取信息。今日头条凭借其算法推荐系统,成为用户获取信息的重......