java抽象类和接口

一、背景知识

父类中定义了相关子类的共同行为,也就是多个儿子继承一个父亲,但是,
java不许多重继承(即允许从几个类派生出一个子类),只能单一继承,通过extends关键字定义一个子类。多重继承可以通过接口来实现。

二、抽象类

抽象方法

抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。 一个抽象方法只有方法头,没有方法主体。

访问修饰符 abstract 返回类型 方法名(参数列表);

注意,关键字 abstract 出现在方法头中,方法头以分号结尾。

public abstract void getArea();

抽象类和常规类其实很类似,但是抽象类是不能够使用new操作符创建它的实例。抽象方法只有定义而没有实现,他的实现由子类提供。一个包含着抽象方法的类必须声明为抽象类。

而在写法上,抽象类与抽象方法就是在常规类与常规方法前加个abstract

public abstract class Geometry{//抽象类Geometry
	private String color="black";
	private boolean filled;
	protected Geometry(String color,boolean filled){
		this.color=color;
		this.filled=filled;
	}//protected就是对于他的子类是public,对于其他类是private
	public String getColor(){
		return color;
	}
	public boolean isFilled(){
		return filled;
	}
	public abstract double getArea();
	public abstract double getPerimeter();
	//都是抽象方法
}
public class Circle extends Geometry{
	//……
}
public class Rectangle extends Geometry{
	//……
}

为什么要使用抽象方法

例如上述的结构体里Geometry里面,我们有很多的子类,例如三角形,矩形,圆形,我们要比较他们的面积的时候

直接调用area会写的很乱,而且会涉及一堆子类

当然用多态也是一个选择

但是对于大类Geometry而言,我们很明显是不需要去计算它的getArea的值的

同时,如果运用多态的话在Geometry类里面我们还需要去写个判断他是从哪个子类向上转型转过来的,这时候很明显会有多余的操作和内存占取

抽象类便派上用处了,对于大类Geometry而言,是无法调用该函数的,他只负责定义

对于子类而言,我们则可以在子类中重写该函数,也就是将所谓父类中的抽象函数具体化,这时候,我们只需要向上转型完之后直接调用即可

同时可以直接写函数去比较抽象方法的返回值

public static boolean equalArea(Geometry a,Geometry b){
	return a.getArea()==b.getArea();
}

抽象类的注意事项

1、抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象
2、抽象类是不能用new操作符来初始化的,但是仍然可以定义它的构造方法,这个构造方法在他的子类的构造方法中调用。
3、包含抽象方法的类必须是抽象类
4、子类可以覆盖父类的方法并将它定义为abstract,比如它在当父类的方法实现在子类中变得无效时是很有用的。
5、即使子类的父类是具体的,这个子类也可以是抽象的
6、不能用new操作符从一个抽象类中创建一个实例,但是抽象类可以用作一种数据类型

三、接口

接口,也是类,不过是一种特殊的类,接口里面只有方法的定义,没有方法体,也就是说,接口是纯度100%的抽象类。

既然有了抽象类这个概念,为什么要再创建一个名为接口的东西呢?

抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。

语法实现

为了声明一个接口,我们使用interface这个关键字,在接口中的所有方法都必须只声明方法标识,而不要去声明具体的方法体,
接口中的属性默认为Public Static Final.一个类实现这个接口必须实现这个接口中定义的所有的抽象方法。

//一个简单的接口
interface example{
	final int a=10;
	//final 不允许继承与覆盖,同时如果定义为常量,该常量不允许修改
	void load();

为什么要用接口

平时里提到接口就会想到usb,typeC这类的接头
其实这类接头也算接口

interface usb{
	void read();
	void write();
}
interface typeC{
	void read();
	void write();
}
class Shubiao implements usb{
	public void read(){
		System.out.println("reading from mouse");
	}
	public void write(){
		System.out.println("writing to mouse");
	}
}
class Sianpan implements usb{
	public void read(){
		System.out.println("reading from jianpan");
	}
	public void write(){
		System.out.println("writing to jianpan");
	}
}
public class MAIN{
	public static void main(String[] args){
		Shubiao s=new Shubiao();
		s.read();
		Jianpan j=new Jianpan();
		j.raad();
	}
}

关于接口的注意事项

1、我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的
2、我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
3、一个类可以实现不止一个接口。
4、一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
5、一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
6、接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。
7、接口用来弥补类无法实现多继承的局限。
8、接口也可以用来实现解耦。

抽象类与接口

在这里插入图片描述

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值