在区别方面,万宝东已经基本说到位了,那么我就从抽象类和接口在实际应用中的一些不同来回答楼主的问题,希望能让楼主有更深刻的认识:
抽象类的一个最主要的作用在于强迫子类做某些事情:
需求:要求写一个程序,计算一段代码运行的时间,但是代码的具体内容是不确定的,我们就可以通过抽象类来实现以上需求,例如:
abstract class GetTime
{
public final void gettime() //final可以防止gettime()被子类复写,增强了代码的安全性
{
long start = System.currentTimeMillis();
runcode();
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode(); /*此处通过将runcode()定义为abstract类型,可以强迫子类复写,从而完善runcode()的功能*/
}
class SubTime extends GetTime
{
public void runcode() //子类必须复写runcode()功能才可以创建对象
{
for (int x=0; x<4000; x++)
{
System.out.print(x);
}
}
}
class TemplateDemo
{
public static void main(String[] args)
{
SubTime st = new SubTime();
st.gettime();
}
}
/*以上这段代码的思想是,通过abstract关键字,把父类中无法确定功能主体的代码暴露出去,强迫子类来完善代码的功能主体。*/
interface(接口)的主要作用:
因为java支持类对接口的多实现,所以接口可以很好的支持java的功能扩展,降低代码之间的耦合性。
需求:张三和李四都是学生,张三抽烟喝酒学习java,李四既不抽烟也不喝酒学习C++。
interface smoke
{
public abstract void smoking();
}
interface drink
{
public abstract void drinking();
}
abstract class student
{
private String name;
private int age;
public abstract void study();
}
class zhangsan extends student implements smoke,drink /*1.继承了父类的学习方法并完善为学习java(抽象类的作用,不明确的功能交给子类完善),2.实现了抽烟和喝酒的方法(接口的作用给张三这个学生扩展两个功能,抽烟和喝酒,由于并不是学生类应该具备的功能,所以既可以选择实现,也可以选择不实现,大大扩展了程序的功能)*/
{
public void smoking()
{
System.out.println("zhangsan smoke");
}
public void drinking()
{
System.out.println("zhangsan drink");
}
public void study()
{
System.out.println("zhangsan study java");
}
}
class lisi extends student /*只继承学生的标准方法学习,并完善功能主体,不选择继承特有的方法抽烟和喝酒*/
{
public void study()
{
System.out.println("lisi study C++");
}
}
class interfaceTest
{
public static void main(String[] args)
{
zhangsan p1 = new zhangsan();
lisi p2 = new lisi();
p1.smoking();
p1.drinking();
p1.study();
p2.study();
}
} |