从抽象类到接口—手把手教你写抽象类(一)—还在Ctrl C的伙伴们看过来了

article/2025/10/14 0:40:29

目录

一、抽象类概述

二、抽象类的特点

三、抽象类的案例

四、抽象类的细节

五、抽象类的思想

抽象类概述

  • 抽象定义

        –抽象是从多个事物中将共性的,本质的内容抽取出来。

        –例:狼和狗共性都是犬科,犬科就是抽象出来的概念。

  • 抽象类

        Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

抽象方法的由来:

        多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。

        例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

如何知道它是一个抽象方法或者抽象类?看其是否有关键字abstrsct修饰。

注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类

看完解释,抽象类代码怎么写呢?代码注释很清晰易懂,应该这样写:

package com.demo01;
/** abstract:关键字,用于修饰方法和类* 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法* 抽象类:有抽象方法的类必须是抽象类* * 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类*/
public class ExtendsDemo {}
abstract class Animal {// 抽像方法public abstract void eat();  // 没有方法体的方法//非抽象方法子类可以不重写public void run() {}
}// 猫的子类 必须要实现eat方法
class Cat extends Animal {// 证明实现的是父类里边的方法,或者是继承的父类里边的方法@Override// 这个必须要实现父类里边的抽象方法,否则会报错public void eat() {System.out.println("猫吃鱼");}
}//狗的抽象子类
abstract class Dog extends Animal {// 这个方法可以不是现父类里边的方法,因为它也是一个抽象类public void eat() {System.out.println("狗吃屎");}
}

抽象类的特点

  1. 抽象方法一定在抽象类中,不可能在一个普通类中定义抽象类
  2. 抽象方法和抽象类都必须被abstract关键字修饰
  3. 抽象类不可以用new创建对象,因为调用抽象方法没意义
  4. 抽象类中的抽象方法要被使用,必须由子类覆写其所有的抽象方法后,建立子类对象调用; 如果子类只覆盖了部分的抽象方法,那么该子类还是一个抽象类。
  5. 抽象类中可以有抽象方法也可以有非抽象方法
  6. 抽象类和一般类没有太大的不同:   该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂得东西。这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体,也就是比一般类多了抽象方法而已.
  7. 特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象

我们用代码对上诉理解进行解释,代码如下:

package com.demo01;/** 抽象类的特点:* 		抽象方法只能在抽象类里面* 		抽象类和抽象方法必须被abstract修饰* 		抽象类不能创建对象(不能实例化)* 		抽象类中可以有非抽象的方法* 		抽象类和类的关系也是继承* 		一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类*/
public class ExtendsDemo {public static void main(String[] args) {//Animal a = new Animal();Cat cat = new Cat();cat.eat();cat.sleep();cat.run();}
}// 抽象类
abstract class Animal {// 非抽象方法public void eat() {}// 非抽象方法public void sleep() {}// 抽象方法public abstract void run() ;
}// 非抽象类
class Cat extends Animal {@Overridepublic void sleep() {// TODO Auto-generated method stub}public void run(){}}

抽象类成员特点

  • 成员变量 

        –可以有变量

        –可以有常量

  • 构造方法

        –可以有构造方法

  • 成员方法 

        –可以有抽象方法

        –可以有非抽象方法

注:既然你是一个构造方法,我们在调用类的时候,首先调用的是一个构造方法,普通的构造方法是和对象一起存在的,如果你是一个抽象的构造方法,根本就么有意义,构造方法不可以是一个抽象的方法的。

代码理解如下:

package com.demo01;import com.demo01.Animal;
import com.demo01.Dog;/** 抽象类的成员特点:* 		成员变量* 			可以有成员变量* 			可以有常量* 		成员方法* 			可以有抽象方法* 			可以有非抽象方法* 		构造方法* 			可以有构造方法的,需要对抽象类的成员变量进行初始化* * final:修饰类、成员变量、成员方法*/
public class ExtendsDemo {public static void main(String[] args) {Dog d = new Dog();d.barking();d.eat();}
}// 抽象类
abstract class Animal {String name = "哮天犬";// 常量修饰符,不可以被修改,不可以赋新的值final int NUM = 10;public Animal() {System.out.println("我是抽象类的构造方法");}public Animal(int n) {System.out.println("我是抽象类的构造方法");}public abstract void eat();public void run() {}
}// 子类继承父类
class Dog extends Animal {public void barking() {System.out.println(name);System.out.println(NUM);}public void eat() {System.out.println("吃");}
}

抽象类的案例

老师示例,根据给出内容设计继承体系

