java基础,接口和抽象类

一:接口和抽象类

 

①接口的定义:

声明方式:

接口使用interface关键字来声明,后跟接口的名称和接口体(包含常量和方法声明的代码块)

public interface ObjectService extends IService<ObjectDO> {/*** 创建扶优对象信息** @param createReqVO 创建信息* @return 编号*/Long createObject(@Valid ObjectSaveReqVO createReqVO);/*** 更新扶优对象信息** @param updateReqVO 更新信息*/void updateObject(@Valid ObjectSaveReqVO updateReqVO);/*** 删除扶优对象信息** @param id 编号*/void deleteObject(Long id);/*** 获得扶优对象信息** @param id 编号* @return 扶优对象信息*/ObjectDO getObject(Long id);}

二、接口的特点

  1. 抽象性:接口中的所有方法都是抽象的,即它们只有方法签名,没有实现体。接口中的方法默认是public abstract的,但这两个关键字可以省略。
  2. 不能实例化:接口不能实例化,即不能使用new关键字来创建接口的对象。但是,可以使用接口类型的变量来引用实现了接口的类的实例。
  3. 多继承:一个类可以实现多个接口,这是Java中实现多重继承的一种方式(Java不允许多重类继承,但允许多重接口继承)。
  4. 常量:接口中可以定义常量,这些常量默认是public static final的,但通常省略这些修饰符。
  5. 默认方法和静态方法(Java 8及以上):除了抽象方法外,接口中还可以包含默认方法和静态方法。这些方法有具体的实现体,可以在接口中直接定义。

2.1对象的实例化:

1.new关键字是Java中最常用的创建对象的方式。通过调用类的构造函数,new关键字实例化一个对象。

public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}Person person = new Person("小明", 18);

 

2.Class的newInstance()方法可以在运行时创建一个类的新实例。它等效于使用new操作符,但是语法更加动态。

public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}try {Person person = Person.class.newInstance();person.name = "小明";person.age = 18;
} catch (Exception e) {e.printStackTrace();
}

3. 使用Constructor的newInstance()方法

Constructor的newInstance()方法可以在运行时创建一个类的新实例,并且可以传入构造函数的参数。这种方式比Class的newInstance()方法更加灵活,因为可以选择不同的构造函数。

public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}try {Constructor<Person> constructor = Person.class.getConstructor(String.class, int.class);Person person = constructor.newInstance("小明", 18);
} catch (Exception e) {e.printStackTrace();
}

4.使用clone()方法

clone()方法可以创建对象的一个副本,并且可以重写clone()方法来实现深克隆。

public class Person implements Cloneable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}Person person = new Person("小明", 18);
Person clone = null;
try {clone = (Person) person.clone();
} catch (CloneNotSupportedException e) {e.printStackTrace();
}

5. 使用反序列化

反序列化是将对象从字节流中恢复的过程。通过序列化后,可以把对象存储到文件或网络中,然后再通过反序列化的方式恢复成对象。

public class Person implements Serializable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}Person person = new Person("小明", 18);try {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));oos.writeObject(person);oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"));Person clone = (Person) ois.readObject();ois.close();
} catch (Exception e) {e.printStackTrace();
}

6. 使用工厂模式

工厂模式可以将对象的创建和使用解耦。通过定义一个对象工厂,可以更加灵活地产生对象。

public interface Animal {String getName();
}public class Cat implements Animal {@Overridepublic String getName() {return "Cat";}
}public class Dog implements Animal {@Overridepublic String getName() {return "Dog";}
}public class AnimalFactory {public Animal createAnimal(String type) {switch (type) {case "Cat":return new Cat();case "Dog":return new Dog();default:throw new IllegalArgumentException("Unsupported animal type: " + type);}}
}AnimalFactory factory = new AnimalFactory();
Animal cat = factory.createAnimal("Cat");
Animal dog = factory.createAnimal("Dog");

 

 

