接口引入与instanceof
接口
是这个事物本身不具有的功能,是一种额外的扩展功能
是所有行为的抽象,面向接口编程,目的是让程序更加易于维护,扩展性更强,接口只定义标准,而非具体实现;
特点
接口不能实例化(不能直接创建对象)
接口多态(实例化接口)
接口名 对象名 = new 接口子实现类名(); (前提:子实现类为具体类)
实现接口
接口子类(实现类) implements 接口名{
实现接口方法
}
接口的成员特点
成员变量:只能是常量,存在默认修饰符 public static final
成员方法(非静态):只能是抽象方法没有方法体
没有构造方法(子实现类和接口的关系是实现关系)
关系问题
类与类
继承关系(extends),不支持多继承,可以多层继承
类与接口
实现关系(implements),一个类继承另一个类的同时,支持多实现多个接口,接口名之间 , 隔开即可
接口与接口
继承关系(extends),支持单继承,也支持多继承,也可以多层继承
抽象类和接口的区别(面试题)
成员区别
抽象类
成员变量:既可以是自定义常量,也,可以是变量
成员方法:既可以存在抽象方法,也可以存在非抽象方法
存在构造方法
接口
成员变量:只能是常量 存在默认修饰符:public static final
成员方法;只能是抽象方法
没有构造方法
关系区别
类与类:继承关系,只能单继承
类与接口:实现关系(implements),一个类继承另一个类的同时,支持多实现多个接口
接口与接口:继承关系(extends),支持单继承,也支持多继承,也可以多层继承
设计理念区别
抽象类:有继承关系,抽象类不能创建对象,借助于抽象类多态(子类是具体类),进行实例化;
体现的核心思想: "is a"的关系
接口:体现的是事物的一种额外的扩展功能,本身不具备,需要实现接口才能具备这个功能!
体现的核心思想:"like a"的关系
接口的定义
interface 接口名称{
全局常量;
抽象方法;
}
package com.qf.tast;
public class Test {
public static void main(String[] args){
Girl mm = new Girl("老八");
mm.sleep();
mm.eat();
mm.run();
mm.print();
}
interface IEat{
//public abstrace void eat();
void eat(); //接口中定义的方法没有修饰符,默认为public abstrace
//public abstrace final int NUM = 10;
int NUM =10;
//在jdk1.8后新特性,可以被所有实现类继承
public default void print(){
System.out.println("eat");
}
}
interface IRun{
void run();
}
//接口可以被继承(可以多继承)
interface ISleep extends IEat,IRun{
void sleep();
}
//具体类实现接口必须实现接口的所有方法
static class Girl implements ISleep,IEat,IRun{
private String name;
public Girl(String name){
this.name = name;
}
public Girl (){
}
public void sleep(){
System.out.println(name+"爱睡觉");
}
public void eat(){
System.out.println(name +"爱吃");
}
public void run(){
System.out.println(name+"爱跑");
}
}
}
接口的概念
1,接口是一组行为的规范,定义,没有实现
2,使用接口,可让我们的程序更加利于变化
3,接口是面向对象编程体系中的思想精髓之一
4,面向对象设计法则:基于面向接口
接口的使用规则
1,定义一个接口,使用interface关键字
2,在一个接口中,只能定义常量,抽象方法,jdk1.8后可以定义默认的实现方法
3,接口可以继承多个接口, extends x,y
4,一个具体类实现接口使用implements关键字
5,一个类可以实现多个接口
6,抽象类实现接口可以不实现接口的方法
7,在接口定义的方法没有生声明访问修饰符,默认为public
8,接口不能有构造方法
9,接口不能被实例化
面向对象设计原则
1,对修改关闭,对扩展开放
2,面向接口编程
instanceof 关键字
父类的实际法则
通过instanceof关键字,我们可以检查对象的类型,但如果一个父类的子类过多,判断就会很繁琐
1,父类通常都设计为抽象类或者接口,优先考虑接口,其次抽象类
2,一个具体的类尽可能不去继承另一个具体类,这样的好处是无需检查对象是否为父类的对象
`