Java抽象类与接口的特性和区别

主要内容

介绍抽象类接口的特性,抽象类与接口之间之间的区别以使用上的选择

抽象类的特性

只声明而不提供任何实现的方法称为抽象方法,抽象方法用abstract关键字修饰,若一个类中存在至少有一个抽象方法时,需要将这个类用abstract修饰成为抽象类

  • 抽象类创建:若使用new创建,必须要实现其中抽象方法
  • 抽象方法的修饰:抽类方法不能使用private、final修饰,因为private、final修饰的方法无法被继承,不使用abstract修饰的方法需要实现方法体
  • 抽象类的继承:一个抽象类可以使用extends继承另一个具体的类或抽象类,还可以用implements继承另外的接口,使用的抽象类的子类若不是抽象类则需要实现父类的抽象方法
  • 抽象类的选择:若多个类有一些通用的方法,又有部分具体的方法实现不一样,这时就可以抽象出来放到一个抽象类中
package inter;
//抽象类
public abstract class AbstractTest {

	public AbstractTest() {
		System.out.println("执行父类构造方法");
		// TODO Auto-generated constructor stub
	}
//	非抽象方法
	public void display() {
		System.out.println("AbstractTest.display()");
	}
//	声明抽象方法
	public abstract void abstractMethod();
	public static void main(String[] args) {
		TestExemple p = new TestExemple();
		p.abstractMethod();
	}
}
//继承并实现抽象父类
class TestExemple extends AbstractTest{
	TestExemple(){
		System.out.println("执行子类构造方法");
	}
//	实现抽象方法
	@Override
	public void abstractMethod() {
		System.out.println("实现的抽象方法");
		// TODO Auto-generated method stub
		
	}
}

接口的特性

接口使用interface关键字声明,在接口中通常只声明方法而不提供方法体;接口可看做是一种特殊的抽象类,若一个抽象类中所有的方法都是抽象方法,而且这个抽象类中的数据成员都是final常量,最好将这个抽象类设计为一个接口

  • 接口中的变量:虽然可以使用public static final修饰但这是不必要的,因为默认就是静态的不可更改的常量,接口中的变量可以直接使用接口名来调用
  • 接口中的方法:虽然可以使用public abstract修饰,但这不是必要的;Java8中可在接口中用default定义默认方法,默认方法要有方法体,不能直接使用接口来调用,而要使用接口实现类的实例来调用;接口中使用static修饰的方法为静态方法,需要有方法体,并且无论是否显式指定,静态方法总是使用public修饰
  • 接口继承:接口通过implements可以继承其他接口,并添加新的属性和方法;接口不能继承抽象类,但可以用extends继承多个接口
  • 接口中的修饰符:不能使用native、synchronized、private、protected修饰符
  • 接口的创建方式:通常用接口的一个具体实现类创建,若直接创建接口,需要实现接口的方法
package intfs;

/**
 * @author wonzeng
 * 2020年7月10日
 */
//定义一个接口,还可以使用extends继承一个多个接口
public interface InterfaceTest {
	int Default_Number = 300;
//	在接口中定义的常量默认具有public, static, final的属性
//	接口的实现类中不能修改,只能读取
//	接口中的变量定义时就必须初始化
	
	
//	default关键字,声明默认接口,实现类中可以不用重写
	public default void defaultMethod() {
		System.out.println("接口中的默认方法");
	}
	
//	静态方法
	public static void staticMethod() {
		System.out.println("接口中的静态方法");
	}
	
//	没有实现的方法
	public void waitAchieve();
//	main方法
	public static void main(String[] args) {

//		接口名调用静态方法
		InterfaceTest.staticMethod();
//		接口名调用静态变量
		System.out.println(InterfaceTest.Default_Number);
		
//		实现接口方式1
		AcheiveImp imp = new AcheiveImp();
		imp.waitAchieve();
		
//		实现接口方式2
		InterfaceTest p = new InterfaceTest() {

			@Override
			public void waitAchieve() {
				System.out.println("匿名内部类实现接口");
				// TODO Auto-generated method stub
				
			}
			
		};
		p.waitAchieve();
		
//		实现接口方式3
		InterfaceTest p2=()->{
			System.out.println("lambda实现接口中的方法");
		};
		p2.waitAchieve();
	
	}


}
// 实现接口
class AcheiveImp implements InterfaceTest{

	public AcheiveImp() {
		// TODO Auto-generated constructor stub
	}

//实现接口中的方法
	@Override
	public void waitAchieve() {
		System.out.println("通过创建类实现接口中的方法");
		// TODO Auto-generated method stub
		
	}
}

抽象类和接口的区别

方法的区别:抽象类中可以有不抽象的方法,接口中除了default修饰之外的其他方法都是抽象的方法
继承的区别:类与类之间、类与抽象类之间使用extends继承,类与接口之间用implements关键字实现,接口与接口之间继承使用extends关键字,一个抽象类最多只能继承一个抽象类、可以实现多个接口
修饰符的区别:抽象类中的抽象方法必须要用abstract修饰,而接口中的方法可以不用abstract修饰

抽象类与接口的选择

当定义一个抽象的父类,若其中所有方法都是抽象的,可选择定义为接口
当定义一个抽象的父类,其中需要有不抽象的方法,可选择定义为抽象类

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值