2.2、接口的使用

  • 实现接口:一个类使用implements关键字来实现一个或多个接口。实现接口的类必须提供接口中所有抽象方法的具体实现(除非该类也是抽象类)。
  • 接口回调:接口常被用于回调机制中,允许将实现接口的类的实例传递给其他对象,以便在适当的时候调用这些实现的方法。
  • 标记接口:一种特殊的接口,不包含任何方法或常量,仅用于标记实现了该接口的类具有某种特定的属性或功能。

2.3、接口的作用

  • 定义规范:接口定义了类必须遵循的规范,即类必须实现接口中定义的方法。
  • 解耦:接口的使用降低了类之间的耦合度,提高了系统的灵活性和可扩展性。
  • 多态:接口是实现多态的一种方式,通过接口类型的变量可以引用实现了接口的类的实例。

三,抽象类

1 概述


父类中的方法,被他的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有 意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法 的类就是抽象类。

总的来说就是:

抽象方法:没有方法体的方法
抽象类:包含抽象方法的类


2 abstract的使用格式


2.1抽象方法


使用abstrct关键字修饰的方法就是抽象方法,值得注意的是,抽象方法只包含一个方法名,没有方法体。

定义格式为:

修饰符 abstract 返回值类型 方法名 (参数列表);
代码举例:

public abstract void run();

 

2.2 抽象类


如果一个类包含抽象方法,那么该类必须是抽象类。

定义格式:

abstract class 类名字 {
}
代码举例:

public abstract class Animal {
    public abstract void run();
}


2.3 抽象类的使用

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。

继承抽象类的子类必须重写父类所有的抽象方法!!!!!!!!!!!

 

3注意事项

1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。

3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设 计。
4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

四.接口和抽象类的区别

相似点:

(1)接口和抽象类都不能被实例化

