精华内容
下载资源
问答
  • 抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 3.抽象类可以继承实体类,就是因为抽象类的可以继承性和有方法。 4、一个接口可以继承多个接口. interface C ...

    1、接口可以继承接口,抽象类不可以继承接口,但可以实现接口。

    2、抽象类可以继承实体类。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

    3.抽象类可以继承实体类,就是因为抽象类的可以继承性和有方法。

    4、一个接口可以继承多个接口. interface C extends A, B {}是可以的. 一个类可以实现多个接口: class D implements A,B,C{} 但是一个类只能继承一个类,不能继承多个类 class B extends A{} 在继承类的同时,也可以实现接口: class E extends D implements A,B,C{} 这也正是选择用接口而不是抽象类的原因。

    展开全文
  • 抽象类可以实现(implements)接口抽象类可以继承具体类。抽象类中可以有静态的main方法。问: 抽象类是否可继承实体类 (concrete class)答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。答案很...

    接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。

    问:  抽象类是否可继承实体类 (concrete class)

    答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。

    答案很明确,可以继承。其实从Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。

    关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。

    一般学习者会写的简单试验代码:

    class A{}

    abstract class B extends A{}

    结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。

    这个问题涉及到两个个基础知识:

    1. 所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。

    2.所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。

    所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是

    class A{

    public A(){}

    }

    B继承 A 的时候,则是

    abstract class B extends A{

    public B(){

    super();

    }

    }

    要试验出这继承规则的内部情况,也很简单,在最上面那个简单试验代码里,加上个私有构造器,有参无参都行。

    class A{

    private A(){}

    }

    这个时候,如基础知识(1) 中所说,系统不再给你默认无参构造器, B的构造器根据(2)中的规则去调用super(),却找不到A的无参构造器,所以导致abstract class B extends A{} 编译不能通过。(因为A中没有任何构造器可供子类调用,其实这个时候A只能够供内部类继承,我用的Eclipse的3.4版本会建议给B改名,但是这解决不了这个问题。)

    现在,你应该了解了资料给的那句语焉不详的“实体类必须有明确的构造函数”的含义:

    1.没写构造器的,那是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。

    2.写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。

    3.写了 有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。

    4.声明为final的以及所有构造器都不在子类访问权限之内的类无法继承

    其实只要是在类的继承中,无论抽象还是实体,都需要符合这个规则的。在这个继承试验中随时删掉或是加上abstract的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。

    我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”

    抽象类中可以有静态的main方法。

    public abstract classTest14 {public static voidmain(String[] args) {

    System.out.println("abc");

    }

    }

    运行结果:abc

    这个程序可以运行的,你虽然是定义类Test14是抽象的。但是在你类里面是没有抽象方法的,实际你这个类是非抽象的,所以能运行的,如果你定义一个抽象方法fangfa(),并且在main方法中用到这个抽象方法fangfa()时就不能用了.

    abstract 修饰符

    抽象类:

    抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

    一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

    抽象类可以包含抽象方法和非抽象方法。

    抽象方法

    抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。

    抽象方法不能被声明成 final 和 static。

    任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

    如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

    抽象方法的声明以分号结尾,例如:public abstract sample();。

    展开全文
  • 在实施接口中,我们利用interface语法,将interface从定义中独立出来,构成一个主体。...接口继承接口继承(inheritance)与继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。...

    在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。

    在继承中,我们为了提高程序的可复用性,引入的继承机制。当时的继承是基于类的。interface接口同样可以继承,以拓展原interface。

    接口继承

    接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。比如,我们以Cup作为原interface:

    interfaceCup {

    void addWater(intw);

    void drinkWater(intw);

    }

    我们在继承Cup的基础上,定义一个新的有刻度的杯子的接口,MetricCup

    ad605eb85b925a167da8906a0d1769bc.png

    接口如下:

    interfaceMetricCup extends Cup

    {

    intWaterContent();

    }

    我们增添了一个新的方法原型WaterContent(),这个方法返回一个整数(水量)。

    interface的多重继承

    在Java类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在Java中,interface可以同时继承多于一个interface,这叫做多重继承(multiple inheritance)。

    比如我们有下面一个Player接口:

    interfacePlayer

    {

    voidplay();

    }

    我们新增一个MusicCup的接口。它既有Cup接口,又有Player接口,并增加一个display()方法原型。

    interface MusicCup extendsCup, Player

    {

    voiddisplay();

    }

    (如何使用interface,见实施接口)

    抽象类

    在生活中,我们会有一些很抽象的概念。这些抽象的概念往往是许多类的集合,比如:

    粮食 (可以是玉米、小麦、大米)

    图形 (可以是三角形、圆形、正方形)

    再比如,我们之前举出了例子:

    人类 (可以是男人、女人)

    在组织这样的关系时,我们可以使用继承,比如:

    cef227a375caf5e17716bcb19cb5ba30.png

    根据我们的常识:

    "Food类的对象"的说法是抽象的。这样一个对象应该是属于Corn, Rice, Wheat子类中的一个。

    Food类有eat()方法 (食物可以吃)。然而,这样的一个动作是抽象的。粮食的具体吃法是不同的。比如Corn需要剥皮吃,Wheat要磨成面粉吃。我们需要在每个类中覆盖Food类的eat()方法。

    89a9d6939fe36f6f928ad4a2a14e9742.png

    抽象与具体

    Java中提供了抽象类(abstract class)的语法,用于说明类及其方法的抽象性。比如:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    abstract classFood {

    public abstract voideat();

    public void happyFood();

    {

    System.out.println("Good! Eat Me!");

    }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    类中的方法可以声明为abstract,比如上面的eat()。这时,我们不需要具体定义方法,只需要提供该方法的原型。这与接口类似。当我们在比如Corn类中继承该类时,需要提供eat()方法的具体定义。

    类中的另一个方法happyFood()并不是

    当一个类中出现abstract方法时,这个类的声明必须加上abstract关键字,否则Java将报错。一个abstract类不能用于创建对象。

    抽象类的继承

    我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,衍生类依然是一个抽象类。

    抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。

    总结

    interface继承,多重继承

    abstract method, abstract类

    展开全文
  • 最通俗的理解:抽象类与子类的关系像是“轿车”与“品牌”的关系,一样的油门刹车,近似的外形,几乎差不多的开车方式(大部分方法与属性具有共性),在轿车的基础之上,我们可以开一个天窗,加一个行李架(扩展功能)...

    作为Java的初学者,一开始很纠结于抽象类与接口之间的异同,经过一段时间的学习,记录一下体会吧,免得以后忘了。

    最通俗的理解:

    抽象类与子类的关系像是“轿车”与“品牌”的关系,一样的油门刹车,近似的外形,几乎差不多的开车方式(大部分方法与属性具有共性),在轿车的基础之上,我们可以开一个天窗,加一个行李架(扩展功能)或者选择以下手动自动挡车型(覆写父类,此时这个手动自动完全可以用来代表抽象方法)。

    而接口与实现接口的类之间的关系可以宽泛到“车”与“每种车”的关系,最简单的区别,所有的车都能开(交通工具哈,想到过山车的墙角罚站去),但是很明显学会骑自行车咱不能就直接去开汽车上路,虽然都叫“开(骑)车”(方法名),但是很明显操作手法不一样(具体方法不同)。

    现在问题来了,抽象类明显可以完成接口的工作吧,通过覆写父类的方法就可以达到与实现接口相同的功能,那还要接口干什么?这个问题也是当时最困扰我的地方,现在从三个方面说一下解释吧。代码操方面,Java不支持多继承,但是支持实现多个接口所以在某些时候抽象类会有所局限。代价方面,如果有方法会被多个子类不做改变地实现,选择抽象类挺好,但是当方法会被几乎所有子类改变的时候,看情况吧,要是之后要加上通用功能,参照前面,要是需要”多继承“那就是接口了。逻辑方面:抽象类与子类从本质上是一样的,而接口就是个招牌,谁要就给谁(实现),但是它也不管那些类到底干啥(夸张了)。

    https://blog.csdn.net/Hhc0917/article/details/54755001大神的博客

    展开全文
  • 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承"关系的重要特性:通常简称为"IS_A"关系,UML类图可以这么表示:继承的语法class 子类名 extends 父类名 {……}注意:父类(parent class)和...
  • 在PHP中,继承,也叫的扩展。一、类继承的三大功能: 继承,重写,扩展
  • interface A //定义接口{public String name=null;public void print();public void tell();}abstract class B{public abstract void say(); //定义一个抽象类}class X extends B implements A...
  • 接口类的多继承以及抽象类的单继承一、接口类(面向对象开发的思想和规范)的多继承需求:定义一个tiger类:会走,会游定义一个hawk类:会走,会飞定义一个swan类:会走,会游,会飞(a)如果像以下代码的方式,则不能够...
  • ①一个实现一个接口,则该必须实现该接口中的所有方法,因为默认情况下该接口中的方法是公共的和抽象的,因此实现该接口必须重写所有接口的Method,例如: interface A { boolean add(); boolean offer1...
  • 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有方法名,没有方法体的东西,我实现它又有什么用呢?我从它那什么也得不到,除了一些方法名,我直接在具体里加入这些...
  • 只要一个类里面只要有一个方法是抽象方法,那么这个类就要定义为抽象类,反过来说就是抽象类里面不一定全都得是抽象方法。能被实例化的子类必须把抽象类的父类中的抽象方法全部都实现,否则报错,换句话说就是:子类...
  • I have the following interface:public interface SingleRecordInterface {public void insert(T object);}I have the abstract class below (that does not mention the method insert):public abstract class Abs...
  • 1.继承:父类和子类之间是层级...5)final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。 6)子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或
  • 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来...
  • java抽象类 继承

    千次阅读 2021-03-08 06:02:32
    关于java抽象类 继承的搜索结果回答抽象类和接口的区别:默认的方法实现抽象类可以有默认的方法实现完全是抽象的。接口根本不存在方法的实现。抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象...
  • 在实施接口中,我们利用interface语法,将interface从...接口继承(inheritance)与继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。比如,我们以Cup作为原interface: interface Cup { void ad.
  • 抽象类继承接口的实现 //接口 ... //抽象类可以不实现接口里的所有方法 //这里实现了test1方法 @Override public void test1(){}; } //写一个类来继承这个抽象类 public class Test extends Te
  • 在实施接口中,我们利用interface语法,将interface从定义中独立出来,构成一个主体。...接口继承接口继承(inheritance)与继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。...
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:海子来源:博客园一....如果一个类含有抽象方法,则称这个类为抽象类抽象类必须在类前用abstract关键字修饰。因为抽...
  • Java—接口抽象类

    2021-03-13 04:09:28
    1.语法层面上的区别1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;3)接口中不能含有...
  • PHP中的抽象类和抽象方法自己用的不多,但是经常会在项目中看到别人使用,同样,今天在看别人的代码的时候,发现使用了抽象类,就总结下:抽象类:1、如果一个类中有一个方法是抽象方法,则这个类就是抽象类;...
  • /*** 抽象类继承* 用abstract修饰类就是抽象类* 用abstract修饰方法就是抽象方法(一般使用比较少)* 抽象类不能被实例化*/public classMain {public static voidmain(String[] args) {Animal an= newCat();...
  • 它们的语法区别:1)接口不能有构造方法,抽象类可以有。2)接口不能有方法体,抽象类可以有。3)接口不能有静态方法,抽象类可以有。4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。忽然有此...
  • 问题描述:根据下面的接口和抽象类,去实现一个正方体类(Cube)计算它表面积和体积(必须实现接口继承抽象类),并且调用show成员函数输出结果.输出的格式为“长方体的长度=宽度=高度=?,表面积=?,体积=?”(其中?为实际...
  • 接着再用你的类继承这个抽象类,这个类中就只用实现你需要的方法了,这样就可以达到你的需要了。但是,如果你直接实现接口的话,你就需要实现接口的所有方法。通过下面例子,可以很好的理解:例:有一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 471,761
精华内容 188,704
关键字:

接口可以继承抽象类吗

友情链接: pdf.rar