一、抽象类
用 abstract 修饰的类,称为抽象类。
抽象类的作用:在实际开发中,对于某些功能能需求具体的实现方法不确定时,但是这些功能又必须让子类去实现,此时可以将这些功能定义成抽象类,等后期子类进行实现,从而提高程序的扩充性。(当必须强制性让子类去自己实现某个方法时,可以使用抽象类和抽象方法)
比如:下面的Animal动物类,动物就是一个抽象的概念,动物有很多类型,此处不知道就是哪种类型public abstract void eat ( )
总结:
- 被abstract修饰的方法,称为抽象方法;(抽象方法不能有方法体,即无大括号)
- 普通类中,不能有抽象方法;(如果一个类中有抽象方法,那么这个类必定是抽象类)
- 抽象类中可以有构造方法,但不能直接创建对象,必须通过子类创建;
- 注:抽象类定义出来的方法就是为了给其他类继承。
- 抽象类中既可以有抽象方法,也可以有非抽象方法;
- 抽象类也可继承抽象类,此种继承不需要实现父类的抽象方法;
- 普通类继承抽象类,就需要实现抽象类中所有的抽象方法;
- 继承具有传递性,如果抽象类有多层继承关系,有多少抽象方法,子类就需要实现多少。
建议:如果有哪些行为(方法)必须要让子类去做的话,可以把这些行为(方法)完成抽象的,这样的话,子类就必须得实现这些行为(方法)。
/**
* 动物抽象类
* 用abstract关键字修饰的类,表示一种抽象的类型
*/
public abstract class Animal {
public String name = "Animal";
/**
* 抽象方法
* 用abstract修饰的方法,表示一种抽象的行为(只知道要做一件事,但还不知道具体怎么做)
* 注意:1.抽象方法没有方法体(没有{ }大括号)
*/
public abstract void eat();
public abstract boolean say();
/**
* 抽象类中既可以有抽象方法,也可以有非抽象方法
*/
public void die(){
}
//构造方法
public Animal() {
}
public static void main(String[] args) {
//2.抽象类不能直接创建对象,必须通过子类创建;
//Animal a = new Animal() ;//报错
Animal a = new Dog() ;//有了子类后,就可以创建对象
}
}
/**
* 如果继承的类是一个抽象类,那么就要实现抽象类中的所有方法
* Dog类继承Animal类,那么就要实现Animal抽象类中的所有抽象方法
*/
public class Dog extends Animal {
public String name = "Dog~";
//4.必须要写eat和say方法 继承抽象类,需要实现抽象类中的所有方法。
@Override
public void eat() {
System.out.println("旺旺,吃骨头了~~");
}
@Override
public boolean say() {
return true;
}
}
二、接口
interface修饰(重点掌握)
接口:没有具体的定义,也没有具体的行为,用来制定规则。
生活中常见的接口:USB接口、插座。
public interface Cat { }定义一个接口Car
注意:
- 接口中的所有方法默认都是public abstract修饰的,也就是抽象方法;
- 接口中不能有实现的方法(具体的方法),除了jdk1.8可以定义default修饰的方法;
- 实现接口使用的是implements关键字;
- 实现接口就必须实现接口中所有的抽象方法;
- 接口不能直接创建对象,必须通过实现类去创建对象;
- 一个类刻意有多个接口,中间用“ ,”隔开;
- 接口不能实现接口;
- 接口可以继承接口,而且可以继承多个接口,中间用“ ,”隔开;
- 接口中的属性都默认都是public static final修饰的,是一个常量。
/**
* 画图的接口
*/
public interface DrawInterface {
//9接口中没有构造方法
// public DrawInterface(){
//
// }//报错
//1.接口中的方法都是抽象的 方法前面会加abstract,只是在接口中abstract省略掉了
public void draw();//2.接口中不能有实现的方法(具体的方法)
// public abstract void draw();
public static void main(String[] args) {
//5.接口不能直接new对象,必须通过实现类去创建
// DrawInterface d1 = new DrawInterface();//报错
DrawInterface d1 = new Si();
d1.draw();
DrawInterface d2 = new Zheng();
d2.draw();
}
}
/**
* 擦除接口
*/
//接口不能实现接口
//接口可以继承接口,而且可以继承多个接口,中间用 “ ,”隔开
public interface DeleteInterface extends DrawInterface{
}
/**
* 正方形
*/
public class Zheng implements DrawInterface {
@Override
public void draw() {
System.out.println("绘制正方形");
}
}
/**
* 四边形
*/
public class Si implements DrawInterface{
@Override
public void draw() {
System.out.println("绘制四边形");
}
}
运行结果: