面向对象编程:深入理解内部类与抽象类的使用

news2024/11/16 19:35:50

文章目录

  • 一、内部类使用:
    • 1.1 成员内部类:
      • 1.1.1 成员内部类的主要特点是:
    • 1.2 局部内部类:
      • 1.2.1 局部内部类的主要特点是:
      • 1.2.2 局部内部类通常用于以下情况:
    • 1.3 静态内部类:
      • 1.3.1 静态内部类的主要特点是:
      • 1.3.2 静态内部类通常用于以下情况:
    • 1.4 匿名内部类:
      • 1.4.1 实现接口:
      • 1.4.2 继承类:
  • 二、抽象类使用:
      • 在使用抽象类时,需要注意以下几点:

在这里插入图片描述

内部类和抽象类是Java中面向对象编程的重要特性,它们分别用于不同的场景和目的。

一、内部类使用:

内部类是定义在另一个类内部的类,它可以直接访问外部类的成员,并且可以起到一定的封装作用。内部类有以下几种类型:

1.1 成员内部类:

定义在类的成员位置,可以访问外部类的所有成员,包括私有成员。创建成员内部类的实例时,需要先创建外部类的实例,然后通过外部类的实例来创建内部类的实例。

成员内部类是定义在类的内部,并且直接在类中的成员位置上定义的类。它和普通成员变量和成员方法类似,可以访问外部类的成员,包括私有成员。成员内部类还可以使用外部类的引用OuterClass.this来访问外部类的实例。

以下是一个成员内部类的代码案例:

public class OuterClass {
    private int outerValue = 10;

    // 成员内部类
    public class InnerClass {
        private int innerValue = 20;

        public void display() {
            System.out.println("Outer value: " + outerValue);
            System.out.println("Inner value: " + innerValue);
        }
    }

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        OuterClass.InnerClass innerObj = outerObj.new InnerClass();

        innerObj.display();
    }
}

在上面的例子中,OuterClass是外部类,InnerClass是成员内部类。在main方法中,首先创建了外部类的实例outerObj,然后通过outerObj来创建内部类的实例innerObj,这就是成员内部类的使用方法。

1.1.1 成员内部类的主要特点是:

  • 可以直接访问外部类的成员,包括私有成员。
  • 成员内部类必须寄存在外部类的实例对象中,所以不能在没有外部类实例的情况下创建内部类的实例。

成员内部类通常用于以下情况:

  • 与外部类有密切关联,需要直接访问外部类的成员。
  • 需要创建多个相互独立的内部类对象,每个内部类对象都有自己的状态,但又共享外部类的数据。

需要注意的是,如果成员内部类不需要访问外部类的成员,可以将其定义为静态内部类,这样可以节省一些内存开销。静态内部类与外部类没有直接的关联,可以独立地创建对象。

1.2 局部内部类:

定义在方法或代码块内部,作用范围仅限于所在的方法或代码块内。局部内部类可以访问外部方法的参数和局部变量,但要求这些参数和变量必须是 final 或 effectively final 的。
局部内部类是定义在方法内部的类,只能在该方法内部使用,其作用域仅限于方法内部。局部内部类对于外部类以及其他方法是不可见的。

以下是一个局部内部类的代码案例:

public class OuterClass {
    private int outerValue = 10;

    public void outerMethod() {
        int localVar = 5;

        // 局部内部类
        class LocalInnerClass {
            public void display() {
                // 局部内部类可以访问外部类的实例变量和方法
                System.out.println("Outer value: " + outerValue);
                System.out.println("Local variable: " + localVar);
            }
        }

        // 创建局部内部类的实例,并调用其方法
        LocalInnerClass innerObj = new LocalInnerClass();
        innerObj.display();
    }

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        outerObj.outerMethod();
    }
}

在上面的例子中,OuterClass是外部类,在outerMethod方法内部定义了一个局部内部类LocalInnerClass。局部内部类LocalInnerClass只能在outerMethod方法内部使用。

