抽象类:
首先,我来解释一下什么叫做抽象类,抽象抽象,顾名思义,有abstract修饰的类名叫做抽象类,那么,由abstract修饰的方法,也叫做抽象方法,但是,抽象方法只有声明部分,没有具体的方法体,例子如下
public abstract class IMammal{
public abstract void move();
}
因为一个抽象方法只关心它的子类的是否具有某种功能,并不关心其自身是否具有某种行为,功能的具体行为由子类实现
public class Whale extends IMammal{
public void move(){
System.out.println("鲸鱼游动");
}
}
同时,抽象类不能被实例化,即不能用new关键字来创建对象
抽象类和普通类的区别:
1.抽象类由abstract修饰,普通类没有
2.抽象类中可以有抽象方法,普通类不可以
3.抽象类不能创建对象,普通类可以创建对象
在此说明一下,抽象类中可以有普通方法,也可以有抽象方法,而普通类中一定不能有抽象方法,抽象方法只能存在于抽象类中,并且抽象类的子类一定要实现父类的所有抽象方法,除非子类也是抽象类,显而言之,抽象类中的抽象方法是多态的一种表现机制
接口:
java中的接口是抽象方法的集合,其定义的语法为
访问控制符(只能是public或默认) interface 接口名[extends 接口名]{
常量;
抽象方法;
内部类;
}
接口中只能包括常量(public static final),抽象方法和内部类;
接口中的抽象方法只能为public修饰;
通过extends关键字可以使自定义接口实现继承,但得注意:
接口继承父接口,但不能继承普通类和抽象类
接口弥补了java单一继承的缺点,即接口可以实现继承多个接口,中间用逗号隔开
接口实现:
类可以通过implements关键字实现接口,注意在实现的过程中实现类中方法的名字,返回值类型,参数列表要和接口中保持一致(就是重写的规则)
如果一个类实现类接口,就必须实现接口中的所有抽象方法,否则该类为抽象类
如果多个接口定义了相同的方法,那么在该实现类中只要实现其中一个即可
public interface ICircle {
double getArea();
}
public interface IRectangle {
double getArea();
}
public class GraphicalUtil implements ICircle, IRectangle {
@Override
public double getArea() {
return 0;
}
}
接口回调:
接口回调描述的是一种现象:接口声明的对象指向其实现类实例化的对象,那么该接口就可以调用接口中的抽象方法(类似于上转型过程)
接口没有构造方法,不能创建对象,但可以引用实现类中的对象
接口实现类可以直接使用接口中的常量
接口实现类所实现的多个接口都有名字相同的常量,则在实现类中不能直接使用,必须使用类名来调用到底使用哪个常量
java1.8新特性:
在java1.8之前,接口中只能定义常量,抽象方法和内部类,在1.8之后,还能定义default修饰的方法,静态方法
如果接口中只定义了一个抽象方法,那么这个接口就叫做函数式接口,可以用@FactionnalInterface注解来验证一个接口是否是函数式接口
抽象类和接口的区别:
1.关键字:一个是abstract修饰,一个是interface修饰
2.成员变量:接口中只能有常量(默认前面加了public static final),抽象类中皆可
3.构造方法:抽象类中有构造方法,接口中没有
4.方法:抽象类中可以有人以方法,在java1.8之前,抽象类中只能定义常量,抽象方法和内部类,在1.8之后,还能定义default修饰的方法,静态方法
5.实现抽象方法:一个是extends,一个是implements
6.是否存在多继承:抽象类中只能有单继承,接口中可以有继承多个接口
instanceof:
instanceof用于判断该运算符前面的引用类型变量指向的对象是否是后面类,或者其子类,接口类的实现类创建的对象,如果是返回ture,否则fasle
interface IMammal{
void move();
}
class Mammal implements IMammal{
@Override
public void move() {
System.out.println("哺乳动物可以移动......");
}
}
public class Test{
public static void main(String[] args) {
System.out.println(new Mammal() instanceof IMammal);//true
}
}
instanceof用于强制类型转换之前检查对象的真实类型避免类型转换异常,提高了代码的健壮性
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test{
public static void main(String[] args) {
Object object = new String();
print(object);//无法保证传入的object是否是Date类型的对象,因此用instanceof判别一下
}
public static void print(Object object) {
if (object instanceof Date) {
Date date = (Date) object;
String format = "yyyy-MM-dd HH:mm:ss";
String result = new SimpleDateFormat(format).format(date);
System.out.println(result);
}else {
System.out.println("请传入由Date类或其子类创建的对象。");
}
}
}