news 2026/3/20 9:47:06

3.抽象类、接口、内部类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.抽象类、接口、内部类

抽象类、接口、内部类

一、抽象类

为子类提供一个通用的模版和框架,定义一些通用的逻辑或规范,同时允许子类根据需要实现具体功能。

1、抽象类不能被实例化。

2、抽象类应该至少有一个抽象方法,否则它没有任何意义。

3、抽象类中的抽象方法没有方法体。

4、抽象类的子类必须给出父类中的抽象方法的具体实现,除非该子类也是抽象类。

/* by yours.tools - online tools website : yours.tools/zh/dnsusa.html */ // 抽象类 Animal abstract class Animal { protected String name; // 构造方法 public Animal(String name) { this.name = name; } // 抽象方法:子类必须实现 public abstract void sound(); // 普通方法:所有子类共享 public void sleep() { System.out.println(name + " is sleeping."); } } // 子类 Dog 继承自 Animal class Dog extends Animal { // 构造方法 public Dog(String name) { super(name); } // 实现抽象方法 @Override public void sound() { System.out.println(name + " says: Woof!"); } } // 子类 Cat 继承自 Animal class Cat extends Animal { // 构造方法 public Cat(String name) { super(name); } // 实现抽象方法 @Override public void sound() { System.out.println(name + " says: Meow!"); } } // 测试类 Main public class Main { public static void main(String[] args) { // 创建 Dog 对象 Animal dog = new Dog("Buddy"); dog.sound(); // 输出:Buddy says: Woof! dog.sleep(); // 输出:Buddy is sleeping. System.out.println(); // 创建 Cat 对象 Animal cat = new Cat("Kitty"); cat.sound(); // 输出:Kitty says: Meow! cat.sleep(); // 输出:Kitty is sleeping. } }

二、接口

定义一组行为规范

  1. 接口通过抽象方法定义了一组行为规范,强制实现类实现这些方法

  2. 一个类可以实现多个接口,从而表现出多种行为

  3. 字段默认是public static final,用于定义全局常量

  4. 表示can do what

  5. 如果一个类实现的多个接口中有同名的默认方法,需要手动解决冲突

    /* by yours.tools - online tools website : yours.tools/zh/dnsusa.html */ // 定义接口 Flyable interface Flyable { // 静态常量(全局常量) int MAX_SPEED = 1000; // 默认是 public static final // 抽象方法:所有实现类必须实现 void fly(); // 默认方法(Java 8 引入):提供默认实现 default void land() { System.out.println("Landing..."); } // 静态方法(Java 8 引入):通过接口名调用 static void info() { System.out.println("This is the Flyable interface."); } } // 实现类 Bird class Bird implements Flyable { private String name; public Bird(String name) { this.name = name; } @Override public void fly() { System.out.println(name + " is flying in the sky with a max speed of " + Flyable.MAX_SPEED + " km/h."); } @Override public void land() { System.out.println(name + " is landing gracefully."); } } // 实现类 Airplane class Airplane implements Flyable { private String model; public Airplane(String model) { this.model = model; } @Override public void fly() { System.out.println(model + " is flying at high altitude with a max speed of " + Flyable.MAX_SPEED + " km/h."); } } // 测试类 Main public class Main { public static void main(String[] args) { // 调用静态方法 Flyable.info(); // 输出:This is the Flyable interface. // 访问静态变量 System.out.println("Max speed for all Flyable objects: " + Flyable.MAX_SPEED + " km/h."); System.out.println(); // 创建 Bird 对象 Flyable bird = new Bird("Sparrow"); bird.fly(); // 输出:Sparrow is flying in the sky with a max speed of 1000 km/h. bird.land(); // 输出:Sparrow is landing gracefully. System.out.println(bird.MAX_SPEED + " km/h."); //1000 km/h -> 这种写法不会报错,但它实际上是 语法糖 ,编译器会自动将其转换为通过接口名访问的形式: System.out.println(Flyable.MAX_SPEED + " km/h."); System.out.println(); // 创建 Airplane 对象 Flyable airplane = new Airplane("Boeing 747"); airplane.fly(); // 输出:Boeing 747 is flying at high altitude with a max speed of 1000 km/h. airplane.land(); // 输出:Landing...(使用默认实现) } }

三、抽象类和接口的区别

