abstrac和interface

一、抽象类:abstract

抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

格式如下

  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

  2)抽象类不能用来创建对象,但是它可以有构造方法,用来帮助子类实例化。

  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

抽象类的具体实例如下:

//定义一个抽象类,切记它不能用来创建对象
abstract class Employee
{
        //声明受保护的属性
    protected String name;
    protected String id;
    protected double pay;

        //抽象类的构造方法
    public Employee(String name,String id,double pay)
    {
          this.name = name;
          this.id = id;
          this.pay = pay;
    }
        //抽象类的普通成员方法
    public void print()
    {
     System.out.println("name = "+name+"id = "+id+"pay = "+pay);
    }

        //抽象类的抽象方法,子类必须实现该方法,不然子类也是抽象类
    public abstract void work();
}

//抽象类的一个子类
class Pro extends Employee
{
    public Pro(String name,String id,double pay)
    {
       //调用父类的构造函数进行初始化
       super(name,id,pay);
    }
    //实现了父类中的抽象方法,所以子类不再是抽象类
    public void work()
    {
       System.out.println("Pro work");
    }
}    

//抽象类的另一个子类
class Manager extends Employee
{
    private double bonus;
    public Manager(String name,String id,double pay,double bonus)
    {
      //调用父类的构造方法进行初始化
      super(name,id,pay);
      this.bonus = bonus;
    }
    //实现了父类中的方法,所以子类不再是抽象类
    public void work()
    {
     System.out.println("Manager work");
    }
}

//测试类
class YuanGongDemo
{
    public static void main(String[] args)
    {
      Pro p1 = new Pro("Liding","jfisd",578.5);
      p1.work();
      Manager p2 = new Manager("LiNing","技术部",4578.5,786.75);
      p2.work();
    }
}

  

二、接口:Interface

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口的主要特点:

1、接口中的成员变量默认都是public、static、final类型的,必须被显示初始化。

2、接口中的方法默认都是public、abstract类型的。

3、接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。

4、接口没有构造方法,不能被实例化。

5、一个接口不能实现另一个接口,但它可以继承多个其他接口。

6、接口必须通过类来实现它的抽象方法。

7、与子类继承抽象父类相似,当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。

8、一个类只能继承一个直接的父类,但能实现多个接口。

接口声明和实现方式如下:

具体举例如下:

多态的功能扩展
基于电脑的实例(电脑主板)
扩展(网卡、声卡、、、)

interface PCI             //扩展功能的接口(规则)
{
    public abstract void open();
    public abstract void close();
}

class MainBoard
{
    public void run()
    {
        System.out.println("Mi anBoard run");
    }
    public void usePCI(PCI p)  //PCI p = new NetCard() //接口型的引用指向自己的子类对象
    {
        p.open();
        p.close();
    }    

}

class NetCard implements PCI     // 实现网卡的连接
{
    public void open()
    {
      System.out.println("NetCard open");
    }
    public void close()
    {
       System.out.println("NetCard close");
    }
}

class SoundCard  implements PCI    // 实现声卡的连接
{
    public void open()
    {
      System.out.println("soundcard open");
    }
    public void close()
    {
       System.out.println("soundcard close");
    }
}

class DuoTaiDemo1   //测试类
{
    public static void main(String[] args)
    {
        MainBoard mb = new MainBoard();
        mb.run();
        mb.usePCI(new NetCard());
        mb.usePCI(new SoundCard());
    }
}
总结:抽象类和接口的区别

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

   2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

   3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

   4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

5)抽象类中的方法子类必须全部实现,不然子类也是抽象类,而接口中的抽象方法子类必须全部实现,是可选择实现的。

6)抽象类是一种模板设计模式,而接口是一种行为规范。

Java关键字整理之二的更多相关文章

  1. java数据结构整理(二)

    一.List接口,有序的Collection接口,能够精确地控制每个元素插入的位置,允许有相同的元素 1.链表,LinkedList实现了List接口,允许null元素,提供了get().remove ...

  2. java 复习整理(二 数据类型和几种变量)

    源文件声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则. 一个源文件中只能有一个public类 一个源文件可以有多个非public类 源文件的名 ...

  3. Java知识点整理(二)

    List.Set.Map典型实现 HashMap/ConcurrentHashMap Java线程池 Java线程池详解 如何更好的使用JAVA线程池 Spring MVC Spring MVC架构浅 ...

  4. Java关键字整理之一

    变量.函数.类的前面都可能会用到关键字,最常见的 private.public.protected.default 这四个修饰符的访问权限如下表: -------------------------- ...

  5. JAVA笔记整理(二),下载安装JDK

    Windows平台 1.登录Oracle官方网站(http://www.oracle.com/index.html),找到下载 2.选择要下载的版本,点击JDK DOWNLOAD 3.下载文件,先勾选 ...

  6. Java语言基础(二) Java关键字

    Java语言基础(二) Java关键字 Java关键字比较多,我就不列举出来了,只记录一些常用的小知识点: ①Java的关键字只有小写. ②then.sizeof都不是Java的关键字,熟悉C++的程 ...

  7. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI

    目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...

  8. Java多线程学习(二)synchronized关键字(2)

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  9. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

随机推荐

  1. nyoj--102--次方求模(快速幂)

    次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测试只有一行,其 ...

  2. 院校-美国:麻省理工学院(MIT)

    ylbtech-院校-美国:麻省理工学院(MIT) 麻省理工学院(Massachusetts Institute of Technology),简称麻省理工(MIT),坐落于美国马萨诸塞州波士顿都市区 ...

  3. java8新特性系列:[1]让你的eclipse支持java8

    package com.anhui.jdk8; /** * 针对eclipse是否支持java8小测试 * MainClass * @author zhongzh * */ public class ...

  4. 几款jQuery右键菜单插件介绍

    在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单. 类似右键菜单的组件网上很多.一般而言,改变浏览器的默认菜单应当 ...

  5. [JXOI 2018] 守卫 解题报告 (DP)

    interlinkage: https://www.luogu.org/problemnew/show/P4563 description: solution: 注意到对于范围$[l,r]$,$r$这 ...

  6. nginx配置访问密码,让用户输入用户名密码才能访问

    如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证.只有让用户输入正确的用户名和密码才能正常访问.效果如下: 在 ngi ...

  7. python学习-字符串 列表 元祖

    目录 Python翻转字符串(reverse string) 简单的步长为-1, 即字符串的翻转(常用) 递归反转 借用列表,使用reverse()方法 字符串常用操作 index split 切片 ...

  8. C++ 类型转换操作与操作符重载 operator type() 与 type operator()

    类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换.转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的 ...

  9. 2nd

    Java语言基础(常量的概述和使用) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常量 用双引 ...

  10. 使用光盘作为yum源安装ifconfig等网络命令

    # mkdir -p /mnt/cdrom# 如果是光驱:mount -t iso9660 /dev/cdrom /mnt/cdrom/# 如果是ISO:mount -o loop /usr/loca ...