1.2.1 局部内部类的主要特点是:

  • 定义在方法内部,只能在该方法内部使用,其作用域仅限于方法内部。
  • 局部内部类可以访问外部方法的局部变量以及外部类的实例变量和方法,但局部变量必须为finaleffectively final(即不可修改)。
  • 局部内部类对于外部类以及其他方法是不可见的,只能在定义它的方法内部使用。

1.2.2 局部内部类通常用于以下情况:

  • 当某个类的功能只在一个特定的方法内部使用,并且不希望该类对其他方法可见时,可以将其定义为局部内部类。
  • 局部内部类可以对代码进行更加细粒度的封装,提高代码的安全性和可读性。

总之,局部内部类适用于只在特定方法内部使用的情况,其作用域仅限于该方法内部。

1.3 静态内部类:

static 修饰的内部类,类似于一个普通的类,只是它被嵌套在其他类内部而已。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。

使用内部类的时候要根据实际需要选择不同的内部类类型。例如,如果内部类需要访问外部类的成员,可以使用成员内部类;如果内部类只在某个方法中使用,并且不需要访问外部类的非 final 变量,可以使用局部内部类;如果内部类不依赖外部类的实例,可以使用静态内部类。

静态内部类是定义在类的内部,并且被static关键字修饰的类。与成员内部类不同,静态内部类不依赖于外部类的实例,可以直接创建内部类的实例,而不需要先创建外部类的实例。

以下是一个静态内部类的代码案例:

public class OuterClass {
    private static int outerValue = 10;

    // 静态内部类
    public static class StaticInnerClass {
        private int innerValue = 20;

        public void display() {
            System.out.println("Outer value: " + outerValue);
            System.out.println("Inner value: " + innerValue);
        }
    }

    public static void main(String[] args) {
        // 创建静态内部类的实例,不需要先创建外部类的实例
        StaticInnerClass innerObj = new StaticInnerClass();
        innerObj.display();
    }
}

在上面的例子中,OuterClass是外部类,StaticInnerClass是静态内部类。在main方法中,直接创建了静态内部类的实例innerObj,无需先创建外部类的实例。

1.3.1 静态内部类的主要特点是:

  • 可以直接创建内部类的实例,无需先创建外部类的实例。
  • 静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。

1.3.2 静态内部类通常用于以下情况:

  • 当内部类不需要访问外部类的实例变量或方法时,可以将其定义为静态内部类,这样可以节省内存开销。
  • 静态内部类可以作为一个独立的类来使用,可以避免与外部类的实例耦合在一起。

总之,静态内部类适用于不需要访问外部类实例成员的情况,且它与外部类实例无关。

1.4 匿名内部类:

匿名内部类是一种特殊的内部类,它没有显式地定义一个类名,而是直接在使用的地方创建一个实例。通常情况下,使用匿名内部类可以简化代码,特别是在需要创建一个只用一次的类的情况下。

匿名内部类通常用于以下情况:

1.4.1 实现接口:

当需要创建一个实现某个接口的类的实例时,可以使用匿名内部类。例如:

interface MyInterface {
    void doSomething();
}

public class MyClass {
    public void methodWithInterface() {
        MyInterface myInterface = new MyInterface() {
            @Override
            public void doSomething() {
                System.out.println("Doing something...");
            }
        };
        myInterface.doSomething();
    }
}

1.4.2 继承类:

当需要创建一个继承自某个类的实例时,可以使用匿名内部类。例如:

class MyBaseClass {
    void display() {
        System.out.println("Base class method.");
    }
}

public class MyClass {
    public void methodWithInheritance() {
        MyBaseClass myBaseClass = new MyBaseClass() {
            @Override
            void display() {
                System.out.println("Overridden method.");
            }
        };
        myBaseClass.display();
    }
}

注意,在匿名内部类中,可以重写父类或接口的方法,并且可以添加其他方法和字段。匿名内部类的作用域仅限于创建它的代码块,通常在方法中使用。

虽然匿名内部类可以简化代码,但也有一些限制和注意事项:

  • 匿名内部类不能有构造方法,因为它没有类名,无法调用构造方法。
  • 匿名内部类只能使用一次,不能在其他地方再次使用。
  • 匿名内部类可以访问外部类的成员变量和方法,但要求这些成员变量和方法必须是 final 或 effectively final 的(Java 8 之后的版本)。

