zoukankan      html  css  js  c++  java
  • 抽象类和接口的区别:

    抽象类和接口的区别:
    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 }
  • 相关阅读:
    JVM探究之 —— HotSpot虚拟机对象探秘
    JVM探究之 —— Java内存区域
    线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
    dubbo线程模型配置
    hash bucket
    java 查看线程的信息
    List,Set,Map存取元素各有什么特点
    java 让图片变黑白
    springMVC 防重校验(拦截器)
    BigDecimal 的幂次方运算
  • 原文地址:https://www.cnblogs.com/royfans/p/9975780.html
Copyright © 2011-2022 走看看