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

目录

引言

一、接口(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(__); // 3System.out.println(__); // 2System.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.mzph.cn/bicheng/54731.shtml

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

相关文章

红外热成像应用场景!

1. 电力行业 设备故障检测:红外热成像仪能够检测电气设备(如变压器、电线接头)的过热现象,及时发现并定位故障点,预防火灾等安全事故的发生。 水电站查漏:在水电站中,红外热成像仪可用于快速查…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多,未必需要理解语言 统计语言模型发展史 统计语言模型: 判断一个句子是否合理,就计算这个句子会出现的概率 缺点是句子越长越…

掌握Python办公自动化,轻松成为职场高效达人

大家好,今天我们来聊聊为什么要学习和了解Python办公自动化? "自动化应用于高效运营将提高效率" ——比尔盖茨 在日常的工作中,存在很多重复性、规律性的工作。虽然现在有很多办公软件能够在一些方面提高工作效率,但无法…

基于FPGA+GPU异构平台的遥感图像切片解决方案

随着遥感和成像技术的不断进步和普及,获取大量高分辨率的遥感图像已成为可能。这些大规模的遥感图像数据需要进行有效的处理和分析,以提取有用的信息,进行进一步的应用。遥感图像切片技术应运而生,该技术可以将大型遥感图像分割成…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一,PyQt5 是 Python 绑定 QT5 应用的框…

增强GPT4v的Grounding能力,video-level

开源链接: appletea233/AL-Ref-SAM2: AL-Ref-SAM 2: Unleashing the Temporal-Spatial Reasoning Capacity of GPT for Training-Free Audio and Language Referenced Video Object Segmentation (github.com) In this project, we propose an Audio-Language-Refe…

手写数字识别案例分析(torch,深度学习入门)

在人工智能和机器学习的广阔领域中,手写数字识别是一个经典的入门级问题,它不仅能够帮助我们理解深度学习的基本原理,还能作为实践编程和模型训练的良好起点。本文将带您踏上手写数字识别的深度学习之旅,从数据集介绍、模型构建到…

vue Echart使用

一、在vue中使用Echarts 1.安装Echarts npm install echarts --save2.准备一个呈现图表的盒子 给盒子起名字是建议使用id选择器 这个盒子通常来说就是我们熟悉的 div &#xff0c;这个 div 决定了图表显示在哪里&#xff0c;盒子一定要指定宽和高 <div id"main&quo…

性能测试问题诊断-接口耗时高

问题现象&#xff1a;近期发现每晚跑的定时压测任务&#xff0c;压测结果中&#xff0c;各接口耗时变高&#xff08;原来99耗时<3秒&#xff0c;当前99耗时>20秒)。 问题排查&#xff1a; 查看jmeter 生成的结果图&#xff0c;发现压测2分钟后出现接口耗时变高情况。如下…

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

&#x1f310; 【ShuQiHere】 数据挖掘&#xff08;Data Mining, DM&#xff09; 是一种从大型数据集中提取有用信息的技术&#xff0c;无论是在商业分析、金融预测&#xff0c;还是医学研究中&#xff0c;数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…

如何快速上手一个Github的开源项目

程序研发领域正是有一些热衷开源的小伙伴&#xff0c;技能迭代才能如此的迅速&#xff0c;因此&#xff0c;快速上手一个GitHub上的开源项目&#xff0c;基本上已经变成很个程序员小伙伴必须掌握的技能&#xff0c;因为终究你会应用到其中的一个或多个项目&#xff0c;帮助自己…

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换&#xff0c;报文交换&#xff0c;分组交换&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 &#x1f3af;一.划分…

【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】

卸载 MySQL 参考文章&#xff1a; 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd &#xff0c;切换到 MySQL 安装目录的 bin 文件夹下&#xff0c;执行如下命令&#xff0c;删除 MySQL 服务mys…

Blender软件三大渲染器Eevee、Cycles、Workbench对比解析

Blender 是一款强大的开源3D制作平台&#xff0c;提供了从建模、雕刻、动画到渲染、后期制作的一整套工具&#xff0c;广泛应用于电影、游戏、建筑、艺术等领域。 渲染101云渲染云渲6666 相比于其他平台&#xff0c;如 Autodesk Maya、3ds Max 或 Cinema 4D&#xff0c;Blende…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

C++ 进阶之路:非类型模板参数、模板特化与分离编译详解

目录 非类型模版参数 类型模板参数 非类型模板参数 非类型模板参数的使用 模板的特化 函数模板的特化 类模板的特化 全特化与偏特化 偏特化的其它情况 模板的分离编译 什么是分离编译 为什么要分离编译 为什么模板不能分离编译 普通的类和函数都是可以分离编译的…

【学习笔记】数据结构(六 ①)

树和二叉树 &#xff08;一&#xff09; 文章目录 树和二叉树 &#xff08;一&#xff09;6.1 树(Tree)的定义和基本术语6.2 二叉树6.2.1 二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树&#xff08;AVL树&#xff09;6、红黑树 6.2.2 二叉树的性质6.…

通用大模型 vs 垂直大模型:谁将赢得AI战场?

引言 在人工智能领域&#xff0c;大模型的快速发展引发了广泛的关注和讨论。大模型&#xff0c;尤其是基于深度学习和海量数据训练的模型&#xff0c;已经在多个领域展现出强大的能力。从自然语言处理、图像识别到自动驾驶和医疗诊断&#xff0c;AI大模型正深刻改变着我们的生…

基于二自由度汽车模型的汽车质心侧偏角估计

一、质心侧偏角介绍 在车辆坐标系中&#xff0c;质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示&#xff0c;u为车辆前进方向&#xff0c;v为质心速度方向&#xff0c;u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点&#xff1a; 1、稳定性…

SVN笔记-SVN安装

SVN笔记-SVN安装 1、在windows下安装 SVN 1、准备svn的安装文件 下载地址&#xff1a;https://sourceforge.net/projects/win32svn/ 2、下载完成后&#xff0c;在相应的盘符中会有一个Setup-Subversion-1.8.17.msi的文件&#xff0c;目前最新的版本是1.8.17&#xff0c; 这里…