抽象类和接口(我学习做的笔记供大家参考)

抽象类和接口(我学习做的笔记供大家参考)

抽象类,定义

接口 定义

两者的区别

—————————–

抽象类:

abstract关键字修饰

public abstract class Pet{//抽象类

    public abstract void toHospitol();//抽象方法

}

(1)抽象类不能不被实例

但是可以创建一个抽象类类型的引用变量

,这个引用变量指向非抽象的子类类型;

Pet dog=new Dog();

dog.toHospital();

(2)抽象方法没有方法体

抽象类中可以有非抽象的构造方法,创建子类的

实例时可以调用。

没有 抽象够着方法,没有抽象静态方法

怎么调用了?????

(1)如果父类中有静态方法(用static 修饰),子类也 有同名的静态方法,在调用的(静态绑定)

时候还是调用父类的静态方法。

(2)如果父类和子类中都有成名的成员变量,在调用的饿时候调用的是父类的成员变量(静态绑定)

(3)父类有构造方法。子类也有构造方法,先调用父类,在调用子类(静态绑定)

(4)java虚拟机动态绑定机制,在子类中重写了父类的方法后,

在调用这个方法的时候是调用子类重写后的方法

eg:public abstract class Base{

    public String var=”base1″;

    

    public Base(){System.out.println(“父类的构造方法”);}

    public static void method4(){

    System.out.println(“父类的静态方法method4”);

          }

    }

public class Sub1 extends Base{

    public String var=”base2″;

    public Sub1(){System.out.println(“子类的构造方法”);}

    public static void method4(){

        

    System.out.println(“子类的静态方法method4”);

        }

    }

public class Test{

    Base base=new Sub1();//先调用父类的,在调用子类的

    base.method4();//调用的是父类的

    System.out.println(base.var);//也是调用父类的

    }

—————————————

接口:

为什么使用接口?

在java中支持单根继承的。

问题:实现防盗门的功能

将门定义为抽象类,锁定义为接口,

防盗门继承们,实现 锁的 接口

接口:interface  叫做实现一个接口

is a 的关系  防盗门是一个门

has  a 的关系   防盗门有一个锁

上锁、开锁是一种能力,接口表示一种能力

定义Door抽象类:具有开、关门的功能

定义Lock接口:具有上锁、开锁

编写防盗门类,继承door 实现lock接口

/*

 * 门抽象类

 */

public abstract class Door {

    //开

    public abstract void open();

    //关

    public abstract void close();

}

public interface DoorBell {

//门铃,具有拍照的功能

    public abstract void takePhotos();

}

public interface Lock {

//锁

    public abstract void lockup();

    //开锁

    public abstract void lockopenI();

}

//防盗门

public class TheftproofDoor extends Door implements Lock, DoorBell {

    public void lockup() {

        System.out.println(“插进钥匙,向左转三圈,锁上了”);

    }

    public void lockopenI() {

        System.out.println(“插进钥匙,向右转三圈,锁开了”);

    }

    public void open() {

        System.out.println(“用力推,门开了”);

    }

    public void close() {

        System.out.println(“亲亲拉门,门关上了”);

    }

    public void takePhotos() {

        System.out.println(“主人不在家,拍照可存档!”);

    }

}

public class Test {

    /**

     * @param args

     */

    public static void main(String[] args) {

        TheftproofDoor myDoor=new TheftproofDoor();

        myDoor.close();

        myDoor.open();

        myDoor.lockopenI();

        myDoor.lockup();

        myDoor.takePhotos();

    }

}

一个人可以具有多项能力,

一个类可以实现多个接口

接口有比抽象类更好的特性:

可以被多个继承

设计和实现完全分离

更自然的使用多态

更容易搭建程序框架

更容易跟换实现

…………

接口是一种约定:有些接口只有名称

面向接口编程:程序设计面向接口的约定而不考虑具体实现

public interface MyInterface{