特性接口抽象类
定义方式使用interface关键字定义使用abstract关键字定义
成员变量只能是public static final可以是普通变量或静态变量
构造器不允许定义构造器可以定义构造器
多重继承支持多重实现不支持多重继承
设计目的定义行为规范(can-do)定义通用结构(is-a)

四、内部类

根据自己想限定的作用范围,来决定使用哪种。

  • 成员内部类
  • 静态嵌套类
  • 局部内部类
  • 匿名内部类-> 就是没有名字的类
public class Main { // 成员内部类(非静态) class MemberInnerClass { public void display() { System.out.println("This is a member inner class."); } } // 静态嵌套类 static class StaticNestedClass { public void display() { System.out.println("This is a static nested class."); } } // 外部类方法 public void createLocalAndAnonymousClasses() { // 局部内部类 class LocalInnerClass { public void display() { System.out.println("This is a local inner class."); } } // 创建局部内部类对象并调用方法 LocalInnerClass localInner = new LocalInnerClass(); localInner.display(); // 匿名内部类 Runnable anonymousInner = new Runnable() { @Override public void run() { System.out.println("This is an anonymous inner class."); } }; // 调用匿名内部类的方法 anonymousInner.run(); } // 测试主方法 public static void main(String[] args) { // 创建外部类对象 Main outer = new Main(); // 创建成员内部类对象并调用方法 Main.MemberInnerClass memberInner = outer.new MemberInnerClass(); memberInner.display(); // 创建静态嵌套类对象并调用方法 Main.StaticNestedClass staticNested = new Main.StaticNestedClass(); staticNested.display(); // 调用方法以创建局部内部类和匿名内部类 outer.createLocalAndAnonymousClasses(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/17 13:16:09

UniEdit:首个大型开放域大模型知识编辑基准

随着大语言模型(LLM)的广泛应用,它们在医疗、金融、教育等关键行业扮演着愈发重要的角色。然而,一个被忽视的现实是:大模型的知识并不会自动更新,更不总是准确。当模型输出过时信息、错误事实甚至自信满满的…

作者头像 李华
网站建设 2026/3/17 6:39:31

GitHub项目推荐:基于Qwen3-VL-8B开发的开源图像描述器

基于Qwen3-VL-8B的开源图像描述器:轻量级多模态落地新选择 在电商后台自动为商品图生成文案、客服系统读懂用户上传的报错截图、内容平台快速识别潜在违规画面——这些曾被视为“高阶AI能力”的场景,如今正随着轻量级多模态模型的成熟变得触手可及。过去…

作者头像 李华
网站建设 2026/3/18 8:53:18

告别论文焦虑!2025年一大AI论文神器实测报告(附教程)_aibijiang 论文

熬夜、秃头、颈椎疼,还要被导师追着问进度——这大概就是每个大学生写论文时的真实写照。 曾几何时,一篇论文从开题到完成,花费数月甚至一两年都是常事。 而今天,一切都变了。竟然真的有人能在几天之内完成一篇高质量的学术论文…

作者头像 李华
网站建设 2026/3/17 1:01:26

WordPress myCred插件关键权限缺失漏洞:CVE-2025-12362技术分析

CVE-2025-12362: myCred WordPress插件中的CWE-862权限缺失漏洞 严重性:中等 类型:漏洞 CVE编号: CVE-2025-12362 漏洞描述 WordPress的“myCred – 用于游戏化、等级、徽章和忠诚度计划的积分管理系统”插件在2.9.7及之前的所有版本中存在“…

作者头像 李华
网站建设 2026/3/5 3:33:17

当生成式AI成为逆向工程的加速器:揭秘XLoader恶意软件分析

以快制快:利用生成式AI加速逆向工程XLoader 2025年11月3日 研究作者: Alexey Bukhteyev 核心要点 XLoader 仍是目前最难分析的恶意软件家族之一。其代码仅在运行时解密,并受多层加密保护,每一层都使用隐藏在二进制文件不同位置的密钥。即使是…

作者头像 李华
网站建设 2026/3/13 3:11:26

Wireshark 4.6.2 发布:修复两处安全漏洞,关键网络分析工具迎来重要更新

技术摘要 Wireshark 4.6.2 是一个维护版本,修复了两个安全漏洞和五个错误。尽管提供的资料未详细说明漏洞的具体性质,但中等严重性评级表明,它们可能在中等程度上影响机密性、完整性或可用性。此次更新还更改了 Windows 安装程序的打包方式&a…

作者头像 李华