Java中接口和抽象类的区别你真的清楚吗?


一、引言

      Java中抽象类和接口的区别你的真的全部知道吗?今天看见一片CSDN首页博文,感觉他总结的不是很好,于是自己亲自总结一下,结果发现很多意想不到的情况。那么先列一列总结出来的区别吧,这些你都知道吗?:

         (1)抽象类单继承、接口多实现


         (2)接口的所有成员变量都必须是public(默认会加上public static),抽象类抽象方法必须是public,其他随意


         (2)对方法来说:

                      接口中的方法都需要是抽象的,不能用private修饰,其方法不需要手动加上abstract
                      抽象类的方法不一定是抽象的,抽象方法需要手动添加abstract修饰符,抽象类可以有私有非抽象方法。


         (3)就实例化来说:抽象类和接口都可以通过new的方式得到实例,不过都属于Anonymous InnerType类型


         (4)对于属性来说:接口只能包含初始化过的属性,抽象类随意。

        

         (5)对于常量来说:接口和抽象类都可以包含常量,只是接口必须是public而已

           

         (6)对于继承和实现来说:抽象类可以继承其他类,可以实现其他接口;接口可以多继承其他接口(震惊!!!),多继承代码如下:

//接口可以多继承
public interface tet1 extends DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
}


二、用代码说话

      (1)首先定义一个抽象类,代码如下,本人用注释写了其特性:

//可以看到抽象类既可以继承,也可以实现其他接口
public abstract class Test_abstract extends Money implements Test2_interface {

	//可以包含初始化的属性,公有私有都可以
	 public int a=5;
	 private int a2=6;
	 
	 
	//可以包含没有初始化的属性,共有私有都可以
	 public int b; 
	 private int c;

	 //可以包含常量,这个必须初始化,共有私有都可以
	 public final int d=7;
	 private final int e=6;
	 
	 //可以包含抽象方法,这个是基本属性,不能用private修饰
    abstract int method();
	public abstract void m();
	
	//可以包含非抽象方法,共有私有都可以
	private void youtu(){};
	public void jiujiu(){};
}


  (2)再定义一个接口,代码如下:
	
public interface Test_interface extends Test2_interface {	
	     //可以包含初始化的属性,只能是public
		 public int a=5;
		 private int a2=6; //出错
		 
		 
		//不能包含没有初始化的属性
		 public int b;  //出错
		 

		 //可以包含常量,这个必须初始化,只能是public
		 public final int d=7;
		 private final int e=6;  //出错
		 
		 //可以包含抽象方法,这个是基本属性,不能用private修饰,可以不手动加abstract修饰符
	     int method();
		public abstract void m();
		
		//不能包含非抽象方法
    	private void youtu(){};  //出错
		public void jiujiu(){};  //出错
	
	
}

   (3)定义一个Main类,验证其能否被new出来,代码如下(如果实践,请先把上面报错的代码注释):

public class Main {

	public static void main(String[] args) throws Exception {

		//new了一个抽象类 Anonymous InnerType
		Test_abstract m=new Test_abstract() {
			
			@Override
			int method() {
				//匿名的类可以用this访问公有的任何成员
				this.a=1;
				return 0;
			}
			@Override
			public void m() {
				
			}
		};
		
		//new了一个接口  Anonymous InnerType
		Test_interface x= new Test_interface() {
			@Override
			public int method() {
				//匿名的类可以用this访问公有的任何成员
				int x=this.d;
				return 0;
			}
			
			@Override
			public void m() {
			}
		};
	}
}


三、小结

      上面是本人总结的几条规则,其实更应该从Java设计方面去思考,为什么抽象类和接口有这些区别。这样就脱离的死记硬背了。

      如有错漏之处,请留言指出!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值