抽象类是什么?

# 认识抽象类

        在认识抽象类之前来看这样一个需求:

        如果某个类中的某些方法需要被其它多个类反复重用,并且多个类中还要根据具体的需求,对继承过来的方法进行内部的各自完善,就是只需要这个继承过来的方法的整体结构,要知道在之前的我们学过继承,而类的继承只能多层继承,而不能多继承,那么此时这样的一个类该如何设置好呢?

## 1.描述:

        被abstract关键字修饰的类就是抽象类。

       

## 2.抽象类的特点

        <1>抽象类使用abstract关键字去修饰类,其中abstract表示抽象

        <2>抽象类不能创建对象,可通过子类创建,也就是:抽象类是多态的一种形式(多态中的向上转型)

 

        <3>抽象类中既可以存在普通的方法,还可以存在抽象方法。

public abstract class Pet {
    public void run(){
                        //此为普通方法,可以看到并不报错
    }
    public abstract void eat(); //此为抽象类方法。
                                
}

        这里要注意一个细节,用abstract修饰的方法与其他的方法并不相同,不是以“{}”结尾,而是以“;”结尾!

        下面就来介绍抽象方法:

## 3.抽象方法
  • 抽象方法:即为用abstract修饰的方法。
  • 抽象方法必须没有方法体,直接以英文分号结束。
  • 抽象方法必须在抽象类中。
  • 当子类继承抽象类时,子类必须重写抽象类中的所有抽象方法,否则子类也是抽象类

        那么针对这几点我们来做一下代码演示,从第二条开始反其道而行,不按照上述条件去做,会发生什么?

        

         我们在一个非抽象类中创建一个抽象类,发现idea报错,根据提示信息可知,抽象类方法是不可以在非抽象类中的。

        我们继续来看第三条:

        经过测试,发现是报错的,而如果将子类的SmallCat用abstract修饰后呢?

        发现并不报错,这样就完全验证第三条。就我自己认为,当我们对于一个概念不理解或是认识不深刻,就去试一试,多错几次就会明白了,而且也会明白究竟错在了哪里。

        那么抽象类了解到了,可是它究竟会用到什么地方呢?

        当父类中的方法不需要做具体实现(没有方法体),而只是提供一个方法,把具体代码的实现交给子类重写以后实现时,则就可以将类编写为抽象类

        这时候我给大家一个例子:

        首先我们定义一个Pet宠物类作为父类,在其中定义上一个方法eat(),再定义两个子类Cat,Dog,而猫和狗都属于宠物,但是吃的东西是不同的,所以在父类中的eat方法我们并不需要定义吃什么,而需要在各个子类中定义,这时候父类中的eat方法中其实是空的,具体的实现是要交给子类去实现的。

Pet cat = new Cat();//猫吃鱼
Pet dog = new Dog();//狗吃臭臭

        这种情况我们就需要用到抽象类。

        抽象类本质

        父类中提供抽象方法,交由子类做具体的事情。

         

        到这里,抽象类我们已经基本了解了,但是还有一个注意要点:

        类中的抽象方法虽然没有被子类直接使用,但是父类中的抽象方法也必须不能被删除,因为删除后就不能重写父类中的这个抽象方法了,不能重写则就不能在子类中完成子类自己的需求了。

        总结

        

        让我们上两道练习题来看看大家学习的如何

        

abstract class A {
    abstract void m1();

    public void m2() {
        System.out.println("A类中定义的m2方法");
    }
}

class B extends A {
    void m1() {
        system.out.println("B类中定义的m1方法");
        }
    }

public class Test {
    public static void main(String args[]){
    A a = new B();
    a.m1();
    a.m2();
    }
}

         请大家分析一下,编译结果是什么?又为什么会出现这样的结果?用到了什么知识点呢?欢迎在评论区讨论,另外也请大家思考以下几个问题:

        问题1:为什么抽象类不可以使用final关键字声明?
        问题2:一个抽象类中可以定义构造器吗?
        问题3:是否可以这样理解:抽象类就是比普通类多定义了抽象方法,除了不能直接进行类的实例化操作之外,并没有任何的不同?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值