抽象类和接口的区别:
抽象类和接口的区别:
A:成员区别
抽象类:
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以常量
成员方法:只可以抽象
B:关系区别
类与类
继承,单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承
C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
1 package day9; 2 3 /** 4 * Created by admin on 2018/11/17. 5 * 接口的特点: 6 A:接口用关键字interface表示 7 interface 接口名 {} 8 B:类实现接口用implements表示 9 class 类名 implements 接口名 {} 10 C:接口不能实例化 11 那么,接口如何实例化呢? 12 按照多态的方式来实例化。 13 D:接口的子类 14 a:可以是抽象类。但是意义不大。 15 b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案) 16 17 由此可见: 18 A:具体类多态(几乎没有) 19 B:抽象类多态(常用) 20 C:接口多态(最常用) 21 */ 22 23 interface AnimalTrain { 24 void jump(); 25 } 26 27 //抽象类实现接口 28 abstract class Dogs implements AnimalTrain { 29 public void dogs(){ 30 System.out.println("this is dog"); 31 } 32 } 33 class Cats extends Dogs { 34 @Override 35 public void jump() { 36 System.out.println("this is jump"); 37 } 38 } 39 public class InterfaceDemo { 40 public static void main(String[] args){ 41 Dogs at = new Cats(); 42 at.jump(); 43 at.dogs(); 44 } 45 46 }
1 package day9; 2 3 /** 4 * Created by admin on 2018/11/17. 5 * 接口成员特点 6 成员变量;只能是常量,并且是静态的。 7 默认修饰符:public static final 8 建议:自己手动给出。 9 构造方法:接口没有构造方法。 10 成员方法:只能是抽象方法。 11 默认修饰符:public abstract 12 建议:自己手动给出。 13 14 所有的类都默认继承自一个类:Object。 15 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。 16 */ 17 interface Inter{ 18 public int num = 10; 19 public final int num2 = 20; 20 public static final int num3 = 30; 21 22 //错误: 需要<标识符> 23 //public Inter() {} 24 25 //接口方法不能带有主体 26 //public void show() {} 27 28 //abstract void show(); //默认public 29 void show(); //默认abstract 30 } 31 //接口名+Impl这种格式是接口的实现类格式 32 /* 33 class InterImpl implements Inter { 34 public InterImpl() { 35 super(); 36 } 37 } 38 */ 39 class InterImpl implements Inter { 40 public InterImpl() { 41 super(); 42 } 43 public void show() {} 44 } 45 public class InterfaceDemo2 { 46 public static void main(String[] args) { 47 System.out.println(); 48 InterImpl i = new InterImpl(); 49 i.show(); 50 Inter it = new InterImpl(); 51 System.out.println(it.num); 52 System.out.println(it.num2); 53 System.out.println(it.num3); 54 } 55 }
1 package day9; 2 3 import com.sun.prism.impl.paint.PaintUtil; 4 import org.omg.CORBA.PUBLIC_MEMBER; 5 6 /** 7 * Created by admin on 2018/11/17. 8 * /* 9 老师和学生案例,加入抽烟的额外功能 10 11 分析:从具体到抽象 12 老师:姓名,年龄,吃饭,睡觉 13 学生:姓名,年龄,吃饭,睡觉 14 15 由于有共性功能,我们提取出一个父类,人类。 16 17 人类: 18 姓名,年龄 19 吃饭(); 20 睡觉(){} 21 22 抽烟的额外功能不是人或者老师,或者学生一开始就应该具备的,所以,我们把它定义为接口 23 24 抽烟接口。 25 26 部分老师抽烟:实现抽烟接口 27 部分学生抽烟:实现抽烟接口 28 29 实现:从抽象到具体 30 31 使用:具体 32 */ 33 34 interface Smoking { 35 void smoking(); 36 } 37 abstract class People { 38 String name; 39 int age; 40 public People(){} 41 public People(String name,int age){ 42 this.name = name; 43 this.age = age; 44 } 45 public String getName() { 46 return name; 47 } 48 49 public void setName(String name) { 50 this.name = name; 51 } 52 53 public int getAge() { 54 return age; 55 } 56 57 public void setAge(int age) { 58 this.age = age; 59 } 60 public abstract void eat(); 61 62 public void sleep(){ 63 System.out.println("sleep"); 64 } 65 } 66 67 class Teacher extends People implements Smoking{ 68 public Teacher(){} 69 public Teacher(String name,int age){ 70 super(name, age); 71 } 72 public void eat() { 73 System.out.println("Teacher eat baicai"); 74 } 75 public void smoking(){ 76 System.out.println("Teacher smoking"); 77 } 78 } 79 80 abstract class Students extends People implements Smoking { 81 public Students() {} 82 public Students(String name,int age) { 83 super(name, age); 84 } 85 86 } 87 public class InterfaceTest { 88 public static void main(String[] args) { 89 Teacher t = new Teacher("BOB",20); 90 System.out.println(t.getName() + t.getAge()); 91 t.eat(); 92 t.smoking(); 93 } 94 95 }