        –具体事物:基础班老师,就业班老师

        –共性:姓名,所属教室,讲课。

学员示例(练习)——类似,自己练习哈

        –具体事物:基础班学员,就业班学员

        –共性:姓名,学习

代码如下:

package com.demo01;import com.demo01.BasicTeacher;
import com.demo01.JobTeacher;
import com.demo01.Teacher;/**	基础班老师,就业班老师**	共性:*		属性	姓名,年龄,性别*		行为	讲课,唱歌*/
public class ExtendsDemo {public static void main(String[] args) {BasicTeacher bt = new BasicTeacher();bt.name = "张老师";bt.teach();JobTeacher jt = new JobTeacher();jt.name = "王老师";jt.teach();}
}//定义一个抽象类(父类)
abstract class Teacher {String name;//姓名int age;//年龄String gender;//性别//讲课public abstract void teach();
}// 定义一个子类
class BasicTeacher extends Teacher {@Overridepublic void teach() {System.out.println(name + "讲基础班课程");}}class JobTeacher extends Teacher {@Overridepublic void teach() {System.out.println(name + "讲就业班课程");}}

抽象类的细节

  • 抽象关键字abstract不可以和哪些关键字共存?

        答:不可以和final、paivate共用,(1)加上final关键字意思是不能被继承,而abstract不能创建对象,只能被继承,然后创建对象来访问抽象类中的成员变量和成员方法,所以abstract不能和final共用。(2)abstract必须要被别人继承使用,pravite是私有的,其他得类,谁都看不到。

  • 抽象类中是否有构造函数

        答:有呢,因为抽象类中也可以定义一些变量,常量,也是希望被别的类访问,也有初始化过程,可以不写构造函数,但是有一个默认的,隐含的构造函数。

  • 抽象类中可不可以没有抽象方法