    //变量: 默认:public static final

    public void foo();//默认:public abstrct

    //其他方法

    }

public class MyClass extends Base implements MyInterface,MyInterface2{

     }

继承了Base类,实现了接口MyInterface和MyInterface2

接口中的方法就是抽象方法,可以不写abstract

,模认的就是public abstract

特征:

接口不可以被实例化

实现类必须实现接口的所有方法

实现类可以实现多个接口,用implements/多接口使用逗号隔开变量都是静态常量:public static final

用程序来描述usb接口:

分析:

可以使用java接口来实现:

编写usb接口

实现usb接口

使用接口(父类的引用指向子类对象,多态)

接口表示一种能力,体系在接口的方法上

面向接口编程:

关心实现类有和能力,而不关心实现细节

面向接口的约定二不考虑接口的具体实现

//定义了usb接口规范

public interface UsbInterface {

//提供usb服务

    public void service();

}

/*

 * U盘

 */

public class UDisk implements UsbInterface{

    public void service(){

        System.out.println(“U盘:连接usb接口传输数据”);

        

    }

}

/*

 * 风扇

 */

public class UFan implements UsbInterface {

    

    public void service() {

        System.out.println(“开始转动了”);

        

    }

}

public class Test {

public static void main(String[] args) {

    UsbInterface udisk=new UDisk();

    udisk.service();

    

    System.out.println(“******实现接口********”);

    UsbInterface ufan=new UFan();

    ufan.service();    

       }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100823.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • string转成jsonarray_数值转换

    string转成jsonarray_数值转换第一种数据结构(JSONObject)StringjsonStr=“{“lng”:120.413354,“lat”:31.298914}”importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;publicclassJSONDataProcessing{publicstaticvoidmain(String[]args){StringjsonStr=

    2022年8月23日
    8
  • 面试官:给我讲一下分库分表方案

    面试官:给我讲一下分库分表方案

    2022年2月12日
    40
  • mycat读写分离配置文件详解_mycat实现读写分离

    mycat读写分离配置文件详解_mycat实现读写分离环境准备mysql5.7mycat1.6.7.1-release一主一从master:10.0.60.8:3307slave:10.0.60.8:3308配置实现读写分离前需要实现主从复制但是mycat不负责任何的数据同步问题。所以得自己配置mysql主从复制只需要配置schema.xml即可方式1:<dataHostname=”localhost1″maxCon=”1000″minCon=”10″balance=”1″writeType=”0″dbType=

    2022年10月13日
    0
  • LaTex 论文排版(1): Win10 下 LaTex所需软件安装 (Tex live 2018 + Tex studio)

    LaTex 论文排版(1): Win10 下 LaTex所需软件安装 (Tex live 2018 + Tex studio)目录一、LaTex简介(1)百度百科(2)其他理解二、LaTex环境配置(LaTex排版所需要安装的软件)1Texlive安装(1)离线安装(2)在线安装2Texstudio安装(1)设置中文界面(2)添加行号参考资料一、LaTex简介论文投稿时,有的期刊要求用LaTex对论文进行排版,也有的期刊在投稿指南写接受LaTe…

    2022年6月4日
    51
  • [Ruby] Ruby Variable Scope[通俗易懂]

    [Ruby] Ruby Variable Scope

    2022年2月2日
    54
  • 矩阵卷积运算过程讲解「建议收藏」

    矩阵卷积运算过程讲解「建议收藏」在爬虫处理验证码的过程中接触到矩阵卷积运算,关于该类运算,记录一下自己的心得。理论知识在讲述卷积过程前,我们来了解一下卷积公式。根据离散二维卷积公式:其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始。现在对于上面卷积过程进行分析:我们用来做例子的A矩阵为m×m(3×3)二维矩阵(被卷积矩阵),K为n×n(2×2)的二维矩阵(卷积核)。卷……

    2022年10月29日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号