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

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

抽象类,定义

接口 定义

两者的区别

—————————–

抽象类:

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用RadControls的RadMenu控件开发系统菜单

    使用RadControls的RadMenu控件开发系统菜单关于菜单这个话题我想应该是不讲则懂,所以本文不会多讲这些概念,则重关注RadControls控件中的RadMenu控件的使用,结合数据库来开发一个系统菜单。一、数据库设计这里我就使用Access作为示例数据库,详细见下图:表字段依次为:自动编号、菜单编码、菜单名称、请求地址、菜单上显示的图片地址、快捷键(RadMenu控件支持)、菜单顺序、菜单级限、是否为末级和父菜单编码。整个设计中…

    2022年7月24日
    5
  • tgp饥荒服务器文件夹,《饥荒》TGP版服务器搭建及设置图文教程 TGP版怎么建服务器…

    tgp饥荒服务器文件夹,《饥荒》TGP版服务器搭建及设置图文教程 TGP版怎么建服务器…

    2021年11月28日
    43
  • 操作系统之引导

    系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一。按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后。具体的引导工作,是由BIOS完成的。BIOS维持一个可用

    2021年12月25日
    50
  • pyqt5安装配置_如何安装pyqt5安装包

    pyqt5安装配置_如何安装pyqt5安装包上篇介绍了Python的安装:PyQt5教程(一)——Python的安装,本篇介绍PyQt5的安装。一、安装PyQt5:1、方法一:使用pip命令在线安装。输入以下命令可以直接安装:pipinstallPyQt5由于安装默认使用国外的镜像,可能因为网络问题会导致下载慢或者失败的现象。所以我们可以使用国内的镜像,比如豆瓣提供的镜像。只需要加上“-ihttps://pyp…

    2025年5月30日
    8
  • Qt实现简单的单例模式

    Qt实现简单的单例模式

    2021年9月11日
    63
  • linux中用户态和内核态是什么_用户态内核

    linux中用户态和内核态是什么_用户态内核内核态:操作系统在内核态运行——运行操作系统程序用户态:应用程序只能在用户态运行——运行用户程序当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。…

    2022年9月17日
    3

发表回复

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

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