总体来说,匿名内部类是一种灵活且常用的编程技巧,适用于一些简单的类实现或临时的类需求,能够简化代码并增强代码的可读性。

在这里插入图片描述

二、抽象类使用:

抽象类是一种特殊的类,它不能被实例化,只能用作其他类的父类。抽象类中可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,必须在子类中进行重写实现。非抽象方法可以有具体实现,子类可以直接继承和使用。

使用抽象类的主要目的是为了实现代码的复用和扩展性。抽象类将一些通用的方法定义在其中,子类可以继承这些方法,并根据自己的特殊需求进行重写。抽象类还可以通过定义抽象方法来强制子类实现某些功能,这样可以保证子类都具有相同的接口,而具体实现则由子类自行决定。

在使用抽象类时,需要注意以下几点:

  • 抽象类不能被实例化,只能用作其他类的父类。

  • 子类必须实现抽象类中的所有抽象方法,除非子类也是抽象类。

  • 抽象类可以包含非抽象方法,子类可以继承和使用这些非抽象方法。

  • 一个类只能继承一个抽象类,但可以实现多个接口。

总体来说,内部类和抽象类是Java中重要的面向对象编程特性,它们都有自己的应用场景和优势。合理地使用内部类和抽象类可以提高代码的可读性、可维护性和扩展性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务01,初始,拥抱他,最后爱上他,mmm

俗话说乱花渐欲迷人眼,学习微服务应该从哪开始学呢 从这张表去学微服务 微服务全家桶:走进 Spring Cloud 的世界 了解 Spring Cloud 框架的功能定位,以及它和 Spring Boot 之 间的关系。除此之外,我还会详细讲解 Spring Cloud 的…

KMP算法的及其原理

KMP算法 首先 我们先了解一下 KMP算法的作用 str1 和str2 字符串 如果str1中包含str2 那么返回头位置 如果不包含返回-1 首先 我们先加入一个概念: 有一个next数组 next[i]的值为 str2 中 以i-1位置为结尾的字符串中 最长相同前缀后缀为多长(相同前缀后缀 不是对称 aba 中相…

数字化转型与百数低代码平台:创新商业模式的商机突破口

随着科技的不断进步和全球经济的快速发展,企业数字化转型已经成为当今商业领域的热门话题。 根据Gartner的《2023年度董事会调查》显示,数字化转型已然是当今企业商业战略的一大基石,中国有36%的企业将数字化转型作为企业最优先的业务。 这表…

windows环境下,安装elasticsearch

jdk ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持。 我下载了 elasticsearch-8.9.0-windows-x86_64.zip,带了OpenJDK。 ElasticSearch下载 https://www.elastic.co/downloads/elasticsearch 安装ElasticSearch 下载安装包后解压 修…

WMS仓储管理系统的建设理念包括哪些内容

WMS仓储管理系统是物流供应链管理领域中的重要组成部分,主要用于仓储过程的计划、控制和管理。WMS仓储管理系统解决方案可以有效协调人、设备和仓库资源,提高仓储效率、降低成本、确保准确性,为企业的物流运输及整个生产活动提供有力保障。那…

综合案例(面向对象)

使用面向对象思想完成数据读取和处理基于面向对象思想重新认知第三方库使用(PyEcharts) 数据分析案例 某公司,有2份数据文件,现需要对其进行分析处理,计算每日的销售额并以柱状图表的形式进行展示。 数据内容 综合案…

【Terraform学习】Terraform-docker部署快速入门(快速入门)

Terraform-docker部署快速入门 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中,单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分,为角色选择可信实体类型: AWS 服务 使用案例:EC2 单击下一步 添加权限&#x…

LeetCode面向运气之Javascript—第2600题-K件物品的最大和-94.68%

LeetCode第2600题-K件物品的最大和 题目要求 袋子中装有一些物品,每个物品上都标记着数字 1 、0 或 -1 。 四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。numNegOn…

【GitOps系列】使用 ArgoCD 快速打造GitOps工作流

文章目录 ArgoCD简介ArgoCD安装访问ArgoCDGitOps 工作流总览创建 ArgoCD 应用检查 ArgoCD 同步状态访问应用 连接 GitOps 工作流体验 GitOps 工作流生产建议1)修改默认密码2)配置 Ingress 和 TLS3)使用 Webhook 触发 ArgoCD4)将源…

