-
2021-02-28 14:53:53
抽象类必须要有抽象方法吗?
答:不需要,
抽象类不一定有抽象方法;但是包含一个抽象方法的类一定是抽象类。(有抽象方法就是抽象类,是抽象类可以没有抽象方法)
解释:
抽象方法:
java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
抽象方法与抽象类:
当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。 一个抽象类里面没有一个抽象方法可用来禁止产生这种类的对象。
Java中的抽象类:
abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
更多相关内容 -
Java中抽象类和接口中有构造方法吗?
2021-03-08 05:52:39它们的语法区别:1)接口不能有构造方法,抽象类可以有。2)接口不能有方法体,抽象类可以有。3)接口不能有静态方法,抽象类可以有。4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。忽然有此...以举例的方式说到如何区分抽象类和接口,这里我们从Java语法谈起,使我们更加了解这两者的内在区别。它们的语法区别:
1)接口不能有构造方法,抽象类可以有。
2)接口不能有方法体,抽象类可以有。
3)接口不能有静态方法,抽象类可以有。
4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。
忽然有此一文,是因为同学疑惑道:抽象类居然还有构造方法,又不能直接用来new。我的解释是平时在抽象类中对于构造方法的存在,没有什么印象,是因为IDE默认为你生成了一个无参构造方法,也可以显式地写出构造方法,这个构造方法,是用来被子类调用的,因为任何子类都必须调用从Object开始的所有父亲的构造方法,才算完成初始化工作。那么我引申一下,问他们,接口有构造方法吗?他们的理解,抽象可以有,为什么接口不可以有?!那么在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。这又何解?
从语法的角度来说,抽象类必须有构造方法,而接口严禁有构造方法,这本身也说明了它们性质的不同。抽象类是一个类,别的类是用关键字 extends 来继承下来,并扩展的,有非常强的is-a的关系,这种关系一般来说符合里氏代换原则。而接口,是被其他类用关键字 implements 来实现接口定义的方法的。如果没什么区别,何必整出两个不同的关键字。 接口只是定义功能和行为规范,如果一个类实现了一个接口,那么这个类必须遵守这个接口的方法约定,但没有is-a的关系。把墙壁上的“小学生行为规范”想象成一个接口,那么是小学生必须遵守这个约定,但小学生不是“行为规范”。
构造方法是用来在对象初始化前对对象进行一些预处理的,提供了实例化一个具体东西的入口。接口只是声明而已,不一定要进行什么初始化,就算要进行初始化,也可以到实现接口的那一些类里面去初始化。接口只是用来表述动作,表述规范来的,可以new一台computer,但我们无法new一个IDE、SATA、PCI、PS-2。因此,接口要构造方法何用?接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器的调用次序,构造器是属于类自己的,不能继承,因为是纯虚的,接口不需要构造方法。而抽象类是具体类的祖先,即使是石器时代,也总要干些初始化的工作,抽象类虽然是不能直接实例化,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都,都会调用父类的构造方法,初始化一个类,先初始化父类,有没有说初始化接口。
1)Java中抽象类和接口中有构造方法吗?
在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。
A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,
B. 类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序
C. 构造器是属于类自己的,不能继承。因为是纯虚的,接口不需要构造器。
在抽象类中可以有构造方法,只是不能直接创建抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类。
A.方法名与类名相同;
B.没有返回类型(例如return、void等);
C.不能被static、final、native、abstract和synchronized修饰,不能被子类继承。
D.父类的构造方法不能被子类调用,可以通过super语句调用父类的构造方法。
E.构造方法可以重载,以参数的个数,类型,顺序,分为空参构造方法和有参构造方法。
注:
抽象类中不一定有抽象方法,抽象方法一定存在于抽象类中。
继承抽象类的可以是普通类,但必须重写抽象类中的所有抽象方法,也可以是抽象类,无需重写抽象类中的所有抽象方法。
注:
可以说是一种特殊的抽象类,里面的方法全是抽象方法。
子类实现接口必须对接口中的方法全部重写。
1)接口不能有构造方法,抽象类可以有。
2)接口不能有方法体,抽象类可以有。
3)接口不能有静态方法,抽象类可以有。
4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。
-
抽象类必须要有抽象方法吗?
2019-07-22 14:36:512.抽象类可以没有抽象方法 3.一个类如果包含抽象方法,那么这个类必须是抽象类,否则编译就会报错。 4.最关键的一点就是如果一个类是抽象类,那么这个类是不能被实例化的。 如下: public abstract cl...答案是:不必须。
这个题目主要是考察对抽象类的理解。
说一下我个人的理解吧。
1.如果一个类使用了abstract关键字修饰,那么这个类就是一个抽象类。
2.抽象类可以没有抽象方法
3.一个类如果包含抽象方法,那么这个类必须是抽象类,否则编译就会报错。
4.最关键的一点就是如果一个类是抽象类,那么这个类是不能被实例化的。
如下:
public abstract class MQTest { }
现在user这个类就是一个抽象类,如果直接 使用该类创建新对象是行不通的,编译直接报错。
抽象类只能用其子类(该子类不能是抽象类)去创建新对象。
接下来我就用狗的例子来说明,先创建一个动物类(抽象类),然后创建一个狗类(抽象类),狗下面再分为金毛和二哈(非抽象类)。
动物类:
package com.xingli.abstractDemo; import lombok.Data; /** *@ClassName Animal *@Description 动物抽象类 *@Auther William *@Date 2019/7/22 14:11 *@Version 1.0 */ @Data public abstract class Animal { //定义一个抽象的“让动物叫”的方法 public abstract void say(); }
狗类:
package com.xingli.abstractDemo; /** *@ClassName Dog *@Description 狗类的抽象方法 *@Auther William *@Date 2019/7/22 14:13 *@Version 1.0 */ public abstract class Dog extends Animal{ //默认继承父类的say方法 }
金毛:
package com.xingli.abstractDemo; /** *@ClassName JINMAODog *@Description 金毛 *@Auther William *@Date 2019/7/22 14:16 *@Version 1.0 */ public class JINMAODog extends Dog{ //实现父类的抽象方法 @Override public void say() { System.out.println("金毛:我的名字叫金毛"); } }
二哈:
package com.xingli.abstractDemo; /** *@ClassName ERHADog *@Description 二哈 *@Auther William *@Date 2019/7/22 14:21 *@Version 1.0 */ public class ERHADog extends Dog{ @Override public void say() { System.out.println("二哈:我的名字叫二哈"); } }
直接父类创建新对象:结果报错
使用动物子类创建新对象,因为狗类也是抽象接口所以也报错
使用非抽象子类创建新对象(正确)
public class Test { public static void main(String[] args) { Animal erhaDog = new ERHADog(); Animal jinmaoDog = new JINMAODog(); erhaDog.say(); jinmaoDog.say(); } }
-
Java抽象类中是否可以有构造方法
2021-03-23 10:40:52所以既然抽象类是不允许被实例化的,那么他的构造方法存在是否还有实际意义? 直接上例子 //抽象父类 abstract public class Shape { public Shape(){ System.out.println("这是Shape的构造方法"); } p直接给答案:可以
无论是无参构造方法,还是有参构造方法都可以正常存在
之所以产生这个疑问,是因为Java抽象类本身的要求抽象类是不能被实例化的,抽象类只能作为其他类的父类,或者通过向上转型指向其子类。所以既然抽象类是不允许被实例化的,那么他的构造方法存在是否还有实际意义?
直接上例子
//抽象父类 abstract public class Shape { public Shape(){ System.out.println("这是Shape的构造方法"); } public Shape(String test){ System.out.println(test); } abstract public double area(); } //子类 public class Circle extends Shape { public final double PI=3.14; private double r; //半径 public Circle() { } public Circle(double r) { super("测试"); this.setR(r); } public double getR() { return r; } public void setR(double r) { this.r = r; } @Override public double area() { return PI*this.getR()*this.getR(); } } //子类 public class Rectangle extends Shape { private double length; private double width; public Rectangle() { } public Rectangle(double length, double width) { this.setLength(length); this.setWidth(width); } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } @Override public double area() { return this.getLength()*this.getWidth(); } } //测试类 public class TestShape { public static void main(String[] args) { Shape shape1 =new Circle(3); Shape shape2=new Rectangle(3,4); System.out.println("圆的面积为:"+shape1.area()); System.out.println("矩形的面积为:"+shape2.area()); } }
这里是程序的输出结果
显然,抽象父类的构造方法都被执行到了简单解释下原因,在实例化子类对象的时候,无论子类的父类是不是抽象类都会先调用父类的构造方法,如果你在实例化子类对象的地方打上断点逐步执行,你会发现在执行子类构造方法之前会先进到父类中执行父类的构造方法,初始化一个子类会先初始化父类。
所以父类的构造方法是会被执行到的,可以在其中完成一些你的业务逻辑
-
Java中的抽象类可以有构造函数吗?/抽象类中的构造方法作用是什么?
2021-03-21 16:16:24答案是肯定的。...虽然抽象类不能被实例化,但是可以在构造方法中初始化一些参数;也可以在子类中调用父类的构造方法。 阅读如下代码: 父类: public abstract class Demo1 { String name; String se -
抽象类能实例化吗
2021-02-12 14:14:53抽象类能实例化吗?这个问题我想了一个晚上,看了好几篇...也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)现在重点来了,要研究这个问题,前提是你... -
抽象方法必须在抽象类中吗
2021-03-11 10:44:32抽象方法必须在抽象类中吗2020-07-01 15:01:18文/叶丹1、抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法。2、Final类中的属性和方法都必须被final修饰符修饰。3、最终类不能派生子类,最终方法不能被... -
抽象类可以实例化吗?
2019-08-15 16:07:59抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。这其实用到了多态,向上转型。父类引用指向子类对象~ ... -
带你了解什么是抽象类,抽象类不能够被实例化为什么还有构造方法?
2020-06-03 09:52:19接口是我们常用的,抽象类好像并不是怎么常用,但这并不代表他不重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。 抽象类的出现使得... -
抽象类中是否一定要有抽象方法?
2020-06-11 09:20:14抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则... -
JAVA抽象类不能实例化为什么有构造方法
2020-11-15 00:07:20java规定类都要有一个构造方法,没有默认提供一个空参构造 ...抽象方法需要被字类继承,字类的构造方法中是用super()调用父类的构造方法实例化的,如果抽象类没有构造方法,那么久无法被字类继承了。 ... -
抽象类的实例化方法
2018-10-31 22:00:30抽象类的实例化方法 抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。 ... -
Java关于抽象类能否被实例化的问题
2021-02-27 12:43:48转载:...而且,自己也知道,抽象类作为父类,其子类是能调用他的属性和已实现方法的。这证明抽象父类在内存是有一定空间的。(百度百科说:实例化其实就是在内存中开放一个空间用于存储新的产... -
Java中抽象类和接口中有构造方法吗?
2019-04-18 20:22:00(1) Java中抽象类和接口中有构造方法吗? ①在接口中 不可以有构造方法 在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。 A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需... -
不能实例化抽象类&抽象类不能实例化
2020-12-02 14:19:14在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么... -
java抽象类可以被继承吗?
2021-03-06 06:39:35Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行... -
关于抽象类无法实例化,但是可以使用“new“来实例的疑问
2020-07-04 20:30:41关于抽象类无法实例化,但是可以使用"new"来实例的疑问. 背景:昨天下午回答一个实习生问的问题,大致的经过是这样的: 他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类... -
java中抽象类也需要构造函数 抽象类可以被实例化
2018-12-13 05:11:59今天被问到抽象类要不要有构造函数的时候, 我随口一答应该是没有的, 我以为, 抽象类是不能直接用new来被实例化的, 所以也就不需要再去写构造函数了; 随后查了一下明白: 抽象类也需要构造函数, 在大多数情况中抽象类... -
抽象类是不是必须要有抽象方法
2021-08-15 23:57:30抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定... -
抽象类可以被实例化吗?匿名类又是什么?
2018-06-21 11:27:32public class TestClass { private InterfaceA a = new InterfaceA() { @Override public void testA() { ...//成员匿名类,例如在Android开发中常用的Handler。 public static void main(St... -
java抽象类经典实例分享
2021-02-12 11:07:34在这之前有给大家详细的介绍过java抽象类,相信很多人应该都比较了解了,那么下面就要继续来给大家分享一个java抽象类的实例。题目:不同几何图形的面积计算公式是不一样的,可是,它们具有的特性是一样的,都具有... -
抽象类不能进行实例化吗?
2017-07-26 10:55:44抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。 -
接口能否继承接口?抽象类能否实现接口?抽象类能否继承具体类?抽象类中能否有静态的main方法?
2020-12-02 13:38:45接口可以继承接口。 抽象类并不能继承接口,但可以实现...抽象类可以有静态的 main 方法。抽象类在面向对象中是被用来描述现实中的抽象事物, 抽象类没有对象概念所以不能被实例化. 但可以定义属性和方法, 其中属性方. -
Java抽象类中的静态方法
2018-12-06 20:09:26抽象类中是可以有静态方法的,在被子类继承后可以通过子类的实例化对象调用;也可以直接通过抽象类和子类的类名来调用,就像其他的静态方法一样。同样的静态变量也可以使用相同的方法访问。 实例: package ... -
java抽象类和抽象方法
2021-03-07 00:02:17一、什么是抽象类和抽象方法没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类,抽象类必须被abstract修饰。抽象方法就是只有方法声明,没有方法体的方法。抽象类的使用一般通过继承来实现... -
关于为什么抽象类不可以被实例化
2018-04-26 20:17:11个人想法为什么抽象类不可以被实例化?首先有2个设定在:含有抽象类的方法必须被...虽然抽象类中不一定有抽象方法,但一旦有抽象方法时,就可以通过点方法调用,导致1、2两个设定相悖。所以抽象类不可以被实例化。...