抽象类、 接口
一、抽象
1.abstract
abstract修饰类,则为抽象类,修饰方法则为抽象方法;包含抽象方法的类有点为抽象方法;由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。抽象中抽象构造方法,类方法(用static修饰的方法)不能声明为抽象方法。抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
public abstract class Employee
{
private String name
;
private String address
;
private int number
;
public abstract double computePay();
}
二、 接口
1. interface
implement
接口就是规范,定义的是一组规则,体现接口是特殊的抽象类;接口中的抽象方法必须是两个固定的关键词(public abstract)可以选择省略不写;从java8开始,接口中可以定义默认方法;public default返回类型 方法名(参数列表){方法体}接口中的默认方法用于解决接口升级问题;默认方法会被实现类继承下去;接口的默认方法可以通过接口的实现对象直接调用;接口的默认方法也可以被接口尘实现类覆盖重写;
2. 接口与类的区别:
接口不能用于实例化对象。 但是可以定义变量;接口变量可以引用静态实现类的实例;接口只能被实现;一个具体类实现接口,必须实现接口 的所有抽象类;接口没有构造方法。接口中的属性默认是常量 public static final接口中所有的方法必须是抽象方法。接口不能包含成员变量,除了 static 和 final 变量。接口不是被类继承了,而是要被类实现。接口支持多继承。
3. 接口特性
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是public,用 private修饰会报编译错误)。接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。不能通过实现类的对象来调用接口中的静态方法;(可以通过接口名称.静态方法名称)java 9+以后可以在接口中使用私有方法;(private 返回值类型 方法名称(参数列表){方法体})
4. 抽象类和接口的区别
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。接口没有构造方法。抽象类中有构造方法;接口不能包含初始化快。抽象类中能包含初始化快;抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。接口中不能含有静态代码块,从java8以后就可以在接口中使用静态方法(用static修饰的方法,格式:public static 返回值类型 方法名称(参数列表){方法体}),而抽象类是可以有静态代码块和静态方法。一个类只能继承一个抽象类,而一个类却可以实现多个接口。
Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。:
import java
.lang
.*
;
public interface NameOfInterface
{
}
5. 接口的实现
...implements 接口名称
[, 其他接口名称
, 其他接口名称
..., ...] ...
interface Animal {
public void eat();
public void travel();
}
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();
}
}
以上实例编译运行结果如下:
Mammal eats
Mammal travels