抽象类和接口
搭配多态使用的重要语法特性
抽象类
Java中使用abstract关键字来描述抽象类和抽象方法
abstract关键字存在的意义,就是让程序员明确的告诉编译器,这个类就是一个抽象的类,不应该进行实例化,于是编译器就要做好相关的检查工作
抽象类本身就是用来表示一个不太具体的概念
抽象方法,就更不具体,里面甚至没有实质的实现
//抽象类,
//如果尝试创建抽象类的实例,就会编译报错
abstract public class Text {
//给方法前头加上abstract,此时这就是一个抽象方法
//抽象方法不需要方法体
//抽象方法只能在抽象类中存在(也可以在接口中存在),但不可以在普通类中存在
//抽象方法的意义就是让子类进行重写
abstract public void run();
}
除了不能实例化之外,其他的语法规则都和普通类一样 1.抽象类中也可以有普通的属性和方法 2.抽象类也可以有静态的属性和方法 3.抽象类也可以继承其他的类,还可以被其他的类继承
接口
接口是抽象类的更进一步(比抽象类还抽象)
抽象类只是不能实例化,但是其他各个方面都和普通的类差不多
而接口不光不能实例化,同时也不具备类的各种特性
接口中也可以放抽象方法,这里的抽象方法不必写abstract关键字(写或者不写都是抽象方法)
接口中不能放普通的方法、
接口中也不能放普通的属性
只能放public static final修饰的属性
接口不能继承自其它的类,但是可以继承自其他的接口
接口不能被类继承,而是被其他类“实现”,
某个类,实现(implements)了这个接口
与抽象类的对比:
- 抽象类和普通的类差不多,只是不能实例化,而接口和普通的类之间相去甚远,(包含的属性,和其他类的关系)
- 一个类只能继承自一个抽象类,但是一个类可以同时实现多个接口
接口存在的意义:
解决Java中不能多继承的问题
Java中的继承是单继承,有些场景下多继承是有用的,Java中可以通过继承一个类,实现多个接口的方式来完成类似于多继承的效果、
接口相当于一种约束,要求了实现该接口的类 ,必须重写所有的接口中的抽象方法
package Text;
abstract public class Animal {
public String name;
public Animal(String name){
this.name = name;
}
}
package Text;
public interface IRunning {
void run();
}
package Text;
public class Cat extends Animal implements IRunning {
public Cat(String name){
super(name);
}
@Override
public void run(){
System.out.println(name + "正在跑");
}
}
package Text;
public class Text1 {
public static void main(String[] args) {
Cat cat = new Cat("yys");
cat.run();
}
}
//输出结果:yys正在跑
接口是一个非常有用的语法机制,如果所有代码都是一个人完成,此时接口的意义就不大了。
若这个代码需要很多人协同开发,此时接口就非常具有意义
每个人需要负责一部分模块,模块和模块之间往往需要一些相互调用,例如:模块A需要给模块B提供一些类/方法进行使用,实现A模块的程序员就可以和实现B模块的程序员约定UI系列的interface(接口在创建时应:new---Javaclass--interface)
此时调用者就按照interface中约定的接口来去编写调用的代码,实现者在提供一些类来完成interface的实现。