Java入门(二十六)
抽象类
- 抽象类通过abstract修饰类。我们现在写一个Action类,他是个普通的类
但是只要在他前面生成abstract,他就变成抽象类了。
- 假设想再一个方法上面做一些事情,假设这个方法里面没有任何东西,是一个约束。如下,只有方法的约束,没有方法的名字。
- 抽象方法只有方法名字,没有方法的实现。我们再来一个A类,要去继承这个抽象类。这时候就会报错,说如果要继承就必须重写抽象方法
- 抽象类所有方法必须由子类实现,继承了他的子类,他的子类都必须要实现它的方法。除非他的子类也是给abstract就没必要实现了,因为他的子类本身也是抽象的。
- 抽象类本质是类,他需要继承,因此逃脱不了extends这个关键字。extends他有局限,他是单继承。单继承无法继承多个类,如果有多继承就好了。
- java里面是没有多继承的,但是有句话:接口可以多继承。
- 比如插座可以插很多东西,就这么可以约束他可以插什么头,但是并没有约束什么电器才可以插上去。
- 抽象类没有什么特点,最大特点就是不能new出来。抽象类只能靠子类去实现它,就是约束。
- 抽象类里面他可以有一些正常的方法,但是假设方法存在抽象方法,他不能不是抽象类,他必须声明为抽象类。抽象类里面可以写普通方法,抽象方法必须在抽象类中。
- 抽象类就是抽象的抽象。
- 既然抽象类不能new,那么他存在构造器吗?抽象类存在的意义是什么?
- 比如创建一个游戏角色比较麻烦,要重复创建,那么我们就可以把他的一些公有属性一起抽象出来。每创建一个就自动继承他的抽象类,然后重写他的方法就好了,改掉一些不必要的东西。节省代码开发,可扩展性高。
接口
- 接口跟其他不一样,它定义的关键词都不是class。首先普通类只有具体的实现,而抽象类具体的实现可以有,抽象方法的实现也可以有,只是他不能new,只能通过子类去操作。而接口只有规范,他连实现都没有了。自己无法写方法。
- 为什么需要接口?接口就是比抽象类更抽象的抽象,是专业的抽象,专业的约束,可以约束和实现的分离。以后进公司可以说就是面向接口编程,就是别人把接口定义好了,你往里面写方法就好了。抽象类还提供了一些具体的实现,在系统开发中,会把系统的接口全部设计好,文档定义好。
- 接口就是规范,定义的是一组规则,就好比现实世界中”如果你是…则必须能…“的思想:如果你是天使必须能飞,如果你是汽车必须会跑,如果是好人必须干掉坏人。
- 接口的本质是契约,就像人间法律,制定好后大家都要遵守。面向对象的精髓就是对对象的抽象,最能体现这一点的就是接口
- 声明类的关键字是class,声明接口的关键字是interface。
- 接口中无法写具体的方法,里面很多东西都是看不见的,而且都是public abstract的。你写上abstract他就变成灰色的了,其实他很多地方你不写他默认就是public abstract。
- 所以接口的方法正常来说可以直接写简单的方法和参数
public interface UserService {
void run(String name);
}
public interface UserService {
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
- 我们定义了四个方法,怎么去操作呢?其实这里只有定义而没有具体的实现,所以正常情况下需要实现类----接口都需要实现类。实现类会用Impl结尾
- 关键词是implements,一个类实现一个接口,实现接口就需要重写里面的方法,抽象类是通过extends,但是他有局限就是只能单继承。而implements可以继承多个。
- 只要实现了接口里面四个方法他就不会报错。实现了接口的类,必须重写里面的方法。
- 再来一个方法
public interface TimeService {
void timer();
}
- 咱们在UserServiceImpl实现一下
- 然后看到他并没有报错,这就实现了多继承
- 接口有他的弊端,接口跟类不一样,类里有方法的实现,但是接口只有方法的定义。
- 那么在接口当中想定义一些常量变量呢?在接口里面的属性他默认都是常量。
public static final int AGE = 99; // 一般不用
- java的接口是约束
- 接口可以定义方法,让不同的人实现。
- 接口默认的方法都是public abstract
- 常量都是 public static final
- 接口不能直接被实例化,因为接口中没有构造方法
- 接口可以实现多个,通过implements实现
- 必须重写接口中的方法