【Java】Java中接口与内部类详解

news2024/11/20 23:27:25

目录

引言

一、接口(Interface)

1.1 接口的定义

1.1.1 接口的特点

1.2 接口的实现

1.3 接口的继承

1.4 接口的注意事项

1.5 代码示例 

二、内部类(Inner Class)

2.1 内部类特点 

2.2 成员内部类

2.2.1 对象的创建

2.3 静态内部类

2.3.1 对象的创建

2.4 局部内部类

2.5 匿名内部类

2.5.1 格式

2.5.2 代码示例

结语


引言

在Java中,接口(Interface)和内部类(Inner Class)是两个非常重要的概念,它们在面向对象编程中扮演着关键角色。本文将详细解析Java中的接口和内部类,并通过代码示例进行说明。


一、接口(Interface)

接口是一种引用类型,是Java实现多继承的一种机制。它定义了一组方法规范,但不提供这些方法的具体实现。接口中的方法默认是public abstract的,即公开的、抽象的。接口主要用于定义对象的行为,而不是实现这些行为。


1.1 接口的定义

接口使用interface关键字来定义,其基本语法如下:

public interface InterfaceName {  
    // 常量定义  
    public static final int CONSTANT = 10;  
  
    // 抽象方法定义  
    void method1();  
    void method2();  
  
    // Java 8+ 默认方法  
    default void defaultMethod() {  
        // 默认实现  
    }  
  
    // Java 8+ 静态方法  
    static void staticMethod() {  
        // 静态实现  
    }  
}

1.1.1 接口的特点

①成员变量

        只能是常量

        默认修饰符:public static final

②构造方法

        没有

③成员方法 

        默认是抽象方法

        默认修饰符:public abstract

        JDK7以前:接口中只能定义抽象方法

        JDK8的新特性:接口中可以定义有方法体的方法(默认方法:关键字default修饰)

        JDK9的新特性:接口中可以定义私有方法 


1.2 接口的实现

类通过implements关键字来实现接口,并实现接口中定义的所有抽象方法。如果类没有实现接口中的所有方法,则该类必须声明为抽象类。

public class ClassName implements InterfaceName {  
    @Override  
    public void method1() {  
        // 实现方法1  
    }  
  
    @Override  
    public void method2() {  
        // 实现方法2  
    }  
}

1.3 接口的继承

接口可以继承其他接口,使用extends关键字。一个接口可以继承多个接口,这是Java实现多继承的主要方式。

public interface InterfaceA {  
    void methodA();  
}  
  
public interface InterfaceB extends InterfaceA {  
    void methodB();  
}  
  
public class ClassC implements InterfaceB {  
    @Override  
    public void methodA() {  
        // 实现方法A  
    }  
  
    @Override  
    public void methodB() {  
        // 实现方法B  
    }  
}

1.4 接口的注意事项

  • 接口不能被实例化。
  • 接口中的方法默认是public abstract的,可以省略public abstract修饰符。
  • 接口中的变量默认是public static final的,即常量。
  • 一个类可以实现多个接口。
  • 接口之间可以单继承,也可以多继承。
  • 多个接口里面有重名的方法,只需重写一次即可
  • 接口与类之间是实现关系,通过implements关键字表示

1.5 代码示例 

public interface Animal {  
    void eat();  
    void sleep();  
}  
  
public class Dog implements Animal {  
    @Override  
    public void eat() {  
        System.out.println("Dog is eating.");  
    }  
  
    @Override  
    public void sleep() {  
        System.out.println("Dog is sleeping.");  
    }  
}  
  
public class Test {  
    public static void main(String[] args) {  
        Animal myDog = new Dog();  
        myDog.eat();  
        myDog.sleep();  
    }  
}

二、内部类(Inner Class)

内部类是在一个类的内部定义的类。内部类可以访问外部类的所有成员(包括私有成员),而外部类则不能直接访问内部类的成员,除非通过内部类的对象。内部类主要有四种类型:成员内部类、静态内部类、局部内部类和匿名内部类。


2.1 内部类特点 

访问特点:

①内部类可以直接访问外部类成员,包括私有。

②外部类要访问内部类的成员,必须创建对象 。


2.2 成员内部类

成员内部类定义在外部类的成员位置,可以访问外部类的所有成员(包括私有成员)。

