一、抽象类
如果一个类含有抽象方法,则称这个类为抽象类。抽象类是用abstract关键词修饰的。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。如果一个类继承了抽象类,那么就必须为抽象类中的抽象方法提供定义。如果不那么做,那继承的类也为抽象类。( 抽象方法是一种特殊的方法,它只有声明,而没有具体的实现。)
抽象类和普通类一样,同样可以拥有成员变量和普通的成员方法。但是抽象类中的抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
抽象类是用abstract关键词修饰的
public abstract class 类名
抽象类的特点
1.抽象类不能实例化
2.抽象类中不一定有抽象方法,但是有抽象方法的一定是抽象类
3.继承抽象类必须要重写方法,不然这个类还是抽象类
4.抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰。
public abstract class Animal {
abstract void eat();
abstract void sleep();
}
public class Dog extends Animal {
@Override
void eat() {
}
@Override
void sleep() {
}
}
public abstract class Cat extends Animal{
@Override
void eat() {
}
}
二、接口
接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
例:定义一个接口
interface A{//定义一个接口
public static final String MSG = "hello";//全局常量
public abstract void print();//抽象方法
}
提示:
1. 创建接口时,接口的命名一般以大写字母开头
2. 接口命名一般使用形容词词性的单词
接口体
1. 常量(没有变量) ( public static final ) int MAX = 100; 可以省略public static final
2. 抽象方法 (public abstract) void add(); 可以省略public abstract
常量和抽象方法都只有一种访问修饰符:public
接口的实现
关键字:implements
1. 类可以实现一个或多个接口 public class Dog implements Eatable,Sleepable
Dog 也可以继承一个具体类 public class Dog extends Animal implements Eatable , Sleepable
2. 类中必须重写接口中的全部方法( 抽象类 可只重写接口中的部分方法)
3. 类中重写的方法,访问修饰符必须是 public
4. 接口中定义的常量,在继承了接口的类中可以直接使用
接口间的继承
public interface A{}
public interface B extends A{} // 接口B继承的A
public interface Eatable{ //定义了一个Eatable接口
void eat();
}
public interface Sleepable{ //定义了一个Sleepable接口
void sleep();
}
public class Animal{ // 定义了一个Animal类
public String name;
public Animal(String name) {
this.name = name;
}
}
public Dog extends Animal implements Eatable,Sleepable{ //继承了Animal类,Eatable接口 ,Sleepable方法
public Dog(String n) {
this(n);
}
public void eat() { //重写Eatable中的eat方法
System.out.println(name+"吃骨头");
}
public void sleep() { //重写Sleepable中的sleep方法
System.out.println(name+"睡得很好");
}
}
三、抽象类与接口的区别
参数 | 抽象类(abstract class) | 接口(interface) |
---|---|---|
结构组成 | 普通类+抽象方法 | 抽象方法+全局常量 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
与Java普通类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
方法的访问修饰符 | 象方法可以有public、protected和default这些修饰符(注意不能是private) | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
变量的访问修饰符 | 可以是修饰符 | 只能是public static fianl(全局常量) |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 抽象方法可以有main方法并且我们可以运行它 |
多继承 | 抽象类可以继承一个类并实现多个接口 | 接口只能继承接口(一个或多个,使用extends关键字) |
子类使用 | 使用extends关键字继承抽象类 | 使用implements关键字实现接口 |
子类限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |