抽象类
抽象类 不可以实例化
抽象类可以有构造器
抽象类可以有main方法,并且我们可以运行它
抽象类 中既可以有抽象方法,也可以有非抽象方法,抽象方法没有方法体({ } 花括弧) 抽象类可以继承非抽象类、抽象类
抽象类 可以单个或多个接口,但是只能继承一个类 抽象类只能是public、默认修饰,不能使用protected、private修饰
抽象类 中可以定义变量、静态变量,final变量
抽象类 可以有静态代码块和静态方法
抽象方法 没有方法体 抽象方法只存在于接口和抽象类中,普通类不能声明抽象方法
抽象方法 可以是public、protected、默认,但是不能用private
抽象方法 必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法
继承 抽象类 效率比 实现 接口 效率比较高
public class AbatractDemo {
abstract class Animal {
}
abstract class Pig extends Animal{
// 抽象类中变量
String name;
static int age = 19;
final String color = "white";
// 抽象类的构造方法
public Pig() { }
// 抽象类的普通方法
public void eat() { }
// 抽象方法没有方法体 也就是{}
public abstract void run();
// 抽象方法没有方法体 也就是{}
public abstract void sleep();
}
// 继承抽象类,子类必须重写父类中的抽象方法
class ColorPig extends Pig {
@Override
public void run() {
}
@Override
public void sleep() {
}
}
public static void main(String[] args) {
// 无法实例化抽象类
// Pig pig = new Pig();
}
}
接口
接口 不能实例化
接口 没有构造方法
接口 没有main方法,因此不能运行它
接口 只能用public和默认,不能使用static、private、protect、final修饰
接口 中的 方法 不能用static修饰
接口 中的 方法 没有方法体,方法默认的修饰符是 public abstract 接口中变量默认的修饰符是public final static (这三个修饰符不需要顺序可以随便放)
接口 不能实现(implements)接口
接口 不能继承(extends)类(普通类、抽象类)
接口可以多继承(extends)接口
实现接口必须重写接口中的所有方法
接口中的 变量 会被隐式地指定为 public static final 变量,并且只能是 public static final 变量,用private、protected 修饰会报编译错误
接口中的 方法 会被隐式地指定为 public abstract 方法,并且只能是 pulic abstract 方法,用其他关键字,比如private、protected、static、 final等修饰会报编译错误
接口中不能含有静态代码块以及静态方法
JAVA8 中接口可以定义非抽象方法,但必须使用default或者staic关键字来修饰,必须有方法体{}
public class InterfaceDemo {
interface Animal {
final public static int age = 100;
// 接口中属性默认的修饰符是 public final static
String name = "Animal";
// 接口中的方法没有方法体
public void eat();
// 接口中方法默认的修饰符是 public abstract
void sleep();
}
class Cat implements Animal{
@Override
public void eat() {
System.out.println();
}
@Override
public void sleep() {
}
}
}
抽象类和接口相同点
类型 | 抽象类 | 接口 |
---|---|---|
方法 | 抽象方法没有方法体 | 接口中所有方法都没有方法体 |
实例化 | 抽象类不能实例化 | 接口不能实例化 |
抽象类和接口不同点
类型 | 抽象类 | 接口 |
---|---|---|
速度 | 相对快 | 相对慢 |
构造器 | 抽象方法可以有构造方法 | 接口没有构造方法 |
main方法 | 抽象类可以有main方法 | 接口没有mian方法 |
继承或实现 | 子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,需要重写抽象类中的抽象方法 | 子类使用关键字implements来实现接口,需要重写接口中所有方法 |
与正常Java类区别 | 抽象类不能实例化,可以有抽象方法,其他和普通方法没区别 | 接口不能实例化,接口中定义方法不能有方法体,接口中变量都是静态不能修改的常量 |
访问修饰符 | 抽象方法可以是public、protected、默认,但是不能用private | 接口中的方法默认的修饰符是 public abstract ,不可以使用其它修饰符,接口中变量默认的修饰符是 public final static |
多继承或多实现 | 抽象类可以继承(extends)一个类和实现(implements)多个接口 | 接口不能实现(implements)接口,不能继承(extends)类(普通类、抽象类),但是可以继承(extends)一个接口,也可以多继承(extends)接口 |