抽象类(abstract)
在一个类中,将某个功能给出一个声明,该类称为抽象类.
一个类有抽象方法(没有方法体的方法),那么该类就是抽象类
抽象类和抽象方法的标准格式
权限修饰符 abstract class 类名{}
权限修饰符 abstract 返回值类型 方法名();
//抽象类的格式
public abstract class Demo{
public void study();//抽象方法,没有方法体的方法
}
class AbstractDemo extends Demo{
public void study(){
System.out.println("我是抽象类的子类");
}
}
//测试类
class Test{
public static void main(String[] args){
//Demo d = new Demo //此方式是错的,抽象类不能进行实例化
Demo d = new AbstractDemo();//抽象多态
d.study();//编译看左边,运行看右边
}
}
抽象类的本质
强制子类必须完成其所有的事情
特点
1)成员变量:既可以定义常量,也可以定义变量
2)成员方法:既可以是抽象方法,也可以是非抽象方法
3)构造方法:对数据进行分层初始化
注意事项
1)若一个类中有抽象方法,那么该类一定是抽象类,抽象类中也可以有非抽象方法
2)抽象类不能直接实例化,可以通过具体的子类进行实例化
父类名 对象名 = new 子类名();(即抽象多态)
3)抽象的子类
子类要么是具体类,要么是抽象类
子类是具体类时可以直接抽象类多态进行实例化
子类是抽象类,还需要提供更具体的子类,否则都无法进行实例化
接口(interface)
描述一个事物的扩展功能(事务本身不具备的功能),如果有事物想使用这个扩展功能,必须将该接口的功能进行实现
接口和子实现类的标准格式:
interface 类名{}
class 类名 implements 接口名{}
//接口
interface Demo{
public abstract void show();//接口的方法也只能是抽象方法
}
//接口的子实现类
class IfDemo implements Demo{
public void show(){//实现接口的方法
System.out.println("我是接口的子实现类");
}
}
//测试类
class Test{
public static void main(String[] args){
//Demo d = new Demo();//错误的方式,接口不能直接实例化
Demo d = new IfDemo();//接口多态
d.show();//编译看左,运行看右
}
}
特点
接口的成员变量只能是常量,被static修饰,存在默认修饰符:public static final ...
接口的方法只能是抽象方法,存在默认修饰符:public abstract ...
接口没有构造方法
接口中的方法只能是抽象方法
接口的实现类和接口是一种implements关系
接口的实现类称为"接口的子实现类"
注意事项
接口不能直接实例化,可通过具体的子实现类进行实例化
接口名 对象名 = new 子实现类名();(接口多态)
抽象类和接口的区别
1)成员的区别
参考抽象类和接口的特点
2)关系的区别
类与类之间
继承关系,只支持单继承,不支持多继承,但可以多层继承
类与接口之间
实现关系,一个类在继承另一个类的同时可以实现多个接口
格式:class 类1 extends 类2 implements 接口1,接口2{}
接口与接口之间
继承关系,可以单继承,也可以多继承
3)设计理念的区别
抽象类体现的是一种"is a "的关系
接口体现的是一种"like a " 的关系