接口和抽象类的区别

一.抽象类:

1.什么是抽象方法?

   就是只有方法的声明,没有方法体实现,即在小括号后面直接分号,没有大括号。public abstract void eat();

   抽象方法定义的语法:abstract关键字,在返回值得声明之前。

2.为什么?何时需要有抽象方法?

   1)我们创建一个类,但是并不知道这个类的某个行为如何实现;

   2)创建一个类之后,方法的实现并不需要本类实现,而是需要在子类中实现;

   3)某个行为在本类中不方便实现,或者暂时无法实现;

3.抽象类:如果一个类的定义前面有abstract关键字修饰,name这个类就是抽象类;

    抽象类除了不能创建实例外,其它和普通类的特性一致;

4.抽象类的特点:

   1)无法创建抽象类的实例;

   2)一个类中如果存在一个或多个抽象方法的话,那么这个类必须是抽象方法;

   3)如果将一个类定义为抽象类,这个类中可以没有抽象方法;

5.抽象类的作用:由于抽象不能定义实例,通常情况下,需要由子类来继承抽象类,自诶继承抽象类之后,必须实现(重写)

   抽象类的全部抽象方法,如果仍然不能全部提供 实现的话,则其也必须定义为抽象类,

 

二.接口:

1.接口不是类,接口是使用关键字interface定义;

2.接口特点:

   1)接口中的方法全都是公有的抽象方法;

   2)接口中不允许存在成员属性;

   3)接口不能实例化;

   4)定义静态常量(final属性);

   5)抽象类是类,一个类最多只能继承一个抽象类,接口不是类,一个类可以实现多个接口,当实现多个接口的时候就需要对

         所实现的接口中的所有抽象方法都提供实现;

3.一个类实现一个接口使用implements关键字,实现一个接口之后,就必须对接口中的所有抽象方法提供实现,如果不能全部

  提供实现的话,则只能作为一个抽象类;

4.多态的实现可以使用抽象类指向子类的实现,也可以使用接口来指向子类的实现;

5.一个接口可以继承另一个或多个接口,继承接口时使用extends关键字;

6.面向接口编程,使用接口来指向一个具体的实现类,在程序中仅使用接口,而不关注其具体实现;

 

抽象类:

package com.shsxt.abstract02;
/*
 * 抽象类    : 被abstract修饰的类
 * 抽象方法 : 被abstract修饰的方法
 * 	没有方法体
 *  必须存在抽象类中
 * 
 * 定义开发部:
 * Develop开发部    功能:工作
 * 	Java工程师  功能:工作
 * 	web工程师     功能:工作
 * 
 * 注意:
 * 	1.抽象类不能实例化
 * 	2.抽象方法必须存在于抽象类中
 * 	3.抽象类中可以存在抽象方法,可以存在具体方法(有方法体的方法)
 * 	4.通过子类使用抽象类:
 * 		具体子类:重写抽象父类中的所有抽象方法+按需新增
 * 		抽象子类:按需重写抽象方法+按需新增
 *  5.一个抽象方法如果已经被冲写过,就可以不需要再次重写
 *  6.抽象方法必须被重写
 *  7.abstract不能和static, final,private,native一起使用
 */
public abstract class Develop {
	//不知道怎么定义方法体,就不写,没有方法体的方法只能为抽象方法
	public abstract void work();
	public abstract void sleep();
	
	public void haha(){
		System.out.println("哈哈一笑");
	}
}

 

接口:

package com.shsxt.interface03;
/*
 * 接口:  interface定义
 * 	特殊的抽象类
 * 	
 *  能用接口就是用接口
 *  
 *  在1.7及之前:
 *  	静态的公共的常量+公共的抽象的方法
 *  	属性:
 *  		public static final默认修饰符,可以选择性的省略
 *  	功能:
 *  		public abstract 默认修饰符,可以选择性的省略
 *  
 *  1.8及之后版本:
 *  	1.静态方法:接口名字. 使用
 *  	2.默认方法:实现类的对象使用
 *  注意:
	 *  1.类的继承,接口需要实现
	 *  2.抽象方法必须被重写
	 *  3.使用接口中的内容:接口需要实现implements,类要使用extends继承
	 *  	具体的实现类: 重写接口中的所有抽象方法+按需新增
	 *  	抽象的实现类: 按需重写抽象方法+按需新增
	 *  
	 *  4.单继承,一个类只能继承一个类,接口可以多实现,实现了接口,就拥有了接口中定义的功能
	 *  5.一个类及继承父类又实现接口,先继承后实现
	 *  6.避免实现的多个接口中定义了相同的功能
	 *  7.接口可以多继承其他接口,不能是实现接口的(实现:对抽象方法方法体的实现)
	 *  8.接口不能实例化
	 *  		
	 *  
 * 接口的优点:
 * 	避免单继承的局限性  (推荐使用接口)
 *  提高代码的复用性
 *  解耦:高内聚低耦合  
 *  定义规范
 *  
 *  根据不同的需求:定义类,抽象类,接口,推荐使用接口
 */
public abstract class InterfaceDemo implements MyIn{
	public static void main(String[] args) {
		System.out.println(MyIn.A);
	
		//new InterfaceDemo().haha();
		
		MyIn.heihei();
		new Demo().houhou();
	}

	@Override
	public int haha() {
		System.out.println("我是重写的抽象方法");
		return 0;
	}
	
	//public abstract  void hehe();
}

class Demo implements MyIn{

	@Override
	public int haha() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void hehe() {
		// TODO Auto-generated method stub
		
	}
	
}
//自定义的接口
interface MyIn{
	//公共的静态的常量
	int A=5;
	//定义了有这个功能  
	int haha();
	void hehe();
	//静态方法
	public static void heihei(){
		System.out.println("heihei..........");
	}
	
	//默认方法
	public default void houhou(){
		System.out.println("嘤嘤怪...");
	}
}

interface A{
	void a();
}
interface B{
	void b();
}

//一个接口继承其他的接口   
interface D extends A,B{}

class O{}

class C extends O implements D {

	@Override
	public void b() {
		
	}

	@Override
	public void a() {
		
	}
	
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值