一、抽象类
实际上,在多态中父类方法的方法体是多余的,所以父类中被子类重写的方法没有必要有方法体,这是因为父类中被子类重写的方法没有实质作用。
此时可以删去多态中父类方法的方法体,并用abstract修饰父类及其方法,这时这个父类就成为了抽象类。
例如:
public abstract class Mammal{
public abstract void move();
}
在Java中被abstract修饰的类为抽象类,被其修饰的方法为抽象方法。
特点:
1、抽象类中不能通过使用new关键字来创建该抽象类的对象
public abstract class Mammal{
public abstract void move();
new Mammal();
}
此时会报错
2、仍然存在构造方法
3、如果一个类没有重写完父类中所有的抽象方法,则该类必须为抽象类
4、抽象类中可以没有抽象方法,但有抽象方法的类一定是抽象类
与普通类的区别:
1、抽象类前面有abstract修饰,普通类没有
2、抽象类不能创建对象,普通类可以
3、抽象类中可以有抽象方法,普通类中一定没有抽象方法
注意:抽象类中不能包含被static修饰的静态抽象方法(抽象方法没有方法体);
二、接口
接口可以定义为抽象方法的集合,如果一个抽象类中都是抽象方法,可以将这个类定义为接口
格式如下:
权限访问控制符 interface 接口名 [extends 接口列表]{
常量;
抽象方法;
内部类;
}
接口中的变量默认被public static final修饰(常量),即:接口中只能存在常量,抽象方法(默认由public abstract修饰)
接口的继承:
可以通过extends关键字实现接口的继承,但要注意:
--接口只能继承父接口,不能继承抽象类和普通类
--接口弥补了Java类中只能继承一个父类的缺点,接口可以继承多个父接口,即:接口之间的继承为多继承
public interface IA{
}
public interface IB{
}
public interface IMammal extends IA,IB{
public abstract void move();
}
接口的实现:
类可以通过implements关键字实现接口,虽然Java类中只能单继承但可以实现多个接口。
访问控制符 修饰符 class 类名 implements 接口1[,接口2……]{
变量
方法
}
特点:
1、接口中的变量为常量
2、只有public和默认能修饰接口(类也是如此)
3、接口中的抽象方法访问权限必须是public
4、如果一个类实现了一个接口,但没有实现接口中的所有方法,那么这个类必须是abstract类
5、如果多个接口中定义了相同的抽象方法,则在实现类中只实现其中一个即可
public interface IA{
double area();
}
public interface IB{
double area();
}
public interface IMammal extends IA,IB{
public abstract void move();
}
6、接口中不存在构造方法
7、实现接口的同时可以继承接口中常量;实现类所实现的多个接口中若出现常量重名的现象,则在实现类中不能直接使用,必须使用接口名来调用
注意:
--接口命名一般以“I”开头;
抽象类与接口区别