        答:一般是有的,但是也可以没有,但是其他的类,可以继承我的类,但是不可以new我的类。

抽象类思想

(1)在抽象类中,我定义一个抽象方法,我只不过是定义一个规范,在其他类继承我的抽象类时,必须按我的规范执行。

(2)Writer和Reader是我们Java中的一个抽象类。


http://chatgpt.dhexx.cn/article/suFofxM0.shtml

相关文章

Java基础学习:抽象类和接口

目录,更新ing,学习Java的点滴记录 目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录 抽象类和接口_抽象类和抽象方法 抽象类是普通的类与接口之间的一种中庸之道,尽管你可能在构建某些未实现方法的类是,第一想法可能是创建接口,但是抽象类仍旧是用于此…

SVD奇异值分解(理论与C++实现)

SVD奇异值分解 前言理论推导部分代码实现 前言 奇异值分解(singular value decomposition,以下简称SVD)是线性代数中一种重要的矩阵分解。SVD将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。SVD将矩阵 A A A分解成三个矩阵的乘积 A U D V T A …

matlab实现奇异值分解

一、原理 二、实现 %% 两种方法计算矩阵 A 的 SVD A [0,1; 1,1; 1,0];%% 方法一:利用特征分解eig % 计算右奇异矩阵V [V,D1] eig(A*A); n size(D1,1); index n:-1:1; D1 diag(D1); D1 D1(index); D1 diag(D1, 0); V V(:,index); % 计算左奇异矩阵U [U,D2…

特征值分解和奇异值分解

特征值分解 特征值分解是将一个方阵A分解为如下形式: A Q Σ Q − 1 AQ\Sigma Q^{-1} AQΣQ−1 其中,Q是方阵A的特征向量组成的矩阵, Σ \Sigma Σ是一个对角矩阵,对角线元素是特征值。 通过特征值分解得到的前N个特征向量&am…

奇异值分解的揭秘(一):矩阵的奇异值分解过程

转载来源: 作者:Xinyu Chen 链接:https://zhuanlan.zhihu.com/p/26306568 来源:知乎 矩阵的奇异值分解(singular value decomposition,简称SVD)是线性代数中很重要的内容,并且奇…

奇异值分解(Singular Values Decomposition,SVD)

奇异值分解 1.奇异值分解1.1 变换(Transformations)1.2 线性变换(Linear Transformations)1.3 降维(Dimensionality Reduction)1.4 奇异值分解(SVD)1.4.1 如果矩阵 A A A是方阵&…

奇异值分解(SVD)的原理详解及推导

1. 写在前面 最近整理推荐系统模型的时候, 第二个模型打算整理一下隐语义模型, 这里面绕不开一种思想就是矩阵分解, 而作为矩阵分解的经典方法SVD感觉这次有必要学学了, SVD不仅是一个数学问题,在工程应用中的很多地方…

机器学习(29)之奇异值分解SVD原理与应用详解

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于…

【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用

奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,有相当多的应用与奇异值都可以扯上关系,它不光可以用于降维算法中的特征分解,比如做feature reduction的PCA,做数据压缩&#x…

联邦学习——用data-free知识蒸馏处理Non-IID

《Data-Free Knowledge Distillation for Heterogeneous Federated Learning》ICML 2021 最近出现了利用知识蒸馏来解决FL中的用户异构性问题的想法,具体是通过使用来自异构用户的聚合知识来优化全局模型,而不是直接聚合用户的模型参数。然而&#xff0c…

【FLIS】Clustered Federated Learning via Inference Similarity for Non-IID Data Distribution

Clustered Federated Learning via Inference Similarity for Non-IID Data Distribution 基于推理相似性的非iid数据分布聚类联邦学习 Abstract1.INTRODUCTION2.FEDERATED LEARNING WITH CLUSTERINGA. Overview of FLIS AlgorithmB. Clustering Clients 3.EXPERIMENTSA. Exper…

Federated Learning with Non-IID Data 论文笔记

本文提出联邦学习中的由于Non-IID数据分布而精度降低是因为权重分散(weight divergence),而权重散度可以用搬土距离(EMD)量化,最后提出了一种策略:通过创建一个在所有边缘设备之间全局共享的数据…

论文分享:「FED BN」使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题

‍ ‍ 本次分享内容基于ICLR 2021收录的一篇文章:《FED BN: FEDERATED LEARNING ON NON-IID FEATURES VIA LOCAL BATCH NORMALIZATION》,这篇论文主要探讨了使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题。围绕这篇论文的分享将分为4个部分&#…

On the convergence of FedAvg on non-iid data

在这篇blog中我们一起来阅读一下 On the convergence of FedAvg on non-iid data 这篇 ICLR 2020 的paper. 主要目的 本文的主要目的是证明联邦学习算法的收敛性。与之前其他工作中的证明不同,本文的证明更贴近于实际联邦学习的场景。特别的, 所有用户…

Federated Learning with Non-IID Data

Federated Learning with Non-IID Data 论文中分析了FedAvg算法在Non-IID数据时,准确率下降的原因。并提出共享5%的数据可提高准确率。 论文笔记参考:https://blog.csdn.net/GJ_007/article/details/104768415 Federated Learning with Non-IID Data …

什么是TLB文件,怎样从dll文件中提取TYPEID信息?- IID

文章目录 1.TLB是什么?2.怎样从dll中导出TLB文件?3.怎样创建TLB文件?4.如何导入TLB5.作者答疑Com是windows平台提供的二进制互操作解决方案。如果给你一个dll,或者windows自带的dll,是否有可能提取其Com接口信息,答案是可以的。 1.TLB是什么? TLB文件是一个说明文件,通…

怎么实现联邦学习中的Non-IID?

联邦学习的一大特点就是数据分布是Non-IID,Non-IID意为非独立同分布。那么怎么在实验中实现non-iid呢?这是我这篇博客想讨论的问题。 part 1: 在堪称联邦学习“开山之作”FedAvg这篇论文中,是这样描述的: 数据集是MN…

【联邦学习】联邦学习量化——non-iid数据集下的仿真

文章目录 改进项目背景量化函数的改进non-iid数据集的设置Fedlab划分数据集的踩雷 改进项目背景 在前面的项目中,虽然对联邦学习中,各个ue训练出来的模型上传的参数进行了量化,并仿真的相关结果。但是仍有一些俺不是非常符合场景的情况&…

「隐语小课」联邦学习之Non-IID问题

更多干货内容,请移步公众号:隐语的小剧场 一、引言 本文针对联邦学习中遇到的Non-IID问题进行探讨,介绍Non-IID产生的原因,分析Non-IID对联邦学习的影响,以及调研了近年来针对该问题的解决方案,并进行分类…

联邦学习中的non-iid总结

最近研究联邦学习(federated learning,FL)中的non-iid的解决办法时遇到瓶颈,写成博客将最近的工作总结一下,希望有大佬看到这篇博客不吝赐教。 什么是non-iid 先从维基百科引出独立同分布的定义: 在概率论…