什么是抽象类
在一个“类”中,如果有抽象方法,则这个类称之为抽象类,需要在class前加abstract。
抽象方法:若一个方法中没有方法体,则方法称之为抽象方法,是因为在多态中,父类的方法体往往多余,因此选择舍去方法体形成抽象方法。其代码形式为:
public abstract class Mammal {//父类
public abstract void move();
}
抽象类详述
1、如果父类有抽象方法,则子类必须实现所以抽象方法,否则该子类必须为抽象类,且抽象类不能创建对象。
public abstract class Mammal {//父类
public abstract void move();
public abstract void breathe();
}
子类可写为:
public class Whale extends Mammal{//子类
@Override
public void move() {
System.out.println("靠鱼鳍游泳");
}
@Override
public void breathe() {
System.out.println("靠鱼鳃游泳");
}
}
或者:
public abstract class Whale extends Mammal{//子类
}
2、抽象类不能创建对象,但可以有构造方法。
public abstract class Mammal {//父类
public Mammal(int age) {//可以创建Mammal方法
//Mammal mammal = new Mammal();mammal不能创建对象
}
public abstract void move();
public abstract void breathe();
}
3、一个抽象类中可以没有抽象方法,但有抽象方法的一定为抽象类
4、抽象类不能由final修饰(多态的直接体现)。
5、抽象类与普通类的区别:
a.抽象类中不能创建对象,普通类中可以;
b.抽象类中有abstract关键词修饰,普通类没有;
c.抽象类可以有抽象方法,普通类一定没有抽象方法。
什么是接口
如果一个源文件中的所有方法,全部为抽象方法,则这个源文件可以定义为接口。代码形式如下:
public interface IMammal {
public abstract void move();
public abstract void breathe();
}
详述接口
1、接口中没有构造方法。
2、接口中的方法默认为public abstract,所以可以忽略。
public interface IMammal {
/*public IMammal() {//不能构造方法
}*/
void move();//忽略public abstract
void breathe();//忽略public abstract
}
3、一个接口可以继承多个接口。
interface IA{//接口A
}
interface IB{//接口B
}
public interface Mammal extends IA,IB{//继承接口A,B
void move();
void breathe();
}
4、规定:接口名以I开头(代码规范)
5、接口中的变量默认为public static final(即均为静态常量)。所以接口中变量的命名需全部大写。
public interface IMammal{
void move();
void breathe();
int AGE = 957;
}
public class Test {
public static void main(String[] args) {
//IMmammal.AGE = 125; //不可实现,代码报错,从而证明5。
System.out.println(IMammal.AGE);
}
}
6、接口中抽象方法继承,需要使用implements。
7、实现接口时,可以继承接口中定义的常量。
public interface IMammal{
void move();
void breathe();
int AGE = 957;
}
public class Whale implements IMammal{
@Override
public void move() {
}
@Override
public void breathe() {
}
}
public class Test {
public static void main(String[] args) {
System.out.println(IMammal.AGE);
System.out.println(Whale.AGE);
}
}
8、一个类如果不实现接口中的所有抽象方法,则该类必须为抽象类。
public interface IMammal{
void move();
void breathe();
int AGE = 957;
}
public abstract class IWhale implements IMammal{
@Override
public void move() {
}
}
9、一个类可以实现多个接口。
public abstract class IWhale implements IMammal,List{
@Override
public void move() {
}
@Override
public void breathe() {
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
}
10、instanceof用来判断前面指向的对象是否为后面的类,结果为boolean类型。
public class Test {
public static void main(String[] args) {
Whale whale = new Whale();
System.out.println(whale instanceof Whale);
System.out.println(whale instanceof Object);//Object为所有类的父类
System.out.println(whale instanceof IMmammal);
}
}
结果为:
true
true
true
区别
1、成员变量:
抽象类可以定义任何形式合法的成员变量;
接口只能定义public static final的变量,也是常量。
2、构造方法:
抽象类可以有构造方法;
接口没有限定它不能创建对象,不可以有抽象方法。
3、定义(修饰词):
抽象类需要在class前加abstract;
接口需要在接口名前加interface,而没有class。
4、继承(可继承的数量):
抽象类只能继承一个父类;
接口可以继承多个接口。
5、实现继承:
抽象类使用extends关键字;
接口使用implements关键字。
6、方法:
抽象类可以定义任何方法;
接口只能定义抽象方法,JDK8及其以上版本可以定义多个由static/default关键词修饰的方法。