public class OuterClass {  
    private int outerVar = 10;  
  
    public class InnerClass {  
        public void display() {  
            System.out.println("OuterVar = " + outerVar);  
        }  
    }  
  
    public InnerClass getInnerClassInstance() {  
        return new InnerClass();  
    }  
}  
  
public class Test {  
    public static void main(String[] args) {  
        OuterClass outer = new OuterClass();  
        OuterClass.InnerClass inner = outer.getInnerClassInstance();  
        inner.display();  
    }  
}

问题:当有多个同名变量时,代码中的__中填写什么才能打印以下结果?

class Outer
{
    private int num = 1;
    private class Inner
    {
        private int num = 2;
        public void show()
        {
            int num = 3;
            System.out.println(__); // 3
            System.out.println(__); // 2
            System.out.println(__); // 1
        }
    }
}
            

①打印3可以十分简单,根据就近原则,直接填入num即可

②类中都有一个this, 可以通过this.num去访问外部类的num,打印2

③内部类中访问外部类的同名成员变量,需要借助外部类名.this去访问,即可打印1


2.2.1 对象的创建

①当成员内部类被private修饰时:

        在外部类编写方法,对外提供内部类对象

②当成员内部类被非private修士时:

        直接创建对象

        语法:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();


2.3 静态内部类

静态内部类使用static修饰符定义,可以通过外部类名直接访问,但它不能访问外部类的非静态成员。

public class OuterClass {  
    private static int outerVar = 10;  
  
    public static class StaticInnerClass {  
        public void display() {  
            System.out.println("OuterVar = " + outerVar);  
        }  
    }  
}  
  
public class Test {  
    public static void main(String[] args) {  
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();  
        inner.display();  
    }  
}

2.3.1 对象的创建

创建静态内部类的格式:

        外部类名.内部类名 对象名 = 外部类名.内部类名();


2.4 局部内部类

局部内部类定义在外部类的方法内部,其作用域仅限于该方法内部。

public class OuterClass {  
    public void method() {  
        class LocalInnerClass {  
            public void display() {  
                System.out.println("This is a local inner class.");  
            }  
        }  
  
        LocalInnerClass inner = new LocalInnerClass();  
        inner.display();  
    }  
}  
  
// 注意:由于LocalInnerClass是局部内部类,它不能在method方法外部被访问。

2.5 匿名内部类

匿名内部类是没有类名的内部类,通常用于实现接口或继承其他类,并立即创建该类的实例。


2.5.1 格式
new 类名或接口名(){
    重写方法;
}

①实现/继承关系

②方法重写

③创建对象 


2.5.2 代码示例
public interface HelloWorld {  
    void greet();  
}  
  
public class Test {  
    public static void main(String[] args) {  
        HelloWorld greeting = new HelloWorld() {  
            @Override  
            public void greet() {  
                System.out.println("Hello, World!");  
            }  
        };  
  
        greeting.greet();  
    }  
}

结语

接口和内部类是Java中非常重要的概念。接口定义了一组规范,用于实现多继承,而内部类则提供了一种将类定义在另一个类内部的方式,增强了代码的封装性和可读性。通过接口和内部类的使用,Java程序员可以编写出更加灵活、可维护的代码。

 

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

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

相关文章

基于SpringBoot社区疫情信息管理系统的设计和实现

文未可获取一份本项目的java源码和数据库参考。 选题的意义 保护好人民群众的基本安全,贯彻党的领导下中国一盘棋的基本准则。将病毒隔绝在外,信息系统的存在显得至关重要,应对新型冠状病毒肺炎疫情治理的实践背景。实时关注更新疫情动态&a…

开放式耳机哪个牌子的质量好?2024开放式蓝牙耳机排行榜前5强推荐!

​开放式耳机因其舒适的佩戴感和较小的耳朵损伤而广受好评。曾经让人头疼的漏音问题,随着科技的进步,已经有了显著改善,不再是个大问题。在拥挤的环境中,耳机音量过大不仅会打扰他人,也会让自己感到不适。因此&#xf…

双十一买什么?高性价比数码好物来袭,不心动都难!

