-
2021-11-16 17:12:43
①抽象类定义:
- 在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对
象,这样的类就是抽象类。
②抽象类使用场景:
- 无法完整描述一个事物的类。
- 抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),所以,当我们父类的方法,必须要子类重写实现时,而且子类又想继承父类的其他方法时,用抽象类。
更多相关内容 - 在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对
-
如何彻底理解Java抽象类 为什么要用抽象类 什么情况下用抽象类
2021-02-26 09:10:46呐,到底什么是抽象类,有时明明一个普通类就可以解决了,为啥非得整个抽象类,装逼吗我曾带着这样的疑惑,查了很多资料,看了很多源码,写了很多代码,以下是自家的理解一、彻底理解Java抽象类当我们无法理解一个...呐,到底什么是抽象类,有时明明一个普通类就可以解决了,为啥非得整个抽象类,装逼吗
我曾带着这样的疑惑,查了很多资料,看了很多源码,写了很多代码,以下是自家的理解
一、彻底理解Java抽象类
当我们无法理解一个事物的时候,我得追寻他的本源:万物皆对象
在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对象,这样的类就是抽象类。(参考 https://www.runoob.com/java/java-abstraction.html)
无论你在其他渠道看到过多少关于抽象类的解释,都没有这样解释合乎根本!
举个栗子
让你设计一个简单的学生选课系统
基本需求:学生选课,老师授课,每个老师只能接受有限个个学生,每个学生只能选一个老师。
最终会抽象出其中2个领域对象:学生、老师。当我们用类去描述学生、老师时,他们的共性是人(Person):有名字、年龄、职业等特征,有上课(学习、授课都属于上课)等行为;
呐,我们想想光有这些特性、行为,就能完整的描述出一个可在选课系统操作的对象(学生或老师)吗?显然不行!学生还需要:所选课程、选中的老师等其他特征,老师还需要:学生限数、名下学生等其他特征,加上这些东西,才能完整的描述一个可供操作的对象!
如下代码,Person类,作为抽象类,goToClass方法是子类必须重写的方法,表明子类是去学习的,还是上课的
public abstract class Person {
protected String name;
protected int age;
protected int profession;
public abstract void goToClass();
}
public class Student extends Person {
private int selLesson;
private int selTeacher;
@Override
public void goToClass() {
System.out.println("go to studying");
}
}
public class Teacher extends Person {
private int studentNumLimit;
private List students;
@Override
public void goToClass() {
System.out.println("give lessons");
}
}
二、为什么要用抽象类 什么情况下用抽象类
1、根本原因:无法完整描述一个事物的类
2、抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),所以,当我们父类的方法,必须要子类重写实现时,用抽象类。如上面的 goToClass() 方法,学生、老师去课堂的目的完全不同,必须自己实现。
3、跟接口相比,接口的方法必须由实现类全部实现,接口方法比较多时,就会麻烦,而抽象类没有这样的限制。比如jdk 里面的 AbstractList,是ArrayList 的父类,里面全是方法,你只需要重写自己需要的
4、易于理解,有时候,这样的设计,让人更容易理解它的层级等。个人认为所有的设计原则都是死的,为了提高代码的实际可操性,牺牲部分设计原则是可以的
来源:https://www.icode9.com/content-1-578251.html
-
PHP抽象类和接口用法实例详解
2021-01-03 02:35:17本文实例讲述了PHP抽象类和接口用法。分享给大家供大家参考,具体如下: 前言 对于oop,估计大多数人并不陌生。有些人除PHP外也学习不少其他语言,会发现php的不同之处,可能语法极其丑陋,但并不妨碍它成为世界上... -
Java中抽象类的特点
2022-01-21 15:38:033.只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法 4.抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写 5.抽象类是对一些类共性的抽取,不能被实例化,但是可以使用多态 6.final...抽象类的特点
1.由abstract修饰的类叫做抽象类,也可以修饰抽象方法
2.abstract修饰的抽象方法可以不在抽象类当中实现,但一定要在子类当中重写,并实现
3.只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法
4.抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写
5.抽象类是对一些类共性的抽取,不能被实例化,但是可以使用多态
6.final 不能和abstract同时使用,final修饰的方法禁止重写, abstract修饰的方法要求重写 ,冲突
7.private修饰的方法时子类不可见的, abstract修饰的方法要求重写,冲突
8.抽象方法不能使用static,static是针对类层次,抽象方法是针对对象层次的,所以不能一起使用.
9.抽象类可以有构造方法,目的是子类在初始化之前先初始化父类,即在new子类构造器(),之前先new父类构造器()
10.子类继承抽象类后,如果不想实现抽象类中的抽象方法,那么该此类必须是个抽象类
11.抽象类一定是个父类吗? 答:是的,因为需要子类覆盖其方法后才可以对子类实例化。
-
抽象类和接口的区别(什么时候用抽象类,什么时候用接口?)
2020-12-12 14:45:26如果在你的程序中有下面的这些情况,那你就要考虑使用抽象类了: 你想要在几个关联紧密的类之间共享代码。 你想要继承抽象类的那些类有一些公共方法或属性抑或是有修改protected或private属性的权限。这时你也...什么时候用
如果在你的程序中有下面的这些情况,那你就要考虑使用抽象类了:
-
你想要在几个关联紧密的类之间共享代码。
-
你想要继承抽象类的那些类有一些公共方法或属性抑或是有修改protected或private属性的权限。这时你也可以考虑使用抽象类。
-
你想要声明非静态或者是非最终执行的属性。你可以获得并且修改这些属性所属的对象的状态。
当有下面的情形的时候,我们可以考虑使用接口:
-
用相互之间无关的类实现你的接口。举例来说,可比较的和可克隆的那些接口可以使用无关的类来实现。
-
你想指定一个特定数据类型的行为,但是不用去关心由谁来实现这一行为。
-
你想要利用多继承的优势。
区别
-
抽象类是对类的抽象(是什么),接口是对行为的抽象(做什么)。
-
如果行为跨越不同类的对象,可使用接口,对于一些现实的类对象,用继承抽象类。
-
抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确认,预先定义。
-
抽象类和接口的使用就是is和has的区别。如果就是某种玩意,比如人相对于男人,小孩,女人就是is,那么就应该是抽象类,因为他们都是人,有人所有的特点。而可行动相对于人,汽车,飞机就是has,那么就是接口,因为他们有这样的功能,但不具有is的特征。
-
第三种说话
抽象类与接口最大的区别在于抽象类的属性是可以继承的。
而接口只有常量。
一般情况下我们尽可能使用接口,因为接口从方法上去描述对象特性,可以实现多个接口,而继承只能继承一个。
那么我们什么时候要调用到抽象类呢?
那是因为子类必须含有父类的某个特征属性。
比如人跟鱼,人跟鱼都需要呼吸氧气作为生存的需要,这个呼吸是一个方法,所以就需要接口了。
当你需要区分人在空气中用肺呼吸,鱼在水中用鳃呼吸,那就要用到抽象类了。为什么接口中只能定义常量?
学习完接口后,知道了接口中只能定义常量,即使你的代码是这样写的:public int a,底层语言也会默认加上public static final int a转为常量,那么这是为什么呢?
我们都知道,接口中不能定义方法的实现,但是抽象类中是可以定义变量、常量以及方法的实现的,所以我们可以将接口看为比抽象类更高层次的抽象,是特殊的抽象类。加入接口可以定义变量,因为接口中的方法都是抽象的,我们无法通过行为,例如set()方法来修改这一属性值。
或许有些人会说我们可以让实现接口的类的对象去修改接口的属性值,如果真的这样的话,比如接口中我定义了变量a,而且我们通过实现本接口的类B的对象改变了a的值,那么其他实现本接口的类B、类C中的变量a得知都要随着改变(因为它们实现的都是一个接口,处理的也是同一个变量,而变量的处理方式为传址),那么就会造成想要实现本接口的类却不知道接口里现在变量a到底是什么值,就会造成混乱。
而且,抽象的概念是将不可变的东西提取出来封装到一起,将可变的东西放到实现中去,接口的设计理念既然是高层的抽象,那么就应该定义为不可变的东西,如果接口中定义了变量,就说明带了可变的成分,就不是高层抽象了。
-
-
深入理解Java的接口和抽象类
2020-12-22 22:19:13在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。我们一起来学习一下Java中的接口和抽象... -
抽象类特征
2018-07-05 19:33:06抽象类拥有如下特征: 1.抽象类不能被实例化, 但可以有实例构造函数, 类是否可以实例化取决于是否拥有实例化的权限(对于抽象类的权限是abstract, 禁止实例化);即使不提供构造函数, 编译器也会提供默认构造函数;2,抽象... -
Java 抽象类、抽象方法、抽象类的特征、抽象类是否有构造器,抽象类是否可以创建对象、抽象类存在的意义、...
2020-02-14 17:25:37抽象类中不一定有抽象方法,有抽象方法的一定是抽象类 抽象类不能实例化 抽象类只能参照多态的方式,通过子类对象实例化。这叫抽象类多态。 抽象类的子类 要么重写抽象类中的所有抽象方法 要么是抽象类 public abs.... -
Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
2019-05-09 17:19:59回想前面我们的猫狗案例,...而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是给出一个声明即可。 ... -
51.抽象类是什么?为什么要用抽象类,什么情况下使用?
2020-11-26 16:21:121、抽象类是什么(Java三大特性外的重要特征,述说着第四大特性)Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类... -
什么是抽象类?抽象类有什么特点?举例说明抽象类及其成员的定义方法。
2019-04-01 12:45:16(1)在C#中,凡是包含了无法实现的成员的类就是抽象类 (2)特点:抽象成员必须在抽象类中声明,但抽象类不要求必须包含抽象成员,抽象类只能当做基类使用,而不能直接实例化。抽象类的用途提供多个派生类可共享的... -
java继承抽象类与普通类有什么区别?
2021-02-27 14:39:03展开全部抽象类:1、抽象类中e69da5e887aa62616964757a686964616f31333365646264可以有普通方法,如果想让方法子类必须实现,就弄成抽象方法。2、如果抽象类中有抽象方法,那么这个类必须定义为抽象类。3、抽象类不... -
接口和抽象类有什么联系和区别?
2020-01-12 17:06:29父子俩牵着驴进城,半路上有人笑他们:真笨,有驴子不骑! 父亲便叫儿子骑上驴,走了不久,又有人说:真是不孝的儿子,竟然让自己的父亲走着!父亲赶快叫儿子下来,自己骑到驴背上,又有人说:真是狠心的父亲,不怕... -
抽象类的作用
2021-04-30 23:25:32类和类本身具有共同特征,将这些特征提取出来,形成的就叫做抽象类。抽象类本身并不存在,所以无法创建对象。 2.抽象类的作用 –>不往抽象了说,最直观的就是实现接口中的方法,供子类继承和重写。 我们拿... -
抽象类和抽象方法的特点
2020-07-14 14:31:57抽象类有以下几个特点: 1.抽象类不能直接实例化对象但是可以通过子类向上转型得到该类型对象 2.抽象类也有构造器(所有的类都有构造器) 3.抽象类可以没有抽象方法,但有抽象方法一定是抽象类 4.抽象类和普通类使用... -
抽象类概述及特点
2021-06-27 16:43:17一、什么是抽象类? 在Java中,一个没有方法体的方法(一个方法没有明确功能)应该定义为抽象方法,而如果类中有抽象方法,那么这个类必须定义为抽象类! 二、抽象类的特点 1、抽象类不一定有抽象方法,但是有... -
抽象类与接口(学习笔记)
2020-12-21 16:59:39类和类之间具有共同特征,讲这些共同特征抽取出来,就形成了抽象类。因为类本身是不存在的,所以抽象类无法创建对象(无法实例化)。 以下借用视频中总结的思维层次图: 抽象类属于什么类型: 抽象类也属于引用数据... -
接口和抽象类有什么区别?
2019-06-28 11:39:35你选择使用接口和抽象类的依据是什么...从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法... -
C#中抽象类与抽象方法的作用与实例
2021-12-26 01:28:31在C#中,允许把类和方法声明为抽象类与抽象方法,具体的声明方法是在类名或方法名前加上abstract关键字。那么我们什么时候应该用抽象类呢?如果一个类设计的目点是用来被其它类继承的,它代表... -
Java接口和抽象类原理详解
2020-08-25 01:53:40主要介绍了Java接口和抽象类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
抽象类继承多个抽象类_接口和抽象类的区别
2020-11-20 08:29:56从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类... -
Java基础:抽象类的特征(接口与抽象类的区别)
2022-02-11 11:07:463.只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法 4.抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写 5.抽象类不能被实例化,但是可以使用多态 6.final 不能和abstract同时... -
C#接口抽象类什么时候用?接口与抽象类的区别。
2020-01-01 22:06:13那么就可以使用抽象类定义基类,即使用abstract关键字声明Class并且abstract声明抽象类中方法(抽象类中可以有抽象方法也可以有实方法-》这里的实方法指的是非虚方法,abstract可以看做隐式的虚方法 ) ... -
java中什么叫抽象方法和抽象类及他们的特点
2019-12-15 14:53:24类前有个abstract修饰符就是抽象类,完了,简单就好记。 以下是二者的要点: 1)抽象方法没有函数体。有童鞋说,这有什么意义呢?比如下面的例子,当我们不知道现在是什么车时,你让我写驾驶(steer)这个方法,我... -
抽象类和抽象方法
2022-03-16 15:08:071、什么是抽象类: 类和类之间具有的共同特征,但是不完全一样,有着自己的特色, 将这些共同的特征(方法)提取出来,形成的一个类就是抽象类 让这些具有共同特征的类去继承它 注意:这个类是抽象的,也就是"不... -
java抽象类详细介绍
2022-06-18 16:08:45在java中 abstract是抽象的意思,可以修饰类,成员方法abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。 修饰符 abstract class 类名{ 修饰符 abstract 返回值类型 方法名称(形参列表); } ... -
java抽象类详解
2021-02-25 18:11:57final关键字final 修饰符 可以修饰 类、属性、方法修饰类时 表示该类不能被继承 其他特征 跟普通的类一样修饰 属性时 表示 改属性不能改变 并且 必须赋初始值修饰方法时 表示该方法不能被重写什么是抽象类?...