1、抽象类
类的层次结构中,越往下继承的子类其属性和方法越来越具体。相反,越上层的祖先类其实现越抽象,甚至无法给出具体实现。例如,一个圆或矩形有面积,但祖先几何图形类的getArea()方法没法给出具体实现,这时可以定义为抽象方法。 Java中可以定义不含方法体的方法,方法的方法体由该类的子类根据自己的情况去实现,这样的方法称为抽象方法(abstract method),抽象方法的声明必须加上abstract关键字。包含抽象方法的类必须是抽象类(abstract class)。抽象类的声明必须加上abstract关键字。 抽象类和抽象方法的声明要加上abstract关键字。 抽象类的几点说明 (1)抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,抽象类扩展的非抽象子类中,必须实现所有的抽象方法。 (2)抽象方法是非静态的。(只有实例方法可以声明为抽象方法。) (3)不能使用new操作符来实例化抽象类。但仍然可以定义它的构造方法,这个构造方法被它子类的构造方法中调用。 (4)包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用new操作符创建该类的实例。这种类是用来定义新子类的父类的。 (5)抽象类的父类可以是具体类。即使子类的父类是具体的,这个子类也可以是抽象的。 (6)子类可以重写父类的方法并将它定义为abstract。这是很少见的,但是它在当父类的方法实现在子类中变得不合法时是很有用的。在这种情况下,子类必须被定义为abstract。 (7)不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以被用作一种引用变量的数据类型。 抽象类的用意:抽象类只能用来被继承,或用来声明引用变量,不能实例化。 抽象方法的用意:模板方法,推迟到子类中实现的方法。 2、接口 接口是常量和抽象方法定义的集合。接口在许多方面都与抽象类很相似,但是它的目的是指明多个对象的共同行为。 语法 修饰符 interface 接口名 { 常量声明 抽象方法声明 } 接口体中的常量隐式地声明为 public static final 接口体中的方法隐式地声明为 public abstract![](/i/l/?n=23&i=blog/2537443/202303/2537443-20230331163028586-660757474.png)
接口中的方法通过“接口类型的引用变量.方法名”访问,但接口类型的引用变量必须指向实现了该接口的类的实例对象。 接口中的常量名通过“接口名.常量名”访问。 使用接口 可以在能够使用任何其他数据类型的地方使用接口。 接口类型属于引用类型,接口类型的变量可以存储: 空引用(null) 任何实现该接口的类的实例的引用 类实现接口的语法 修饰符 class 子类名 [extends 父类名] [implements 接口名列表 ] { 成员声明 } 除非类被声明为abstract,所有父接口中声明的成员方法必须被实现。一个类只能继承一个父类,但可以实现多个接口,多个接口以“,”分开。 如果接口声明中提供了extends子句那么该接口就继承了父接口的方法和常量。 任何实现该接口的类,必须实现该接口继承的其他接口。 3、是使用接口还是类? 抽象类和接口都是用来建模对象的共同特征。那么该如何确定在什么情况下使用接口,什么情况下使用类呢?一般来说,详细描述父子关系的强是关系(strong is-a relationship)应该用类建模。例如:职员是人,所以他们的关系是用类继承建模的。弱是关系(weak is-a relationship)也称为类属关系(is-kind-of relationship),它表明对象拥有某种属性。弱是关系可以用接口来建模。例如:所有的字符串都是可比较的,因此,String类实现Comparable接口。如果需要多重继承的话,您还可以使用接口来规避单继承的限制。在多重继承的情况下,你必须设计一个超类,而其它作为接口。 标签:子类,abstract,接口,抽象,抽象类,方法 From: https://www.cnblogs.com/qiqi-yi/p/17276709.html