抽象类
什么是抽象类?
官方点来说:有些类并不能真正的描述一个具体的对象,只是将子类相似的特点抽象出来而形成了一个抽象模板
实际而言:父类中含有共有的方法中的内容子类需要去重写使用 必须要有 但是用不到父类里的代码 所以时候抽象方法来省事和限定。抽象方法只有抽象类里才能写所以为了解决整个需求需要使用抽象类。
通过关键字abstract来声明抽象类
抽象类的语法:
abstract class 抽象类名 {
}
抽象方法
使用abstract修饰的方法就是抽象方法
public abstract void show();
抽象方法的特点
☀只有方法的声明,没有方法的实现。以分号结束
☀抽象方法在子类中必须被重写(实现)(子类也是抽象类除外)
☀一个类 如果定义了抽象方法 这个类必须修改成抽象类
抽象类的特点
☀抽象类不能被实例化
☀抽象类的子类必须重写父类中所有的抽象方法,除非子类依然为抽象类
☀抽象类可以包括属性、普通方法、构造方法用于给子类调用
☀抽象类中可以没有抽象方法,但抽象方法只能在抽象类中
小示例
/./抽象类
//抽象类 只能被继承 不能被实例化 使用abstract修饰
public abstract class DemoOne {
//抽象类可以声明正常的变量和方法
protected String name;
protected int age;
//抽象类也可以声明构造方法供子类调用
public DemoOne() {
System.out.println("构造方法");
}
public void eat() {
System.out.println("这是一个吃的方法");
}
//抽象方法 使用abstract修饰的方法就是抽象方法
//抽象方法没有方法体 被子类继承时必须被重写(实现)
//下面的显示方法在子类中必须被重写
public abstract void show();
}
//测试类继承抽象类
public class DemoOneA extends DemoOne{
@Override
public void show() {
// TODO 自动生成的方法存根
System.out.println("这是重写之后的方法!");
}
public static void main(String[] args) {
DemoOneA demoTest = new DemoOneA();
demoTest.age=19;
demoTest.eat();
demoTest.show();
}
}
控制台输出
接口
是什么?
接口(interface)是常量和抽象方法定义的集合,接口的本质就是一种规范。 比如你需要做个汉堡引用了检查接口 那么必须要有保质期检查 强制你检查必须要检查保质期
可以理解接口是个特殊的抽象类
怎么用?
使用interface修饰就是接口
public interface Lock{}
接口的特点
☀接口不可以被实例化
☀实现类必须实现接口的所有方法 或者说接口中的所有方法必须是抽象方法 默认就有abstract修饰符
☀实现类可以实现多个接口 逗号隔开
☀接口中的变量都是静态常量 接口中的所有量都是静态常量 默认就有static final修饰符
注意
☀此类型变量被称为常量,常量名全部大写
☀接口不是类,没有构造方法
☀一个类可以实现多个接口,但是必须重写接口中所有的抽象方法,否则该实现类是个抽象类
☀接口可以继承接口 并且可以多继承
public interface test extends Lock,DoorDell{
}
public interface test extends Lock,DoorDell{
}
接口有比抽象类更好的特性
•可以被多继承
•设计和实现完全分离
•更自然的使用多态
•更容易搭建程序框架
•更容易更换实现
示例
需求
有一个门 可以开门关门使用继承实现 要有开锁关锁使用接口实现 可以按门铃使用接口实现
编写开门关门父类
public abstract class Door {
//开门
public abstract void openDoor() ;
//关门
public abstract void closeDoor();
}
编写开锁关锁接口
public interface Lock {
//开门密码 static final在接口中不需要写 默认就有
//接口中的数据都是常量
//static final String PWE = "123232";
String PWE = "123232";
//开门关门
//接口中不需要abstract关键字 因为默认就有 接口中的方法都是抽象方法
//public abstract void openLock();
public void openLock();
public void closeLock();
}
编写门铃接口
public interface DoorDell {
public void dell();
}
编写测试类 接口中的方法都被重写 抽象类中的抽象方法都被重写
public class DoorTest extends Door implements Lock,DoorDell{
//需要被重写的方法
@Override
public void dell() {
// TODO 自动生成的方法存根
}
@Override
public void openLock() {
// TODO 自动生成的方法存根
//开门密码是个静态常量
System.out.println("开门密码"+pwe);
}
@Override
public void closeLock() {
// TODO 自动生成的方法存根
}
@Override
public void openDoor() {
// TODO 自动生成的方法存根
}
@Override
public void closeDoor() {
// TODO 自动生成的方法存根
}
}