(2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法

不同点:

(1)抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法,

(2)抽象类可以有构造方法,而接口没有

(3)抽象类中的成员变量可以是各种类型的,接口的成员变量只能是 public static final 类型的,并且必须赋值

 

 

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

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

相关文章

Vue 中 v-pre、v-once、v-cloak 标签的深度解析与案例展示

目录 v-pre v-once ​​​​​​​v-cloak ​​​​​​​v-cloak介绍 ​​​​​​​插值表达式闪烁问题 v-pre 当使用 v-pre 指令时,不会进行编译操作。所有的 Vue 模板语法都将得以完整保留,并会按照其初始的形态进行渲染。其中,最为常见的应用场景便是用于展示…

用户登陆实现前后端JWT鉴权

目录 一、JWT介绍 二、前端配置 三、后端配置 四、实战 一、JWT介绍 1.1 什么是jwt JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间以安全的方式传输信息。JWT 是一种紧凑、自包含的信息载体&…

【Android面试八股文】组件化在项目中有什么意义?

一、没有组件化会出现什么问题? 早期的单一分层模式 问题一:无论分包怎么做,随着项目增大,项目失去层次感,后面接手的人扑街问题二:包名约束太弱,稍有不注意,就会不同业务包直接互相调用,代码高耦合问题三:多人开发在版本管理中,容易出现代码覆盖冲突等问题二、组件…

【Linux】Linux的账号和用户组

管理员的工作中&#xff0c;相当重要的一环就是【管理账号】。 因为整个系统都是你在管理&#xff0c;并且所有一般用户的账号申请&#xff0c;都必须要通过你的协助才行&#xff0c;所以你就必须要了解一下如何管理好一个服务器主机的账号。 在管理Linux主机的账号时&#xff…

Linux下mysql数据库的导入与导出以及查看端口

一&#xff1a;Linux下导出数据库 1、基础导出 要在Linux系统中将MySQL数据库导出&#xff0c;通常使用mysqldump命令行工具。以下是一个基本的命令示例&#xff0c;用于导出整个数据库&#xff1a; mysqldump -u username -p database_name > export_filename.sql 其中&a…

Django 删除单行数据

1&#xff0c;添加模型 from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharField(max_length100)author…

121. 小红的区间翻转(卡码网周赛第二十五期(23年B站笔试真题))

题目链接 121. 小红的区间翻转&#xff08;卡码网周赛第二十五期&#xff08;23年B站笔试真题&#xff09;&#xff09; 题目描述 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&#xff0c;&#x…

【spring boot starter的自定义和学习笔记】

spring boot starter的自定义和理解 author:shengfq date:2024-07-14 version:1.0 title:spring boot starter的自定义和理解 1.基本概念 Starter是Spring Boot的四大核心功能特性之一&#xff0c;除此之外&#xff0c;Spring Boot还有自动装配、Actuator监控等特性。 Sprin…

顺序表算法 - 移除元素

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-element/description/思路: 代码: // numsSize表示数组的长度 …

【2024年全国青少信息素养大赛c++初中复赛集训第一天编程题分享】

目录 题目 1:星际旅行者的紧急求助 题目 2:失落的文明遗迹 题目 3:时间之门的密码 题目5,输出多进制数 题目6、乒乓球 题目7、明明的随机数 题目8、烤鸡 题目9、排队接水 题目 10:魔法森林的迷宫 题目 11:校园植树节活动 题目 12:小学生数学竞赛排名 题目 1:…

力扣224.基本计算器

力扣224.基本计算器 一个栈存符号 并记录当前数的符号遍历到一个数就存入答案 class Solution {public:int calculate(string s) {stack<int> st({1});int sign 1;int res0;int number;int n s.size();int i0;while(i<n) {if(isdigit(s[i])){number 0;while(i &…

python+pygame实现五子棋人机对战之五

pythonpygame实现五子棋人机对战之一 pythonpygame实现五子棋人机对战之二 pythonpygame实现五子棋人机对战之三 pythonpygame实现五子棋人机对战之四 在之前的文章中已经完成了所有的基础工作&#xff0c;剩下的就是把空填上就可以了。 六、 完成程序 # encoding:utf-8…

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…

Readiris PDF Corporate / Business v23 解锁版安装教程 (PDF管理软件)

前言 Readiris PDF Corporate / Business 是一款高性能的 OCR&#xff08;光学字符识别&#xff09;软件&#xff0c;能够帮助用户将纸质文档、PDF 文件或图像文件转换为可编辑和可搜索的电子文本。该软件提供专业级的功能和特性&#xff0c;非常适合企业和商业使用。使用 Rea…

基于lstm的股票Volume预测

LSTM&#xff08;Long Short-Term Memory&#xff09;神经网络模型是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它在处理长期依赖关系方面表现出色&#xff0c;尤其适用于时间序列预测、自然语言处理&#xff08;NLP&#xff09;和语音识别等领域。以下是…

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸&#xff0c;还能在被动模式下通过PID控制实现…

2024.07.06校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 网易游戏雷火2025届秋季校园招聘/全/球启动&#xff08;内推&#xff09; 校招 | 网易游戏雷火2025届秋季校园招聘全球启动&#xff08;内推&#xff09; 2、芯之所向 共创未来…

Taro自定义FromData实现本地路径转换为文件

在用Taro写头像上传功能时&#xff0c;因为需要对获得的图片进行剪切成圆形或方形。使用组件剪切完之后返回的是一个本地图片的相对路径。这个时候我们就需要自己实现将本地路径重新转换为二进制文件。 引入两个js文件 mimeMap.js module.exports {"0.001": &quo…

C++20中的consteval说明符

在C20中&#xff0c;立即函数(immediate function)是指每次调用该函数都会直接或间接产生编译时常量表达式(constant expression)的函数。这些函数在其返回类型前使用consteval关键字进行声明。 立即函数是constexpr函数&#xff0c;具体情况取决于其要求。与constexpr相同&…

神经网络以及简单的神经网络模型实现

神经网络基本概念&#xff1a; 神经元&#xff08;Neuron&#xff09;&#xff1a; 神经网络的基本单元&#xff0c;接收输入&#xff0c;应用权重并通过激活函数生成输出。 层&#xff08;Layer&#xff09;&#xff1a; 神经网络由多层神经元组成。常见的层包括输入层、隐藏层…