面试时经常会被问到抽象类与接口的区别,因此这里总结一下
可以从一下几个方面来考虑抽象类与接口的区别
1,组成方面
抽象类的组成可以有抽象方法,普通方法,常量,变量,构造方法,全局常量
接口的组成可以有抽象方法和全局常量
从上面可以看出,抽象类中可以有普通方法,常量,变量和构造方法,因此在抽象类中是
可以存在实现方法的,即有方法体的方法,抽象类中可以存在非抽象方法
例:
package com.racky.abs;
abstract class A{
//普通方法,有方法体,该方法不是抽象方法
public void print(){
System.out.println("ererer");
}
//抽象方法,无方法体
public abstract void fun();
}
接口中的方法都是抽象方法,没有方法体
例:
package com.racky.interf;
public interface A {
//接口中不能有private定义的常量
//private final int i=0;
public final int j=0;
public static final int x=0;// 全局常量
//接口中不能有private方法
//private void print();
//抽象方法
public void fun();
}
2,继承方面
子类通过extends继承抽象类,且一个子类只能继承一个抽象类,即单继承
子类通过implements实现接口,子类可以实现多个接口,因此可用于实现多继承
3,抽象类与接口的关系
一个抽象类可以实现多个接口,一个抽象类可以包含多个接口
一个接口不能继承抽象类,只能实现多个接口,一个接口中可以包含多个抽象类
例:抽象类中有接口
abstract class A{
public abstract void fun();
interface B{//内部接口
public void print();
}
}
例:接口中有抽象类
interface class A{
public abstract void fun();
abstract B{//内部抽象类
public abstract void print();
}
}
可以从一下几个方面来考虑抽象类与接口的区别
1,组成方面
抽象类的组成可以有抽象方法,普通方法,常量,变量,构造方法,全局常量
接口的组成可以有抽象方法和全局常量
从上面可以看出,抽象类中可以有普通方法,常量,变量和构造方法,因此在抽象类中是
可以存在实现方法的,即有方法体的方法,抽象类中可以存在非抽象方法
例:
package com.racky.abs;
abstract class A{
//普通方法,有方法体,该方法不是抽象方法
public void print(){
System.out.println("ererer");
}
//抽象方法,无方法体
public abstract void fun();
}
接口中的方法都是抽象方法,没有方法体
例:
package com.racky.interf;
public interface A {
//接口中不能有private定义的常量
//private final int i=0;
public final int j=0;
public static final int x=0;// 全局常量
//接口中不能有private方法
//private void print();
//抽象方法
public void fun();
}
2,继承方面
子类通过extends继承抽象类,且一个子类只能继承一个抽象类,即单继承
子类通过implements实现接口,子类可以实现多个接口,因此可用于实现多继承
3,抽象类与接口的关系
一个抽象类可以实现多个接口,一个抽象类可以包含多个接口
一个接口不能继承抽象类,只能实现多个接口,一个接口中可以包含多个抽象类
例:抽象类中有接口
abstract class A{
public abstract void fun();
interface B{//内部接口
public void print();
}
}
例:接口中有抽象类
interface class A{
public abstract void fun();
abstract B{//内部抽象类
public abstract void print();
}
}