抽象&接口
抽象类的特点:
<1> 抽象方法一定在抽象类中
<2> 抽象方法和抽象类都必须被abstract关键字修饰
<3> 抽象类不可以用new创建对象,因为调用抽象方法没意义
<4> 抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用; 如果子类只覆盖了部分的抽象方法,那么该子类还是一个抽象类。
<5> 抽象类中可以有抽象方法也可以有非抽象方法
<6> 抽象类和一般类没有太大的不同: 该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂得东西。这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体
<7> 抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法; 抽象类不可以实例化。
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让改类建立对象。
抽象类的成员特点:
1:成员变量:子类可以直接继承抽象类中的成员变量。(抽象类中的成员变量可以和以前是一样的)
2:成员方法:抽象类中分为两种方法,一种是抽象方法,这种方法在子类中必须要被实现。一种是普通的方法。可以被子类直接继承使用。
3:构造方法:抽象类不能被实例化,那么它有构造方法吗?抽象类是class,那么它就有构造方法。它的构造方法有用吗?有,为了让子类实例化的时候使用。
模板方法:
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。有该类的子类去实现。
抽象关键字abstract不可以和哪些关键字共存?
private
私有的,外部直接无法访问。
static
那么这个时候抽象方法就可以可以通过类名调用,但是这样是没有意义的。
final
final修饰的方法不能被重写。所以它和abstract冲突。
接口(interface)
接口的由来:当一个类中所有的方法都是抽象的时候,你没必要定义为抽象类,定义为接口就可以了。
接口与类属于同一层次,实际上,接口是一种特殊的抽象类。
一个类实现接口,相当于它继承一个抽象类
接口解决了java中只能单继承的问题。(对多继承进行了优化)
1:类与类:只能是单继承。 extends
2:接口与接口:可以是单继承,也可以是多继承。 extends
3:类与接口:可以是单实现,也可以是多实现。 implements
(3)成员特点:
1:只有成员变量和成员方法。
2:成员变量 默认修饰符 public static final
int X = 20;
其实是这样的 public static final int X = 20;
3:成员方法 默认修饰符 public abstract
void show();
其实是这样的 public abstract void show();
接口和抽象类的区别:
1:抽象类只能被单继承;接口可以被多实现。
2:抽象类中的成员:成员变量:可以是常量,也可以是变量。
成员方法:可以是抽象的,也可以是非抽象的。
构造方法:虽然不可以创建对象,但是可以给子类实例化用。
接口中的成员:成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象的。默认修饰符 public abstract
3:抽象类中定义的是体系结构中的共性的内容。
接口中定义的是对象的扩展功能。
4:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。
接口被实现表示的是: "like a"的关系。xx像yy中的一种。
总结:
如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。
abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。
abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。
final和abstract永远不会同时出现。
如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须为抽象类,这与此类为非抽象冲突,所以报错。
所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。
抽象是所有对象的共性功能而接口是对象的扩展功能