详述:Java接口与抽象类区别

Java抽象类

public class Mammal {

	public void move(){
		System.out.println("aaaaaa");
	}

}
public class Whale extends Mammal{
	
	public void move() {
		System.out.println("bbbbbbb");
	}
	
}
public class Test {

	public static void main(String[] args) {
		Mammal mammal = new Whale();
		mammal.move();
	}
}

以上的代码就是以前多态学习中出现的代码,执行结果当然是bbbbbb。今天要讲的当然不是Java多态,而是另一个知识点抽象类

抽象类是什么?

概念:通常在Java语句中用 abstract 修饰的类是抽象类。

为什么我们需要抽象类?

抽象类必须在多态的前提下,且我可以发现,父类的方法(move();)是多余的,永远不会被执行。
则我们可以把父类的方法体去掉:

public abstract class Mammal {

	public abstract void move();
}

没有方法体的方法就是抽象方法,需要用关键字abstract修饰,而一个类中含有抽象类方法,则该类必须为抽象类,也就是abstract修饰的类,如上代码所示。

抽象类的特点

  1. 类中含有抽象方法,则改类必须为抽象类。
  2. 抽象类可以没有抽象方法。
  3. 抽象类不能创建对象。
Mammal m = new Mammal();		//是会报错的
  1. 抽象类中抽象方法必须有子类实现(有子类去重写),如果没有实现或者没有实现父类所有抽象发,则改子类必须也为抽象类。
  2. 抽象类中可以有具体的方法。
public void eat() {
		
	}
  1. 抽象类虽然不能创建对象,但是可以定义构造方法,该方法用于子类调用。
	public Mammal() {
		
	}
  1. 抽象类不能由final修饰,因为被final就不能有子类,所以前提就不满足了,就没有抽象类了。

Java接口

package 接口;

public abstract class Mammal {

	public abstract void move();
	
}

package 接口;

public class Whale extends Mammal{
	
	public void move() {
		System.out.println("dddddd");
	}
}

package 接口;

public class Test {

	public static void main(String[] args) {
		Mammal mammal = new Whale();
		mammal.move();
	}
}
  • 接口的定义

因为抽象类中可以包含任意合法的方法;可以包含任意合法的成员变量;如果一个抽象类中只有抽象方法,则该抽象类可以定义为接口。使用interface定义接口;实现类通过implements关键字实现该抽象类中的抽象方法,代码如下:

package 接口;

public interface Mammal {

	public abstract void move();
	
}

package 接口;

public class Whale implements Mammal{
	
	public void move() {
		System.out.println("dddddd");
	}
}

接口的特点

  1. 子类没有实现完接口中所有方法,则该必须定义为抽象类.
package 接口;

public abstract class Whale implements Mammal{
	
}
  1. 接口不能创建对象,且接口中没有构造方法
Mammal mammal = new Mammal();			//会报错
public Mammal(){		//会报错

	}
  1. 接口名常常I开头
  2. 接口中抽象方法默认为public abstract,所以接口中定义抽象方法时可以省略public abstract,只能为public abstract。
  3. 抽象类中可以定义任意合法的成员变量,但是接口只能定义public、static、final常量。
  4. JDK8以前版本的JDK中,定义的接口只能含有常量和抽象方法:JDK8 + 可以定义default或者static方法。

JDK12
在这里插入图片描述

public default void	eat() {		//是被允许的
		
	}
	
	public static void drink() {
		
	}

JKD8以下的就不行,会报错。
例如JDK1.6
在这里插入图片描述
如何切换JDK版本
Java项目右键-Build Path-Configure Build Path…-Libraries-JRE System Library [JavaSE一1.6]-Edit-选择版本-Finish-Apply and Close
在这里插入图片描述
7. Java中类只能继承一个父类,但是Java接口可以继承多个接口,每个接口之间使用逗号隔开。

二者区别

  • 定义:抽象类 abstract 接口interface
  • 构造方法:抽象类有构造方法 接口没有构造方法
  • 继承:抽象类只能单继承 接口可以继承多个接口
  • 实现:抽象类型extends 接口implements
  • 成员变量:抽象类可以定义任何合法的成员变量 接口只能定义public static final的变量即常量
  • 方法:抽象类可以定义任意合法方法; 接口中只能定义抽象方法,JDK8.0+可以定义多个static或default修饰的具体方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值