Java抽象类与接口的区别

Java抽象类与接口的区别

由 abstract 修饰的没有方法体的方法是抽象方法;含有抽象方法的类是抽象类;Java接口是抽象类的集合,即接口中的方法都是抽象方法。

一、关键字

抽象方法的关键字是 abstract,接口的关键字是 interface;

public abstract class Mammal{        //这定义一个抽象类
    //方法体
}
-----------------------------------------------------------
public interface IB{                //这定义一个接口
    //常量
    //抽象方法
    //内部类
}

二、定义变量

抽象类可自由定义变量而且可以被继承;

public abstract class Mammal{

	String name;
	int age;
}

public class Ocean extends Mammal{

	public Ocean(){
	}

	public Ocean(String name, int age){
		this.name = name;
		this.age = age;
	}
	public static void main(String[] args){
		Mammal m = new Ocean("Tom",18);
		System.out.println(m.name);
		System.out.println(m.age);
	}
}



Tom
18

接口定义变量时有默认的 public static final,因此接口定义的量都是常量;

public interface IC {
	
	int AGE = 12;
	
}

public class Test implements IC{
	
	public static void main(String[] args){
		//AGE = 13;           //证明final修饰,不注释掉会报错,因为常量无法修改
		System.out.println(Test.AGE);       //证明是static修饰,类.属性名 引用
		System.out.println(AGE);        //证明Public
	}
}

三、有无构造方法 接口命名规则

抽象类可以有构造方法,但接口不能有构造方法;

接口命名都以大写 “I” 开头,可参考上下文中全部接口。 

四、具体方法 访问控制符

抽象类中可以定义各种访问级别(除private外)的非抽象方法;而接口中只能定义访问级别为 public 包含 static 和default 修饰的非抽象方法(JDK8或更高版本才有此功能),同时接口的方法默认由 public abstract 修饰,所以可以忽略,但不可更改

public abstract class Mammal{

	public void eat(){
		System.out.println("正在吃。。。");
	}

	void sleep(){
		System.out.println("正在睡觉......");
	}
}
--------------------------------------------------
public interface IC {
	
	public static void move(){
		System.out.println("正在移动......");
	}

	public default void breathe(){
		System.out.println("正在呼吸......");
	}
    
    void eat();     //此处若为 protected abstract void eat(); 则报错
}

接口定义的 default 修饰的方法是可以被继承的,在这里不再作过多的解释了,有兴趣的可自行探索。

五、实现方法

抽象类和接口中的抽象方法都没有方法体,如果想要实现,就需要重写;

抽象类的实现是由自定义类通过 extends 继承抽象类并重写所有的抽象方法;

接口的实现是由自定义类通过 implements 继承接口并重写所有的抽象方法;

例题3:
public abstract class Mammal{
	abstract void move();  //抽象方法必须重写
	public abstract void breathe();  //抽象方法必须重写
	public void eat(){       //非抽象方法,可重写可不重写
		System.out.println("正在吃。。。");
	}
	void sleep(){      //非抽象方法,可重写可不重写
		System.out.println("正在睡觉......");
	}
}

public class Ocean extends Mammal{

	public void move(){
		System.out.println("正在移动。。。");
	}

	public void breathe(){
		System.out.println("正在呼吸。。。");
	}

	public void eat(){
		System.out.println("正在撕咬。。。");
	}


}

-------------------------------------------------
public interface IA{
	void eat();
}

public interface IC extends IA{
	void sayName();
	void sleep();
}

public class Test implements IA{

	public void eat(){
		System.out.println("正在吃......");
	}
	
	public void sayName(){
		System.out.println("I'm Tom");
	}
    
    public void sleep(){
        System.out.println("正在睡觉......");
    }
}

接口除 static 和 default 修饰的非抽象方法外,都是抽象方法,因此接口实现类需要重写除 static 和 default 修饰的方法外的所有方法。

六、继承数量

类的继承只可以继承一个,而接口的继承可以继承多个;例题5是抽象类的继承和实现,下图是接口的继承;

public interface IA{
	void eat();
}

public interface IB{
}

public interface IC extends IA,IB{   //可同时继承接口IA,IB
	void sayName();
	void sleep();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值