接口,抽象类

接口以及抽象类

一. 接口(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来调用继承过来后重写的方法。

三. 接口和抽象类的区别

相同点

  1. 接口和抽象类都能定义属性和方法
  2. 接口和抽象类都只是特殊的类,都是通过子类来操作
  3. 抽象类和接口中都可以没有抽象方法
  4. 接口和抽象类都不能直接创建对象
  5. 接口和抽象类都可以利用多态操作
  6. 抽象类和接口的子类都必须实现里面的抽象方法
  7. jdk1.8以后,接口和抽象类都可以拥有带有方法体的方法

不同点

  1. 接口可以多实现,而抽象类只能单继承
  2. 抽象类可以像普通类一样有自己的普通方法,但是接口不可以
  3. 属性上,接口中只能是public static final修饰的,抽象类中任意
  4. 抽象类中可以拥有静态代码块的,接口中不能拥有静态代码块
  5. 抽象类可以拥有自己的构造,接口没有构造,不能拥有
  6. 接口在1.8之后可以拥有default修饰的方法,抽象类没有
上一篇:图解设计模式 -- 生成实例(二)


下一篇:抽象类与抽象方法