接口
1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口。
2 接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。
3 接口里面的方法默认都是public abstract类型的。隐式声明。
4 接口没有构造方法,不能被实例化。
5 接口不能实现另一个接口,但可以继承多个接口。
6 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类。
抽象类
1 如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。
2 抽象方法必须存在于抽象类中。
3 抽象类中可以有一般的变量和一般的方法。
4 子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。
private void print(){};此语句表示方法的空实现。
abstract void print(); 此语句表示方法的抽象,无实现。
接口和抽象类的区别
1 接口只能包含抽象方法,抽象类可以包含普通方法。
2 接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。
3 接口不包含构造方法,抽象类里可以包含构造方法。
抽象类不能被实例化,但不代表它不可以有构造函数,抽象类可以有构造函数,备继承类扩充
实例:
interface Person{
//(1)Illegal modifier for the interface field test1.person.c;
//only public, static & final are permitted
public static final String money = "200";
public final int brainCount = 1;
//1.默认是public static final,这是规范,标准
//2.字段如果不是public static final,会被实现它的类所修改,违背了接口的目的。接口就是把一类的共同点抽象出来
int bodyCount = 1;
//(2)接口方法只能是public abstract
public abstract void eatfood();
//默认隐藏作用域是public abstract
void drink();
}
abstract class ZLM implements Person{
//(3)抽象的属性任意修饰
public int hand = 2;
protected int eye = 2;
private int foot = 2;
private String say = "hello";
//(4)为什么抽象类有构造方法,接口却没有构造方法
//抽象类设计出来是用来实现多态(动态绑定),而且抽象类中可以有函数的具体实现。
//而接口不提供任何具体实现,它被设计出来用来允许你通过创建一个能够被向上转型为不止一种基类型的类,
//来实现一种C++多重继承(multiple inheritance 的变种。
public ZLM(int hand, int eye, int foot, String say) {
super();
this.hand = hand;
this.eye = eye;
this.foot = foot;
this.say = say;
}
//(5)抽象类的方法可以为一般方法,也可以有抽象方法
@Override
public void eatfood() {
// TODO Auto-generated method stub
String food = "bread";
}
abstract void sleep();
}
接口和抽象类的不同点有:
(1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
(2)抽象类可以有非抽象方法,而接口只能有抽象方法。
java中,类与类之间是不能多继承的。java之所以禁止类与类之间的多继承是因为多继承有很大的缺点。
多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。
上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?
正因为有以上的致命缺点,所以java中禁止一个类继承多个父类;但是幸运的是java提供了接口,并能通过接口的功能获得多继承的许多优点而又摒弃了类与类多继承的缺点。
java允许一个接口继承多个父接口,也允许一个类实现多个接口,而这样的多继承有上面提到的缺点马?
答案是没有,这是由接口的抽象性决定的。
正如前面介绍的,在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。