​每年的双十一都是一场购物的狂欢盛宴,众多数码好物纷纷推出诱人的折扣。在这琳琅满目的数码产品中,电容笔无疑是一颗格外耀眼的 “星”。无论是学生党用于记录课堂笔记、撰写论文,还是绘画爱好者进行艺术创作、灵感挥洒,电容笔都…

linux -L16-linux 查看应用占用的资源top

linux 查看应用占用的资源top Targetsteps启动 top 命令排序进程:查看特定进程:过滤进程其他常用选项交互式帮助 Target linux 查看应用占用的资源top steps 在 Linux 系统中,top 命令是一个非常有用的工具,它提供了一个实时更…

springframework Ordered接口学习

Ordered接口介绍 完整路径: org.springframework.core.Ordered Ordered 接口是 Spring 框架中的一个核心接口,用于定义对象的顺序。这个接口通常用于需要排序的组件,例如 Spring 中的 Bean、过滤器(Filters)、拦截器…

SUSCTF2024-Redroid-出题笔记与解题思路

SUSCTF2024-Redroid-出题笔记与解题思路 Step1Step2Step3Step4 描述:题目要求使用安卓13/14系统真机 Step1 Java层的逻辑比较简单,两个Activity MainActivity读并验证password,正确即进入CheckActivity,同时会传递password pass…

铝壳电阻与普通电阻有什么区别?

铝壳电阻和普通电阻是电子元件中常见的两种电阻类型,它们在结构和性能上有一定的区别。铝壳电阻是具有金属外壳的电阻器,其外壳通常由铝合金制成,具有良好的散热性能。而普通电阻则没有金属外壳,只有一层绝缘材料包裹着电阻丝。 …

软件设计之JavaWeb(8)

软件设计之JavaWeb(8) 此篇应在MySQL之后进行学习: 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷全新JavaWeb教程,企业主流javaweb技术栈 资料可以去尚硅谷官网免费领取 此章节最好学完JDBC观看 学习内容: promiseA…

力扣面试经典150题——合并两个有序数组

目录 题目链接: 题目描述 示例 提示: 解法一:合并数组排序 Java写法: 运行时间 C写法: 运行时间 时间复杂度和空间复杂度 解法二:双指针 Java写法: 运行时间 C写法: 运…

新闻文本分类识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+TensorFlow+Django网页界面

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集(“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”),然…

024.PL-SQL进阶—游标

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址:STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

黄奕前夫勇夺“全球金融圈奥斯卡”!与她离婚后,姜凯身价涨30倍

黄奕前夫勇夺“全球金融圈奥斯卡”!与她离婚后,姜凯身价涨30倍 近日,小编被一则经济类新闻吸引。姜凯主理的凯资本Kai Capital荣获“2024年度全球最佳多策略对冲基金”。 这不是演员黄奕的第一任丈夫姜凯吗? 这个奖项可不一般。…

Ubuntu LLaMA-Factory实战

一、Ubuntu LLaMA-Factory实战安装: CUDA 安装 CUDA 是由 NVIDIA 创建的一个并行计算平台和编程模型,它让开发者可以使用 NVIDIA 的 GPU 进行高性能的并行计算。 首先,在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CU…

html TAB切换按钮变色、自动生成table--使用函数优化结构

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

怎么制作线上报名表_解锁报名新体验

在这个数字化飞速发展的时代&#xff0c;每一次活动的举办都力求高效、便捷与个性化。线上报名表&#xff0c;作为连接主办方与参与者的桥梁&#xff0c;其重要性不言而喻。它不仅是信息收集的工具&#xff0c;更是品牌形象的展示窗口&#xff0c;能够直接影响参与者对活动的第…

用最新的C++技术,如何实现一个序列化工具库?

在现代C的发展中&#xff0c;新引入的语言特性为高效且易用的序列化和反序列化库的开发提供了强大的支持。我们今天一起来探索如何在现代C特性下写出更简洁、更易维护的序列化工具代码。 现有序列化库的挑战 传统的C序列化库&#xff0c;如Boost.Serialization和Cereal&#…

神经网络(四):UNet语义分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…

Redis的数据类型常用命令

目录 前言 String字符串 常见命令 set get mget mset setnx incr incrby decr decyby append Hash哈希 常见命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx List 列表 常见命令 lpush lrange lpushx rpush rpushhx lpop…