美文网首页Java 杂谈
抽象类abstract的一些思考

抽象类abstract的一些思考

作者: FantJ | 来源:发表于2018-07-23 14:15 被阅读115次

最近有个小朋友问我什么是抽象类,他一直搞不懂抽象类,让我通俗的给他讲下。Emmmmmm,我问他:你用抽象类干过哪些事情。他的回答也在意料之中:压根没用过。这就加大了我的难度,我不知道从哪下手给他科普。

然后我接着问:你对抽象类有什么了解呢?
他:我只知道它不能new。
我灵机一动:那你知道它为啥不能被new(实例化)呢?
他:好像是...(这乱略了,怕把你也搞懵)

问题

他说了一大堆,我听出来的几个问题就是:

  1. 和接口概念混淆
  2. 对抽象类的使用缺乏理解

答案

好了,那今天就简单的解决下这个问题。

  1. 首先和interface的区别我之前有个文章:Java中抽象类和接口有什么异同?
  2. 对抽象类的使用缺乏理解,我认为就是用的太少,如果你用过抽象类工厂的开发模式,你一定会对抽象类有很深的理解。我简单了写了一个demo:
Phone.class
/**
 * Created by Fant.J.
 */
public abstract class Phone {
    void print(){
        System.out.println("this is a Phone abstract class method");
    }

    abstract void show();
}
PhoneMi.class
/**
 * Created by Fant.J.
 */
public class PhoneMi extends Phone {
    @Override
    void show() {
        System.out.println("my name is mi");
    }
}

测试类Test.class
/**
 * Created by Fant.J.
 */
public class Test {

    public static void main(String[] args) {
        Phone phone = new Phone() {
            @Override
            void show() {
                System.out.println("my name is mi");
            }
        };
        phone.show();

        Phone phone1 = new PhoneMi();
        phone1.show();

        phone1.print();

    }

}

执行结果
my name is mi
my name is mi
this is a Phone abstract class method

疑点解答:

这几个问题清楚了,为什么不能实例化abstract类的思路就很清晰了。

1. Phone类里的print方法如何能被调用?

子类继承Phone后,会把print方法继承,通过子类对象就可以调用到print方法

2. new Phone会有什么结果?

我在测试类里main方法的第一行就是在重写Phone类,实例化Phone是走不通的。重写这个类实质上也是对该类的一个继承实现。即,我重写了show方法,和PhoneMi里的show方法一模一样,那么我们就可以认为,我们通过实现内部类的形式实例化了一个新的子类对象 phone ,通过phone,我们也可以调用print方法,因为它的本质是Phone的子类实现。而不是抽象类本身。

3. 为什么能new Phone的子类PhoneMi

我们实例化Phone的子类PhoneMi是行的通的,因为PhoneMi是前者的子类,作为抽象类的子类,必须要继承抽象类方法,只有重写了抽象类方法,才符合java规范(不会报错),此时,我们就可以把PhoneMi当作一个普通的类使用,和普通类不一样的是:它可以调用抽象类(父类)的方法。

小朋友继续问:那如果我写一个普通类,里面写上show方法和print方法,不是更加简洁吗?
我:emmmmm(心里一万个草泥马,我前面一堆是白说了吗?然后想了想是不是自己说的还不够清澈,思考了一会说)我认为抽象类本身就是在做设计模式,它的存在就是为了更好的设计而存在,你之前不是说过你从来没有用过它就可以完成任务工作麽?对,就是这个道理。如果你真正想解决冗余、效率、代码架构清晰等问题,你才会考虑设计模式。

好了,还看?最后一些客气的话还需要我贴出来吗?如果你现在对它还不够清楚,下方留言,看到后会回复。谢谢!

相关文章

  • java -abstract类、接口

    abstract类(抽象类) abstract类(抽象类) ** abstract()方法** abstract类...

  • 抽象类abstract的一些思考

    最近有个小朋友问我什么是抽象类,他一直搞不懂抽象类,让我通俗的给他讲下。Emmmmmm,我问他:你用抽象类干过哪些...

  • Java -- abstract 和 interface 的理解

    一、Abstract 1,abstract class 抽象类 abstract修饰类,会使该类成为一个抽象类,这...

  • 抽象类

    抽象类用abstract修饰,抽象方法也用abstract修饰抽象类的特点:1)用abstract修饰的类2)抽象...

  • 抽象类和接口

    抽象类特点 抽象类和抽象方法都需要使用abstract修饰抽象类 abstract class test{}。抽象...

  • 抽象类 接口 多态

    抽象类abstract class 被 abstract 关键字修饰的 类 称为 抽象类 1. 为什么需要抽象类?...

  • NO.27 抽象类

    抽象类的特点 1、 抽象类和抽象方法必须使用abstract修饰 abstract class 类名...

  • 抽象类

    抽象类(abstract class) 什么是抽象类被abstract关键字修饰的类 抽象类产生的原因随着继承层次...

  • JAVA的零散记录 - 抽象类(abstract class)

    抽象类(abstract class) 抽象类(abstract class): 如果一个class定义了方法,但...

  • Kotlin学习笔记(二)类的分类

    1.抽象类 抽象类用abstract关键字修饰,抽象类用abstract修饰的函数,就做抽象函数。抽象类中也可以有...

网友评论

    本文标题:抽象类abstract的一些思考

    本文链接:https://www.haomeiwen.com/subject/evzdmftx.html