简述Java中抽象类和接口,及其两者区别

在说区别之前,先简要说一下什么是抽象类和接口  

  1.抽象类

     用abstract修饰的类叫做抽象类。    

在讲抽象类之前有必要强调一下abstract修饰符:

     1.abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new);

     2.abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有);



关于抽象类的使用特点:

扫描二维码关注公众号,回复: 33782 查看本文章

    1.抽象类不能有对象,(不能用new此关键字来创建抽象类的对象);

    2.有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;

    3.抽象类中的抽象方法必须在子类中被重写。

细心地同学可能会问到:抽象类不能被“new”,抽象方法必须重写,那么定义它们做什么嘞?

       答:抽象类生来就注定它是要被继承的,如果没有任何一个类去继承它的话,那么也就失去了它的意义;抽象方法生来就是要被重写的,而且是必须重写。(只要继承了某个抽象类,就必须去重写此抽象类中含有的抽象方法)

话不多说,看代码:

public abstract class Animal {
 public abstract void eat();
 public abstract void sleep();
}

以上代码是定义了一个叫做animal的抽象类,其中含有eat()和sleep()两个抽象方法。


这里指的注意的是:抽象方法不能有方法体,在方法后面加一个大括号而里面什么都不写也是不行的,编译器会报“abstract methods do not specify a body”这样一个错误。如下:



定义了一个animal类之后再定义一个cat类:

public class Cat extends Animal{

	@Override
	public void eat() {
		System.out.println("我是猫,我吃的是猫粮呀");
		
	}

	@Override
	public void sleep() {
		System.out.println("我是猫,我比你们人类睡的时间短!");
		
	}
	
}


在这里指的注意的是:当一个类继承抽象类的时候,这个类必须去重写所继承的抽象类的抽象方法,否则编译器会报“The type Cat must implement the inherited abstract method Animal.eat()”的错误。具体如下:


而,当重写完相对应的抽象类中的所有抽象方法之后,编译器也就不再报错:


此时,我再来写一个Person类:

public class Person extends Animal {

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("我是人,我要吃大鱼大肉!!!");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("我是人,每天必须睡够24个小时!!!!");
	}
}

OK,现在类已经写完了。接下来结合以上的代码说一下抽象类的用处:

       细心地同学可以看得出,在cat和person这两个类中都含有了sleep和eat这两个方法,但是它们的方法体却不一样。重点就在这里,假设不定义animal这个抽象类以用来让cat和person去继承的话,虽然也要在cat和person中定义sleep和eat这两个方法,看似代码上没有太多简化。但是这背后却隐藏着一个规范问题:也就是“是不是”的问题。cat和person都“是”animal,所以就必须继承animal里面的方法。相当于提供了一个大的体制。就好比人:人活着就必须要遵守国家的法律,而至于你信仰佛,还要遵守“佛法”,你信仰共产党,你还要遵守党章和党纪。那就是你自己的事情了

2.接口

     接口就是一个规范和抽象类比较相似。它只管做什么,不管怎么做。通俗的讲,借口就是某个事物对外提供的一些功能的声明,其定义和类比较相似,只不过是通过interface关键字来完成

其中重要的几个知识点:

   1.接口中的所有属性默认为:public static final ****;

   2.接口中的所有方法默认为:public abstract void ****;

   3.接口不再像类一样用关键字 extends去“继承”,而是用 implements 去“实现”,也就是说类和接口的关系叫做实现,(例如:A类实现了B接口,那么成为A为B接口的实现类。而类与类之间的继承的话,叫做A类继承了B类,其中B类即为A类的父类)。实现接口与类的继承比较相似

编程一事书读的再多没用,只会培养出来嘴上懂得怪多,但是屁都敲不出来的鸟人!!动手出真知!!!微笑具体看一下代码:

public interface Sleep {
	public static int a = 1;
	public static int b = 2;
	public void ioSleep(int i);

}

public interface Eat {
	public abstract void ioEat();
}

public interface Study {
	public void ioStudy();
}

public class Cat implements Sleep,Eat{

	@Override
	public void ioSleep(int i) {
		System.out.println("我是猫,我每天都不用睡觉!!!");
	}

	@Override
	public void ioEat() {
		System.out.println("我是猫,我吃猫粮!!!");
	}
}

public class Person implements Sleep,Eat,Study{

	@Override
	public void ioStudy() {
		System.out.println("我是人,我每天都要学习");
	}

	@Override
	public void ioEat() {
		System.out.println("我是人,我要吃大鱼大肉还要喝酒");
	}

	@Override
	public void ioSleep(int i) {
		System.out.println("我是人,我每天要睡24小时");
	}
}

以上代码定义了三个接口分别是:Study,Eat,Sleep,以及两个类分别是Cat和Person。其中Cat类实现了两个接口分别是:Eat和Sleep,而Person实现了三个接口分别是:Study,Eat,Sleep。这是为什么呢?就是因为Cat并不需要学习,而Person需要学习,所以在Cat类中没有实现Study这个接口,而在Person中却是有的。那么显而易见,接口所阐述的是“有没有”的问题,而刚刚所说的抽象类阐述的是“是不是”的问题

所以也就可以列出抽象类和接口的几点区别

      1.抽象类描述的是“是不是”的问题,而接口描述的是“有没有”的问题;

      2.在Java中类的继承是“单继承”,可以“多对一”,但是不允许“一对多”。而一个类却可以同时实现多个接口;

关于接口的注意事项:

如果把Cat的代码里面加上“a++"这样一句代码的话,编译器会报“The final field Sleep.a cannot be assigned”这样一个错误。至于原因就是因为在接口中所有的属性的修饰符都默认为"public static final",(虽然当时定义a的时候并没有明确指出要用final修饰)而final所修饰的属性里面的常量值是不能做修改的。

以上代码报“Abstract methods do not specify a body”的错误,因为接口中的方法默认修饰符为“public abstract void”




























猜你喜欢

转载自blog.csdn.net/My_name_is_ZwZ/article/details/80001121