【C++】开源:Boost网络库Asio配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次…

手机怎么把网址转二维码?网址活码手机端制作教学

相信很多小伙伴都知道电脑生成网址二维码方法,只需要利用二维码生成器(二维码生成器-手机二维码制作生成器-免费在线生成二维码-机智熊二维码)的网址生成二维码功能,就可以轻松将网址生成二维码。那么大家知道在手机上怎么操作吗&…

兴达易控CANopn 主站转 profinet 网关的网关配置及操作

兴达易控CANopn 主站转 profinet 网关(XD-COPNm20)做为 PROFINET 网络的 Device 设备(即从站),带 2 个 RJ45 以太网接口,支持100BASE-TX,MDI/MDIX 自检测,集成以太网交换机&#xff…

Jenkins 拉取 GitHub 私有仓库失败问题

添加仓库的时候提示 stderr: fatal: Cannot prompt because user interactivity has been disabled. 把在 GitHub账户设置中生成的个人访问令牌填到地址里

使用docker搭建nacos

使用docker搭建nacos docker搭建最新版nacosMySQL下简历nacos配置数据表拉取镜像创建挂载目录启动容器访问nacos docker搭建nacos 2.0版本 docker搭建最新版nacos 最近想在自己服务器上搭建一个nacos服务,以前一直在本地的windows上使用,而且使用着naco…

Rabbitmq的安装与使用(Linux版)

目录 Rabbitmq安装 1.在Ubuntu上安装RabbitMQ: 打开终端,运行以下命令以更新软件包列表: 安装RabbitMQ: 安装完成后,RabbitMQ服务会自动启动。你可以使用以下命令来检查RabbitMQ服务状态: 2.在CentOS…

湖南大学师生一行到访麒麟信安参观交流

7月6日下午,湖南大学信息科学与工程学院师生一行百余人到访麒麟信安参观交流。 在公司展厅,同学们详细了解了麒麟信安的发展历程、产业布局、生态圈建设等方面情况,观摩麒麟信安在国产操作系统等领域的各项研发成果,并参观了麒麟…

【数据结构】二叉树前中后层序遍历代码实现以及各种操作与二叉树OJ题目

目录 一、二叉树的遍历 1、前序遍历 2、后续遍历 3、中序遍历 二、二叉树简单的操作 1、计算节点个数 1.二叉树所有节点个数 2.二叉树叶子节点个数 3.二叉树第K层节点个数 2、二叉树的高度 3、二叉树是否存在key 1.二叉树中是否存在key 2.寻找二叉树中key节点 三、…

这些你值得拥有的音频转文字软件推荐给你

小明是一个音乐爱好者,他热爱听歌。然而,有一天,他突然失去了听力,这令他感到沮丧和无助,他再也无法知晓音乐的内容了。正当小明陷入困境时,他听说了一个神奇的技术——音频转文字。这项技术据说可以将音频…

Leetcode周赛 | 2023-7-24

2023-7-24 题1体会我的代码 题2这道题是一点都不会重点我的代码 题3重点我的代码 题二题三都不会621. 任务调度器思路 题1 体会 想到倒序遍历就可以。 我的代码 class Solution:def maxArrayValue(self, nums: List[int]) -> int:n len(nums)i n-1while i > 0 :if n…

CSS背景虚化

.mark{background-color: rgba(0,0,0,.1);-webkit-backdrop-filter: blur(3px);backdrop-filter: blur(3px); }backdrop-filter CSS 属性可以让你为一个元素后面区域添加图形效果(如模糊或颜色偏移)。 因为它适用于元素背后的所有元素,为了看…