0.说说抽象类和接口之间的差异:
- 抽象类中的方法可以有方法体,能实现方法具体要实现的功能,但是接口中的方法不行,没有方法体。
- 抽象类中的成员变量可以是各种类型,但接口中的成员变量只能是public static final 类型,并且是隐式,缺省的。
- 接口中不能含有静态代码块以及静态方法(static修饰的方法),而抽象类是可以有静态代码块和静态方法的。
- 一个类只能继承一个抽象类,而一个类可以实现多个接口。
1.抽象类:
- 抽象类是实现多态的一种机制。抽象类定义了一组抽象的方法,而子类要继承该抽象类来实现这组抽象方法的具体表现形式。
- 抽象类是用来被继承的,否则它没有存在的意义。下面举例说明:
abstract class Author { abstract void write(); public void behave() { System.out.println("吃饭睡觉写代码"); } }
上面是定义了一个作者类,身为一名作者,本职工作就是写作,其他时间可以是吃饭睡觉写代码,写作水平怎么样就得看是哪个作者了。例如:
class PeterLiu extends Author{ @Override void write() { System.out.println("彼得刘的博客写得很不错"); } }
发现了吗?抽象类是可以有自己的方法的,但继承它的子类也可以忽视。
2.接口:
接口比抽象类更抽象,接口是一种形式,就好像一纸条约,自身不能做任何事情。但只要某个类实现了这个接口,就必须按照这纸条约办事。接口中提到的方法必须全部实现,少一个也不行。
举例:我们定义一个清华出版合同的接口。
package com.znzz.JavaTest;
public interface ContractOfTsinghua {
void stipulation();//契约
}
再通过父类Author实现接口,子类继承父类的方法:
package com.znzz.JavaTest;
abstract class Author {
abstract void write();
public void behave() {
System.out.println("吃饭睡觉写代码");
}
}
class PeterLiu extends Author implements ContractOfTsinghua{
@Override
void write() {
System.out.println("彼得刘的博客写得很不错");
}
public void stipulation() {
System.out.println("出版社要求必须在规定时间段完成书稿,不然交违约金");
}
}
再用main方法测试一下:
package com.znzz.JavaTest;
public class MainTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PeterLiu p=new PeterLiu();//实例化对象
p.behave();//调用父类的方法
p.write();//调用父类的方法
p.stipulation();//调用接口中的方法
}
}
结果如下1:
吃饭睡觉写代码
彼得刘的博客写得很不错
出版社要求必须在规定时间段完成书稿,不然交违约金