抽象类和接口

抽象方法   

        1.抽象方法没有方法体。

        2.抽象方法用一个修饰关键字:abstract

        3.父类定义的抽象方法,必须在子类中进行方法重写。

        4.在定义了抽象方法之后,该类成为抽象类。

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

注意:

 在子类中都重写了方法之后,父类还定义抽象方法的意义?

 因为在父类中定义抽象方法还有一个原因是因为配合多态的使用,不然父类无法调用子类特有的行为或者特征。

 抽象类

  • 抽象类不能创建对象,但可以拥有构造方法,构造方法用来给子类使用

  • 抽象类中不一定有抽象方法(可以只有普通方法),但有抽象方法的类一定是抽象类

  • 在子类继承了抽象的父类之后,强制要求重写对应的抽象方法,如果子类也不重写,那就也为抽象类

  • 抽象类依然可以用于多态的使用

  • 抽象类可以用于作为一个程序架构体系中的 基类 (基础类)

访问权限修饰符 abstract class 类名 {   
    // 属性
    // 方法
}

接口

需求:现在有一个防盗的铁门,要求测试其开门和关门,以及上锁和开锁的功能,从猫眼查看门外。

分析:

  • 发现对象:一个玻璃门

  • 分析对象特征和行为

    行为:

    • 开门

    • 关门

  • 分析出一个玻璃门类 is a 门类

定义一个父类门可以开门和关门

public class Door {

	public void open() {
		System.out.println("开门");
	}
	
	public void close() {
		System.out.println("关门");
	}
	
}

定义猫眼和上锁以以及开锁接口

public interface CatEye {
	
	void look();
	
}
public interface Lock {
	
     void lock();
	
	 void unLock();
	
}

定义一个防盗门继承门父类,并且实现猫眼、上锁和开锁行为。

public class SecurityDoor extends Door implements Lock, CatEye {
	
	@Override
	public void lock() {
		System.out.println("门在上锁");
	}
	
	@Override
	public void unLock() {
		System.out.println("门在开锁");
	}
	
	@Override
	public void look() {
		System.out.println("通过猫眼看外边");
	}
	
}

测试类

public class Demo01 {

	public static void main(String[] args) {
	
		SecurityDoor door = new SecurityDoor();
		door.unLock();
		door.open();
		door.close();
		door.lock();
	}

}

注意:

java只能实现类的单继承,但是可以通过接口实现“多继承”。

类继承:子类 is a 父类

实现接口:子类 has a 父类

接口的使用

  • 在 Java 8 以前,接口中只能定义公共的抽象方法

  • 在接口中,定义的方法主要是公共的抽象方法

  • 在 Java 8 以后,接口中允许定义公共的默认(default)的方法,这样就不是强制子类重写方法了

  • 在接口中,定义的属性都是公共的静态常量

  • 接口之间可以使用继承关键字(extends)

  • 接口没有构造方法,也不能创建对象

  • 你可以把定义接口,及使用接口的步骤,联想对比定义父类及使用父类的步骤。

  • 在接口中主要定义的是行为。

    定义父类接口:
    访问权限修饰符 interface 接口名 {
        属性;
        行为;
    }

    子类继承父类:实现接口

访问权限修饰符 class 子类名 implements 接口名, 接口名2, ... {
}

 抽象类和接口的区别(面试题)

1.抽象类(abstract class)毕竟是一个类,Java 是单根继承嘛,所以一个子类只能继承一个抽象类;但是一个子类可以实现多个接口(interface),并且一个接口也可以继承多个接口来扩展自身。

2.抽象类和接口都不能实例化,但抽象类可以有构造方法,而接口不能有构造方法。

3.接口中定义的变量只能是 public static final 修饰的静态常量,而抽象类没有此限制。

4.有抽象方法的一定是抽象类,但抽象类不一定有抽象方法,它也可以有非抽象方法;而接口在 JDK 1.8 之前定义的方法都是抽象方法,在 JDK 1.8 开始也可以定义被 default 修饰的带实现的默认方法。不过如果一个实现类实现的两个接口都有相同的方法,而且它们对这个方法都进行了 default 默认实现,那么实现类就必须重写该方法。

5.接口在 JDK 1.8 之前因为只能定义抽象方法,所以所有的方法都是 public 修饰的(为了子类可以进行方法重写),但在 JDK 1.8 开始支持定义带实现的默认方法,所以在 JDK 1.9 的时候,也可以定义私有方法了,这样在接口中就可以复用内部方法了,当然了抽象方法依然只能是 public 修饰的;抽象类除了抽象方法不能定义为私有访问权限的之外,其他没有限制。

6.抽象类中可以定义静态方法,且可以被子类使用;而接口在 JDK 1.8 开始才可以定义静态方法,并且只能被接口调用,接口的实现类无法使用。

7.抽象类和接口都代表着系统的抽象层,但抽象类可以通过抽取子类共有的信息来实现属性和行为的复用,而接口往往是作为子类的行为规范,虽然也增加了默认实现,但也仅仅是行为的复用。

自我总结区别:

  1. 抽象类是半抽象的,接口是完全抽象的。
  2. 抽象类中有构造方法,接口中没有构造方法。
  3. 类和类之间只支持单继承,接口和接口之间支持多继承。
  4. 一个类可以实现多个接口,一类只能继承一个类。
  5. 接口中只允许出现常量和抽象方法。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值