接口以及抽象类
一. 接口(interface)
1.1定义接口
java的接口中,我们通过 interface 关键字来定义一个接口;
public interface Person {
//变量定义
public static final String food = "xiangjiao";
//方法定义
public abstract void run();
public void eat();
}
注意事项:有没有发现我在这里面写了一个普通的方法,并没有使用 abstract 将其变为抽象类,这个现在是可以的哦。官方说到:接口体可以包含抽象方法, 默认方法,和静态方法。 链接: https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
1.2接口的实现
首先,说明一点,接口可以继承接口,但是不可以接口实现接口。
java中我们通过 implements 来实现一个我们需要的接口
public class OldMan implements Person {
@Override
public void run() {
System.out.println("OldMan,迎着微风向前跑");
}
@Override
public void eat() {
System.out.println("OldMan,坐着板凳等吃饭");
}
注意事项:实现接口的子类,要实现接口中的所有方法,其中方法名,参数个数,参数类型,返回值必须完全一致,完全一致,必须完全一致。
二. 抽象类
2.1定义抽象类
java中,我们通过 abstract 来描述一个类,将其定义为一个抽象类。
abstract class AbstrantMan {
abstract void eat();
abstract void run();
abstract void laugth();
public void play() {
System.out.println("haha");
}
注意事项 抽象方法不可以被private或者static关键字进行修饰,private修饰的方法只可以在本类中使用,而抽象类中的抽象方法必须被继子类重写,这样一来就产生了冲突,至于static,简单说一点,static方法不能被覆盖,也就是说,这个类的子类,不能有相同名、相同参数的方法,这个又和抽象方法的继承产生了冲突。
2.2继承抽象类
java中,我们通过 extends 来继承抽象类。
public class AbstrantOldMan extends AbstrantMan {
@Override
void eat() {
System.out.println("AbstrantMan,吃完饭");
}
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("AbstrantMan,吃完饭,去跑个步");
}
@Override
void laugth() {
// TODO Auto-generated method stub
System.out.println("吃完饭,去跑个步,充实的笑弯了腰");
}
到了这里我们就可以通过实例化AbstrantOldMan来调用继承过来后重写的方法。
三. 接口和抽象类的区别
相同点
- 接口和抽象类都能定义属性和方法
- 接口和抽象类都只是特殊的类,都是通过子类来操作
- 抽象类和接口中都可以没有抽象方法
- 接口和抽象类都不能直接创建对象
- 接口和抽象类都可以利用多态操作
- 抽象类和接口的子类都必须实现里面的抽象方法
- jdk1.8以后,接口和抽象类都可以拥有带有方法体的方法
不同点
- 接口可以多实现,而抽象类只能单继承
- 抽象类可以像普通类一样有自己的普通方法,但是接口不可以
- 属性上,接口中只能是public static final修饰的,抽象类中任意
- 抽象类中可以拥有静态代码块的,接口中不能拥有静态代码块
- 抽象类可以拥有自己的构造,接口没有构造,不能拥有
- 接口在1.8之后可以拥有default修饰的方法,抽象类没有