本文参照教科书《Java语言程序设计与数据结构(第11版)》以及网上资料进行编写。
参考网址:Java 抽象类 | 菜鸟教程 (runoob.com)
文章目录
前言
本文主要讲解了java的抽象类和接口相关知识点。
一、抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
- Java中用abstract class定义抽象类,如下实例:
public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } }
2.抽象方法
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个【分号】,而不是花括号。
public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); //其余代码 }
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
3.抽象类的相关说明
(1)包含抽象方法的类会自动变成抽象类,必须用abstract关键字,如果派生类没有重写抽象方法,编译器会报错。抽象方法用来被确保派生类会实现这个方法。
(2)抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。抽象方法是非静态的。
(3)抽象类不能使用new操作符来初始化。(可构造这个方法)
(4)包含抽象方法的类必须是抽象的,不能实例化。
(5)子类可以重写父类的方法并将它定义为抽象的。
(6)即使子类的父类是具体的,这个子类也可以是抽象的
(7)不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
下面语句创建一个元素是GeometricObject类型的数组是正确的:
GeometricObject[] objects = new GeometricObject[10];
(8)然后可以创建一个GeometricObject的实例,并将它的引用赋值给数组,如下所示:
objects[0]=new Circles();
二、接口
1.接口的定义:
接口是一种与类相似的结构,用于为对象定义共同的操作。
类和接口之间的关系成为接口继承,因为接口继承和类继承本质上是相同的,所以我们将它们都建成为继承。
为了区分接口和类,Java采用下面的语法来定义接口:
modifier interface InterfaceName{
/**Constant declarations*/
/**Abstract method signatures*/
}
2.接口的相关特性:
(1)接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为public abstract(只能是public abstract,其他修饰符会报错)。
(2)接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final 变量(并且只能是public,用private修饰会报编译错误)。
(3)接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
(4)接口中的方法都是共有的。
3.接口的举例:
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
4.重写接口中声明的方法时,需要注意以下规则:
- 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
- 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
- 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
5.在实现接口的时候,也要注意一些规则:
- 一个类可以同时实现多个接口。
- 一个类只能继承一个类,但是能实现多个接口。
- 一个接口能继承另一个接口,这和类之间的继承比较相似。
三、抽象类和接口的区别
- 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
总结
以上就是本文的所有内容,感谢观看。