理清Java中的接口和抽象类

0.说说抽象类和接口之间的差异:

  1. 抽象类中的方法可以有方法体,能实现方法具体要实现的功能,但是接口中的方法不行,没有方法体。
  2. 抽象类中的成员变量可以是各种类型,但接口中的成员变量只能是public static final 类型,并且是隐式,缺省的。
  3. 接口不能含有静态代码块以及静态方法(static修饰的方法),而抽象类可以有静态代码块和静态方法的。
  4. 一个类只能继承一个抽象类,而一个类可以实现多个接口

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:

吃饭睡觉写代码
彼得刘的博客写得很不错
出版社要求必须在规定时间段完成书稿,不然交违约金

猜你喜欢

转载自blog.csdn.net/qq_47610562/article/details/113118202