zoukankan      html  css  js  c++  java
  • 【知了堂学习笔记】java 接口与抽象类

    本次主角:抽象类 、接口。

    对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题不能理解清楚,然后就去查阅资料对抽象类接口做了一些总结。

    1.抽象类:

      抽象类的建立,实在抽象方法之后的,所以想要了解抽象类得先了解抽象方法,抽象方法由名字可以知道它是一种特殊的方法,是抽象的,只有方法的声明,没有具体的实现。所以不能看到它的功能,表现得就很抽象。

      抽象方法必须要用abstract关键字来修饰,其声明格式为 abstract void f();所以如果一个类含有一个抽象方法就称这个类为抽象类,抽象类也必须用abstract关键字来修饰。

      这里有一个值得注意的地方就是一个类不包含抽象方法,但是被abstract关键字修饰,那么这个类也是抽象类。抽象类里面也不是只能有抽象方法,也能有普通方法。同样也能有成员变量,

      由于抽象类里面的抽象方法不能具体实现,所以为了解决这个问题用到了继承。而且子类必须覆盖父类所有的抽象方法,这个子类才能被实例化,否则这个子类也必须用abstract来修饰。

    具体代码:

    //这里就是定义了一个抽象类Demo,然后让其子类Demo1去继承它,下面子类的方法完全覆盖父类的方法所以编写时不会报错。
    package
    suanfa; abstract class Demo { abstract void show(); abstract void pi(); } class Demo1 extends Demo { void show() { } void pi() { } }
    //然而我将子类的pi方法注释了后,eclipse中就会出现以下错误,会告诉你必须实现pi这个方法。

    package
    suanfa; abstract class Demo { abstract void show(); abstract void pi(); } class Demo1 extends Demo { void show() { } // void pi() { // } }
    //当然这里我将Demo1写为abstract的,也不会出现错误
    package
    suanfa; abstract class Demo { abstract void show(); abstract void pi(); } abstract class Demo1 extends Demo { void show() { } // void pi() { // } }

    抽象类和普通类的主要区别:

    ①:抽象方法不能被private修饰,因为private修饰的方法子类无法覆盖。

    ②:抽象类不能创造对象。

    ③:如果一个类继承抽象类必须实现抽象类里面的所有方法,如果子类没实现抽象类的所有方法,则子类也必须用abstract关键字修饰为抽象类。

    2.接口:

    接口是一系列方法的声明,可以理解为一个存放方法的集合。接口只有方法的特征,不能具体的实现方法,所以接口里面的方法都是抽象方法。这些方法可以在不同的地方被不同的类实现。

    允许一个类遵循多个特定的接口。

    接口是一个极度抽象的类型。

    3.接口与抽象类的区别

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

    ②:抽象类的成员可以是各种类型的,接口中只能是public static final类型的;

    ③:接口中不能有静态代码块和静态方法,抽象类中可以有。

    ④:一个类只能继承一个抽象类(一对一),一个类可以实现多个接口(一对多);

    举例:

    抽象类是对事物的抽象,即对类抽象,而接口是抽象行为,对动作抽象。

    如:狗和猫都有共同的行为跑,那么可以将够设计为一个Dog类,猫设计为一个Cat类,但是不能将Run设计为一个类。此时可以将Run放入一个接口中,然后Dog与Cat都可以去实现Run这个接口,里面有run()这个方法,然后dog里面的小狗,大狗不同的类型,直接继承Dog这个类就好了。这里就可以看出,接口里面我只需要有跑这个动作的类都可以实现Run这个接口。

    抽象类是模板设计,而接口是行为规范。

    这里有一个网上找门和警报的例子:

    门都有open()与close()这两个动作,则可以定义一个抽象类Door或者一个Door接口来放置这两个方法:

    abstract class Door{
        public abstract void open();
        public abstract void close();
    }

    或者:

    interface Door{
        public abstract void open();
        public abstract void close();
    }

    但是后面我们需要加入报警这个动作进来,

    如果我们将报警alarm()也放入Door这个类中则会发现,我们所有的门都赋予了报警的功能,实际上我们有些门是不能报警的。

    如果我们将alarm(),open(),close()这三个动作都放入Door这个接口中,会发现我们需要用到报警这个功能的时候,接口中的open()与close()这两个方法也被实现了

    所以这里就可以看出alarm()与open()、close()完全是两个不同范畴的行为,open()、close()是门固有的行为,alarm()是后来加入的行为。所以最好的解决方法是将open()、close()这两个行为放入Alarm类中,将alarm()单独放入一个接口中。再设计一个报警们继承Door类和实现Alarm这个接口。

    abstract class Door{
        public abstract void open();
        public abstract void close();
    }
    interface Alarm{
        public abstract void alram();
    }
    class AlarmDoor extends Door implements Alarm{
    
        public void alram() {
        }
        public void open() {
        }
        public void close() {
        }
        
    }

      www.zhiliaotang.com 请关注知了堂,这里有太多好学的程序员,加入我们,一起嗨皮,共同学习。

  • 相关阅读:
    XML与JSON的对比
    WPF dataGrid下的ComboBox的绑定
    WPF 导出Excel(合并单元格)
    WPF x:key和x:name用法
    WPF Canvas
    WPF Visibility属性用法
    AxInterop.ShockwaveFlashObjects.dll 问题
    BadImageFormatException,未能加载正确的程序集XXX的解决办法
    inner join ,left join ,right join区别
    Mac系统下php.ini的位置
  • 原文地址:https://www.cnblogs.com/pipixiao/p/7498580.html
Copyright © 2011-2022 走看看