抽象类
所有的对象都是通过类描绘的,但是并不是所有的类收拾用来描绘对象的。有的类中没有足够的信息描绘一个具体的对象-这种类为抽象类。
抽象类不能实例化对象–其余功能依然存在,成员变量、成员方法、构造方法的访问方式和普通类一样。
抽象类的定义:abstract class
抽象方法
抽象方法的定义:public abstract int cal();
只包含方法名,不包含方法体。方法名后面直接跟分号,而不跟花括号。
后果:一个类中包含抽象方法,则该类必须为抽象类;任何子类必须重写父类的抽象方法(或者干脆自己也为抽象类)
接口
接口并不是类。接口无法被实例化(即接口不可以创建对象,但是接口可以创建引用类型的变量,变量指向实现此接口的对象),但是可以被实现。一个实现接口的类要么实现所有的方法,要么声明为抽象类。接口也可被看作一种数据类型(后面会看到接口口的多态)
接口与类的区别:
- 接口没有构造方法
- 接口的所有方法均为抽象方法
- 不能包含成员变量(除了static final变量,若不加修饰,默认为已被static final修饰)
- 接口支持多继承
接口特性:
-
接口中的每个方法是隐式抽象的(默认带有public static且只能是这种修饰–方法均为公有,其余修饰会报错)
-
接口中的变量默认被static final修饰(且之能是这种修饰,其余会报错)
-
接口是隐式抽象的,声明时不用abstract
接口和抽象类的区别 -
抽象类中的方法可以有方法体即花括号,但是接口没有;
-
抽象类中的成员变量可以为各种类型的,接口中只有static final一种
-
接口中没有静态代码块和静态方法,抽象类可以有
-
一个类只能继承一个抽象类,但能实现多个接口
接口的继承
接口的继承使用extends。且接口支持多继承
public interface Son extends F1,F2
标记接口
没有任何方法和属性的接口。
目的:
- 建立一个公共的父接口
- 向一个类中添加数据
总结
什么时候使用抽象类和接口?
实现多继承–接口
既想拥有方法、也想拥有一些默认实现–抽象类
基本功能(函数)在不断改–抽象类
附:
JDK1.8中,允许给接口添加两种非抽象的方法实现(即可以有大括号有具体的方法实现):
- 默认方法——添加default修饰
- 静态方法——使用static修饰
interface TestJa8{
//defalt方法只能通过接口实现类的对象调用
default String getStr(String aa){
System.out.println("hello,i am" + aa);
return " ";
}
//静态方法只能接口名调用,不能通过实现类的类名或者对象调用
static void sing(){
System.out.println("welcom!");
}
}
接口和多态
接口可以声明一个变量(赋为空指针),或是被绑在一个以此接口实现的对象(类似于普通类的多态)
interface Clock{
public abstract void sing();
}
class MyClock implements Clock(){
public void sing(){
System.out.println("TxL,hello");
}
}
//j接口的多态
Clock c = new MyClock();
多态详见:–> 多态
–> JAVA SE (12)