什么是继承?什么是接口?他们之间的区别和联系是什么?
什么是继承?
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能。多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类称为子类,单独的那个类称之为父类,超类、或者是称为基类。
什么是接口?
接口在Java编程语言中是一个抽象类型,是抽象方法的集合,接口并不是类,编写接口的方法和类很相似,但是他们属于不同的概念,类描述对象的属性和方法,接口则主要是包含类要实现的方法。在人们讲到接口的时候,一般会有两方面的含义:第一种就是讲的Java接口,这是一种在Java语言中存在的结构,有特定的语法和结构;另一种仅仅是指一个类所具有的方法的特征的集合,是一种逻辑上的抽象。前者叫Java接口,后者就是叫接口。
一个Java接口是一些方法特征的集合,这些方法当然来自于具体的方法,但是他们一般都是来自于在系统中不断出现的方法。一个接口只有方法的特征,但是没有方法的具体实现,因为这些方法在不同的地方被实现的时候可能会有完全不同的功能或者行为。
在Java语言中,接口还可以被定义为public的常量。
二、方法的特征:
在Java语言规范中,一个方法的特征包括方法名、参数的数目和种类,但方法的返回值类型、参数的变量名、还有抛出的异常都不属于方法的特征。
在Java语言编译器检查方法的重载的时候就只是根据方法的特征进行判断两个方法是不是重载,但是在Java编译器检查方法的置换的时候,则会进一步的检查两个方法的返回值类型和所抛出的异常类型。
三、区分接口继承和实现继承
一个类实现一个接口,这种关系叫做接口继承,而一个类是另一个类的字类,这种关系叫做实现继承。接口继承和实现继承的规则是不同的,一个类最多只能实现继承一个超类,但是可以同时实现多个接口。
四、接口和类最重要的区别:
接口仅仅描述方法的特征,而不给出方法具体的实现;但是类不单单给出方法的特征,还给出方法的实现。因此接口把方法的特征和方法的实现分割开来。这种分割,体现在接口常常代表的是一个角色,它负责封装与该角色相关的操作和属性,而实现这个接口的类则是扮演这个角色的演员。想通过的角色可以由不同的演员来演,而不同的演员之间除了扮演的是同一个角色之外,并不要求有其他的共同之处。
五、为什么要使用接口
如果没有接口,可插入性就不会有保证,接口让可插入性变成可能。接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,声明周期越长,接口的重要性就越明显,接口使得软件系统在灵活性和可扩展性、可插入性方面得到保证。
六、Java接口常用的方法
单方法接口:接口中只有一个方法,这个方法可以看作是这个接口的唯一内容。这种做法可以看作是c语言中函数指针的对应物。
标识接口:表示接口是没有任何方法和属性的接口,表示接口不对实现它的类有任何的语义要求,它仅仅表示实现它的类属于一个特定的类型。标识接口通常使用在工具类中,在其他的类里边很少使用到。
常量接口:实际上,Java接口应当仅仅用来生命一种新的类型,而不应该用来干别的事情。接口常量是指的用接口来声明一些常量,然后有实现这个接口的类使用这些常量。这样一来,凡是实现这个接口的Java类都会自动的继承这些常量,并且都可以像使用自己的常量一样使用这些常量。
七、Java构建模型的顶端是Object类,所有的Java类,包括数组对象,都已这个类为超类。需要说明的是:这是一个具体的类,既不是Java接口也不是Java抽象类。
八、Java语言是类型安全的,Java语言依靠三种机制做到了这一点:编译期间的类型检查、自动的存储管理、数组的边界检查。任何被Java编译器接受的合法的Java类保证是类型安全的,在程序运行期间,不会有任何类型的错误。
继承的主要特点?
优点:
- 子类不能选择性的继承父类。
- Java语言只支持单继承,也就是一个类只能有一个父类。
- Java支持多层继承体系。
- 子类可以直接访问父类中的非私有的属性和方法。
- 对于构造器来说,子类只能是调用父类的构造器,不能继承。
- 继承的使用提高了代码的复用性。
- 继承让类和类之间产生了关系,这是多态的前提。
- 在面向对象设计程序的过程中使用继承原则,就是在每一个有一般类和特殊类形成的一般+特殊的结构中,把一般类的对象实例和所有特殊类的对象实例都共同拥有的属性和方法一次性的在一般类中进行显示的定义,在特殊类中不再重复的定义一般类中已经定义的东西。但是在语义上,特殊类却自动的隐含的拥有他的一般类的(以及所有更上一层的一般类)中定义的属性和方法。特殊类的对象拥有一般类的全部属性和方法。
缺点:
- 父类变,子类就必须会变
- 继承破坏了封装性,对于父类而言,他的实现细节对子类来说都是透明的
- 继承是一种强耦合关系。
- 接口无法被实例化,但是接口只能被别的类实现。
- 一个实现接口的类,必须实现接口内描述的所有的方法,否则就要声明为抽象类。
接口的主要特点?
- 接口无法被实例化,但是接口只能被别的类实现。
- 一个实现接口的类,必须实现接口内描述的所有的方法,否则就要声明为抽象类。
如何实现继承?
使用继承需要记住这几句话:
- 通过使用extends关键字让类与类之间产生继承关系。
- 子类拥有父类非private的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
接口和类的相似点?
- 一个接口可以有很多的方法。
- 接口文件保存在以.java结尾的文件中,文件名必须是接口名。
- 接口的字节码文件保存在.class结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中
接口和类的区别?
- 接口不能用于实例化
- 接口没有构造方法
- 接口中所有的成员方法必须是抽象方法
- 接口不能包含成员变量,除了static和final变量。
- 接口不能被类继承,只能被类实现。
- 接口是支持多“继承”的
什么时间用继承?什么时间用接口?
什么时候使用继承?
如果类之间的关系存在着:is a 的关系,就需要考虑使用继承,但是也不能为了继承某个类的部分功能就盲目的使用继承。
所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。
重写接口中声明的方法时需要注意一下几点:
- 类在声明接口的时候,不能抛出强制性,只能在接口中或者继承接口的抽象类中抛出强制性异常。
- 类在重写接口中的方法时,必须要保持方法名的一致性,并且返回值的类型也必须要相同或者相互兼容。
- 如果实现接口的是一个抽象类,那么就没有必要实现该接口中的所有方法。
继承中构造器的调用顺序是什么?
在具有继承关系的类进行实例化的过程中,构建实例的过程是从父类“向外”扩散的,也就是从父类开始向子类一级一级的完成构建,但是我们并没有显式的调用父类的构造器,这就是Java的高明之处:编译器会默认给子类调用父类的无参构造器。
默认调用父类的构造器是有前提的:父类必须有默认的构造器(父类的代码中没有显式的构造器),如果父类没有默认的构造器,那么我们在子类中就必须使用super()来显式的调用父类的构造器,并且必须是在子类构造器中的第一行代码,否则编译器就会报错。
接口的特性
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
- 接口中的每一个方法都是隐式抽象的,接口中的方法会被隐式的指定为public abstract,并且只能是public abstract,其他的修饰符都会被编译器报错。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量,并且只能是public static final 用其他的修饰符就会被编译器报错。
- 接口中的方法都不能在接口中实现,只能在实现接口的类对象里实现接口中的方法。
- 一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
抽象类和接口的区别
- 抽象类里边的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行,接口中的方法必须是抽象方法。
- 抽象类中的成员变量可以是各种类型的,但是接口中的成员变量只能是public static final类型的。
- 接口中不能含有静态代码块和静态方法,但是抽象类中可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,但是一个类可以实现多个接口。
标记接口
- 定义:标记接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型。
- 作用:简单形象地说就是给某个对象打个标记,是对象拥有某项或者是某些特权。
原文地址:https://www.cnblogs.com/BaoZiY/p/10146187.html