java之抽象类和继承抽象类解读

 更新时间:2023年11月30日 15:36:25   作者:wj振藩  
这篇文章主要介绍了java之抽象类和继承抽象类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

抽象类和继承抽象类

抽象类不能直接实例化,需要创建一个指向自己的对象引用(其子类)来实例化

代码:

public class Main
{
    public static void main(String[] args)
    {
        /* People people = new People(); */ //错误
        People p = new Man();
        p.eat();
        p.drink();
        /* p.palyGames() */ //此方法错误
        Man man = new Man();
        man.eat();
        man.playGames();
        Women women = new Women();
        women.eat();
        women.dressing();
    }
    abstract static class People{
        String name;
        int age;
        float height;
        float weight;
        public void eat(){
            System.out.println("人都会吃饭");
        }
        public abstract void drink();
    }
    static class Man extends People{
        float short_hair;
        public void playGames(){
            System.out.println("男的独有的打游戏技能");
        }
        @Override
        public void drink(){
            System.out.println("man drink 酒");
        }
    }
    static class Women extends People{
        float long_hair;
        public void dressing(){
            System.out.println("女的独有的化妆技能");
        }
        @Override
        public void drink(){
            System.out.println("women drink 饮料");
        }
    }
}

这里People不能直接实例化,如果是People p = new Man();

这里p只能调用People类n抽象方法和成果调用了其抽象方法,则访问的是其引用类(子类)

继承的抽象类;

如果是Man man= new Man();

这里man是可以调用类Man和其继承的抽象类People的方法和属性


这里写图片描述

抽象类、普通类、接口的区别

概念:

抽象类和具体类是相对的概念。“抽象”是一种存在思想逻辑中的概念,而“具体”是一种可见可触摸的现实对象。

简单说,比如“人”比“男人”抽象一点,“动物”又比“人”更抽象一点,而“生物”又比“动物”更抽象。  

抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。

抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。

总之,抽象概念的外延大,内涵小;具体概念的外延小,内涵大。

一、抽象类与普通类

(1)普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。

(2)普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。

(3)实例演示:

public class Pet {
 
public void play(){                //这是宠物类,普通父类,方法里是空的
}
}
--------------------------
public class Cat extends Pet {    //这是子类,是一个猫类,重写了父类方法
public void play(){
  System.out.println("1、猫爬树");
}
}
------------------------
public class Dog extends Pet {    //这是子类,是一个狗类,重写了父类方法
  public void play(){
  System.out.println("2、狗啃骨头");
 }
}
-------------------------
public class Test {
public static void main(String[] args) {  //这是测试类,分别调用了子类的不同方法
 
Pet p1=new Cat();                               //多典型的多态表现啊,相当的给力
Pet p2=new Dog();
 
p1.play();
p2.play();
}
}

-----------------------
输出结果:
1、猫爬树
2、狗啃骨头
-----------------------

问:

把父类改成抽象类,方法改成抽象方法,那么public void play();  子类不变,依然重写父类方法,那这个跟普通父类没区别啊?难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容不就得了,不跟抽象方法一个样吗??别跟我说抽象类还不能实例化,哥也不需要去new它!普通类都能搞定的,还弄个抽象类有什么意义?我前面都说了普通类的方法我可以空着不写,达到跟抽象类方法没方法体一样的效果。既然两种方式都能达到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还是为了强制让别人用的时候必须强制化实现抽象方法省的你忘了什么的?

答:

就是为了强制不能实例化,以及强制子类必须实现方法这不是你忘不忘的问题,你说你不去new它就行了,这话没错

那你想另一个问题,为什么要有访问控制呢?为什么要有private和public之分呢?我可以全部public,不该访问的,我不访问就行了啊?小程序里,看不出什么区别,反而private成员要写一堆set和get函数,多麻烦,我自己写小程序的时候也会偷懒全部public,但是项目大了,代码多了,这种严谨的结构就很重要了。且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去面向对象说到底就是方便你思考,易扩展、易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。

二、抽象类与接口

1、概念

接口是对动作的抽象,抽象类是对本质的抽象。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质的区别。这个“吃东西”是一个动作,你可以把“吃东西”定义成一个接口,然后让两个类去实现它的方法。

所以,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等。

2、使用情况

  • a.抽象类 和 接口 都是用来抽象具体对象的,但是接口的抽象级别最高;
  • b.抽象类可以有具体的方法和属性,  接口只能有抽象方法和不可变常量(final)
  • c.抽象类主要用来抽象类别,接口主要用来抽象功能;
  • d.抽象类中不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的;
  • e.抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。

3、使用方向

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

总结

抽象类的功能要远超过接口,但是,定义抽象类的代价高。

因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。

在这个类中,你必须继承或编写出其所有子类的所有共性。

虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。

而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java StackTraceElement实例代码

    Java StackTraceElement实例代码

    这篇文章主要介绍了Java StackTraceElement实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • HotSpot的Java对象模型之Oop-Klass模型详解

    HotSpot的Java对象模型之Oop-Klass模型详解

    这篇文章主要介绍了HotSpot的Java对象模型之Oop-Klass模型详解,在JVM层面,不仅Java类是对象,Java 方法也是对象, 字节码常量池也是对象,一切皆是对象,JVM使用不同的oop-klass模型来表示各种不同的对象,需要的朋友可以参考下
    2023-08-08
  • 浅谈一下数据库连接池Druid德鲁伊

    浅谈一下数据库连接池Druid德鲁伊

    数据库连接池就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理,需要的朋友可以参考下
    2023-05-05
  • MyBatis数组与集合判断空问题

    MyBatis数组与集合判断空问题

    这篇文章主要介绍了MyBatis数组与集合判断空问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Myeclipse链接Oracle等数据库时lo exception: The Network Adapter could not establish the connection

    Myeclipse链接Oracle等数据库时lo exception: The Network Adapter coul

    今天小编就为大家分享一篇关于Myeclipse链接Oracle等数据库时lo exception: The Network Adapter could not establish the connection,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • jdk中keytool的使用以及如何提取jks文件中的公钥和私钥

    jdk中keytool的使用以及如何提取jks文件中的公钥和私钥

    JKS文件由公钥和密钥构成利用Java Keytool工具生成的文件,它是由公钥和密钥构成的,下面这篇文章主要给大家介绍了关于jdk中keytool的使用以及如何提取jks文件中公钥和私钥的相关资料,需要的朋友可以参考下
    2024-03-03
  • logback高效状态管理器StatusManager源码解析

    logback高效状态管理器StatusManager源码解析

    这篇文章主要为大家介绍了logback高效状态管理器StatusManager源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 关于Java集合框架Collection接口详解

    关于Java集合框架Collection接口详解

    这篇文章主要介绍了关于Java集合框架Collection接口详解,Collection接口是Java集合框架中的基础接口,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等,需要的朋友可以参考下
    2023-05-05
  • JDBC自定义连接池过程详解

    JDBC自定义连接池过程详解

    这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java全面解析IO流相关知识

    Java全面解析IO流相关知识

    这篇文章主要介绍了IO流相关知识,包括File,字节流,字符流,特殊操作流(标准输入流,标准输出流,对象序列化与反序列化,properties与IO流结合)相关知识的总结
    2021-08-08

最新评论