抽象类和接口

Day15
** 抽象类:**
猫Cat 狗Dog 动物Animal 案例 ,Cat 类 Dog类创建实例都可以有具体的对象与之对应。但是 Animal类的实例却没有具体的对象与之对应,也就是说Animal 作为父类 ,创建的对象没什么意义。而且当子类重写了父类的方法时 ,父类的这个方法 也没什么意义了所以java 提供了专门用来做继承设计父类的一个概念抽象类。

没有使用抽象类作为父类时的一些缺陷 :
父类是具体的类 : 父类自身创建的实例 没有具体对象 与之对应 意义不大
父类的某些方法 被子类重写,父类中的这些方法 也没有什么意义
父类无法限制子类 子类可以随意设计

为什么需要抽象类? 如何定义抽象类?
是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

抽象类 是用来 专门做父类 被继承使用的

抽象类的定义语法:
	修饰符 abstract class 类名 {
	
	}
抽象类的内部语法:
	1. 普通类中有的元素 抽象类也可以有 比如 成员变量 构造方法  普通方法
	2.抽象类中 可以定义抽象方法   使用 abstract 关键字   抽象方法没有方法体 ,抽象类中定义的
	抽象方法 只是 描述 有这个功能,但是 抽象类不提供具体的实现,具体实现由子类提供。
		修饰符  abstract 返回值类型  方法名(方法参数);        注意:没有方法体
		
	3.抽象类不能创建自身的实例	
	4.抽象类有构造方法 但是不能创建自身实力  构造方法的意义 是 创建子类实例的时候 初始化父类的数据 给子类实例使用
	5.含有抽象方法的类 只能定义成抽象类  也就说 一个类 如果有抽象方法 那这个类一定是抽象类, 但是 一个
	抽象类 不一定有抽象方法
	
	6. 抽象类对子类的限制    如果 一个子类 没有实现抽象父类的所有的抽象方法  那么这个子类也要被定义成抽象类
		换句话说:  一个子类 继承了抽象类    要么 要实现这个抽象类中的所有抽象方法  ,要么 这个子类也要被
		定义成抽象类

总结:
抽象类的成员变量 跟 具体类没啥区别 一样使用
抽象类的成员方法:
可以是具体方法: 子类可以直接调用 提高代码的复用性
可以是抽象方法: 强制子类去实现

关于 abstract 关键字 
	修饰类         抽象类   需要被继承
	修饰方法    抽象方法   必须被实现
	
	final 和 abstract 互斥
	private 和 abstract 互斥
	static 和 abstract 互斥
  • 抽象类 抽象的是 类别 类型
  • 接口: 抽象的是功能

接口
接口: 是专门描述 具备某个功能 或 某种方法的一个概念 是一种引用数据类型 它只对外描述具备哪些功能
却不提供具体的实现,具体的实现由接口的实现类来提供

接口 专门设计出来 用来被实现的 或者 描述功能的 通过 interface 关键字来定义
如果某个类 实现了这个接口 那么这个类就必须实现接口中定义的所有方法
接口:
1.概念性的接口 宏观上的接口 指的是系统对外提供的服务
2.使用interface 关键字 定义的接口 也称为接口类型 它用于明确的描述系统对外提供的服务 能够更加清晰的
把接口 和 实现细节分离

咱们在这 研究 interface 定义的接口

 语法: 修饰符 interface 接口名 [extends 父接口1, 父接口2,父接口3.....] {
  		public static final varType varName = value;
  		public abstract 返回值类型  方法名(参数类型 参数名.....);
  		//JDK8 之前 接口中只有 上述内容
  
  		//JDK 8以后 可以在接口中 定义 static 方法 和 default 方法  
  		详情  看具体例子   JDK8Interface.java JDK8Interface2.java   JDK8InterfaceImpl.java 
  }
  
  实现接口的语法:
  修饰符 class 类名 [extends 类名 implements 接口1,接口2.。。。。。]{
  
  
  }

接口总结:
1.接口中的成员变量 默认 都是 public static final 修饰的 常量 必须显示初始化
2.JDK8之前 定义的 方法 都是 public abstract 修饰的 抽象方法 没有方法体
3.JDK8 之后 接口中 可以定义 静态方法 和 默认方法
4.接口中不能定义构造方法 也不能创建接口自身的实例
5.一个接口不能实现另外一个接口 但是 可以继承多个其他接口 对于java接口来说 支持多继承
6.接口必须通过它的实现类 实现它的抽象方法 实现接口的关键字 是 implements
7.与子类实现抽象父类类似,当一个类实现了某个接口时 它必须实现这个接口中的所有抽象方法 否则 这个类必须被定义成抽象类
8.不允许创建接口自身的实例 但是允许 接口类型变量 引用实现类的实例 即接口应用指向子类对象
9.一个类只能继承一个直接父类 但是 可以实现多个接口

比较抽象类和接口
相同点: 二者都代表了系统的抽象层 不能实现自身的实例化 都可以包含抽象方法
经常写的代码 父类引用 指向子类对象 , 接口引用 指向子类对象

      不同点: 抽象类可以有构造方法  可以有具体方法 
    jdk8的接口中 只能定义  public abstract 的 方法  public static final 的变量    静态方法 和 默认方法
    
                  抽象类要被子类继承    接口要被类实现  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值