抽象类abstract的一些思考

简介: 最近有个小朋友问我什么是抽象类,他一直搞不懂抽象类,让我通俗的给他讲下。Emmmmmm,我问他:你用抽象类干过哪些事情。他的回答也在意料之中:压根没用过。

最近有个小朋友问我什么是抽象类,他一直搞不懂抽象类,让我通俗的给他讲下。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中的抽象类是一种特殊的类,它可以包含抽象方法和普通方法。抽象方法是没有实现的方法,只有声明,没有实现。抽象类不能被实例化,只能被继承。继承抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。抽象类可以有构造函数,但是不能是public或者protected,只能是private或者protected。抽象类可以有静态方法,也可以有非静态方法。抽象类可以有成员变量,也可以有静态成员变量。抽象类可以被继承,也可以被实现接口。
|
6月前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
59 0
|
6月前
|
存储
抽象类为什么有抽象方法?
抽象类为什么有抽象方法?
|
Java 编译器
认识抽象类
认识抽象类
83 0
|
Java
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
77 0
abstract
abstract
102 0
|
程序员 PHP 开发者
抽象类 Abstract|学习笔记
快速学习抽象类 Abstract
抽象类 Abstract|学习笔记
|
程序员 C# 索引
知识回顾:抽象类与抽象方法
知识回顾:抽象类与抽象方法
109 0