Java学习笔记(16)--面向对象编程

embedded/2024/12/26 12:26:17/

学习资料来自接口 - Java教程 - 廖雪峰的官方网站

面向对象基础

目录

面向对象基础

接口

定义

术语

接口继承

继承关系

default方法

default方法和抽象类的普通方法的区别:

练习

小结


接口

定义

如果一个抽象类没有字段,所有方法都是抽象方法,就可以把该抽象类改写为接口:interface

在Java中,使用interface可以声明一个接口,接口定义的所有方法默认都是public abstract的

abstract class Person {public abstract void run();public abstract String getName();
}// 改写为
interface Person {void run();String getName();
}

一个具体的class去实现一个interface时,需要使用implements关键字:

class Student implements Person {private String name;public Student(String name) {this.name = name;}@Overridepublic void run() {System.out.println(this.name + " run");}@Overridepublic String getName() {return this.name;}
}

一个类可以实现多个interface:

class Student implement Person,Hello {...
}

术语

Java接口:

  • 特指interface的定义,表示一个接口类型和一组方法签名,
  • 只能extends一个class
  • 可以定义非抽象方法

编程接口: 

  • 泛指接口规范,如:方法签名、数据格式、网络协议等
  • 可以implements多个interface
  • 可以定义default方法

接口继承

一个interface可以继承自另一个interface,使用extends,相当于扩展了接口的方法: 

interface Hello {void hello();
}interface Person extends Hello {void run();String getName();
}

Person接口现在实际上有三个抽象方法签名,其中一个来自继承的Hello接口。

继承关系

合理设计interface和abstract class的继承关系,可以充分复用代码。

  • 公共逻辑适合放在abstract class中
  • 具体逻辑适合放在各个子类
  • 接口层次带表抽象程度

参考Java的集合类定义的一组接口 、抽象类以及具体子类的继承关系:

(图源接口 - Java教程 - 廖雪峰的官方网站)

 使用时,实例化的对象永远只能是某个具体的子类,总是通过借口去引用它,因为接口比抽象类更抽象

List list = new ArrayList(); // 用List接口引用具体子类的实例
Collection coll = list; // 向上转型为Collection接口
Iterable it = coll; // 向上转型为Iterable接口

default方法

把Person接口run()方法改为default方法

// interface
public class Main {public static void main(String[] args) {Person p = new Student("Xiao Ming");p.run();}
}interface Person {String getName();default void run() {System.out.println(getName() + " run");}
}class Student implements Person {private String name;public Student(String name) {this.name = name;}public String getName() {return this.name;}
}

实现类可以不必覆写default方法。

给接口新增一个方法时,会涉及到修改全部子类,default方法的目的是,如果新增的是default方法,那么子类只需要在该覆写的地方覆写,其余不用。

default方法和抽象类的普通方法的区别:

interface没有字段,default无法访问字段,抽象类的普通方法可以访问实例字段。

练习

public class Main {public static void main(String[] args) {// TODO: 用接口给一个有工资收入和稿费收入的小伙伴算税:Income[] incomes = new Income[] {new Income() {private double income = 3000;@Overridepublic double getIncome() {return income;}@Overridepublic double getTax() {return 0;}},new SalaryIncome(7500),new RoyaltyIncome(12000)};double total = 0;// TODO:for (Income income : incomes) {total += income.getTax();}System.out.println(total);}
}interface Income {double getIncome();double getTax();
}class SalaryIncome implements Income{private double income;public SalaryIncome(double income) {this.income = income;}@Overridepublic double getIncome() {return income;}@Overridepublic double getTax() {if(income <= 5000) {return income;}return (income - 5000) * 0.2;}
}class RoyaltyIncome implements Income{private double income;public RoyaltyIncome(double income) {this.income = income * 0.2;}@Overridepublic double getIncome() {return income;}@Overridepublic double getTax() {return 0;}
}

小结

接口定义了纯抽象规范,一个类可以实现多个接口;

接口也是数据类型,适用于向上转型和向下转型;


http://www.ppmy.cn/embedded/148890.html

相关文章

华三M-LAG场景下,部分MAC内的流量泛洪导致端口流量打满

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 问题描述 华三M-LAG场景下&#xff0c;部分MAC内的流量泛洪导致端口流量打满 解决方案 在交换机设备上创建1个无用的聚合口&#xff0c;该聚合口加入到mlag组&#xff0c;并将异常泛洪的MAC加入到该接口即可解决。&…

拆解Java中——“ 注解 ”和“ 注释 ” 的一切区别Ⅱ

前言&#xff1a; 上一篇&#xff0c;我们讲到了&#xff1a; ①注解的引入&#xff08;简单概述&#xff09;&#xff1a;在jdk5.0的时候 ②注解与注释的区别&#xff1a; 注释 是为了帮助人类阅读代码&#xff0c;不会对程序的执行产生任何影响。注解 是为了给编译器或运行…

[react]5、React脚手架

1、前端脚手架 1、Vue的脚手架&#xff1a;vue-cli 2、Angular的脚手架&#xff1a;angular-cli 3、React的脚手架&#xff1a;create-react-app 目前这些脚手架都是使用node编写的&#xff0c;并且都是基于webpack的&#xff0c;需要在电脑上安装node环境 脚手架的作用是帮助我…

微信小程序性能优化

性能优化是任何应用开发中的重要组成部分&#xff0c;尤其是在移动环境中。对于微信小程序而言&#xff0c;随着用户量的增加和应用功能的丰富&#xff0c;性能优化显得尤为关键。良好的性能不仅提升用户体验&#xff0c;还能增加用户留存率和应用的使用频率。我们将探讨如何在…

12寸半导体厂等保安全的设计思路

等级保护(等保)二级和三级的主要区别在于安全要求的严格程度、所需部署的安全措施和设备、以及对安全事件响应和处理的能力。以下是等保二级和三级之间的一些关键区别: 一、 安全要求严格程度: - 等保二级:适用于需要较高安全保护的信息系统,要求能够防范轻微的恶意攻击…

数组类算法 - 合集

************* C topics include&#xff1a; 数组类算法 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 26. 删除有序数组中…

LLaMA-Factory(一)环境配置及包下载

LLaMA-Factory(一&#xff09;环境配置及包下载 本机配置1. git下载2.创建虚拟环境3. 下载官方包内依赖4. 下载bitsandbytes5. 启动项目6. 可能出现问题1&#xff1a;pip install 出现 error: subprocess-exited-with-error 错误7. 可能出现问题2&#xff1a; ModuleNotFoundEr…

记录jvm进程号

日常开发中&#xff0c;相信大家会经常用到这么一行命令&#xff1a; ps -ef | grep xxx.jar | grep -v grep | awk {print $2} | xargs -r kill -9 就是杀掉xxx相关的进程&#xff0c;然后启动&#xff0c;当然也还有其他的方式可以实现类似的功能&#xff0c;我就不列举了&…