IEnumeratorTItem和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了...
IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的。弱类型不但会有性能问题,最主要地是不能在编译时进行类型检查,编程靠运气,只有运行时在用户面前崩溃了(而且是某个特定数据、几十遍运行之后才崩溃了)才丢人地被发现。
所以最近10几年都是强调强类型的编程方式,尽量不要弱类型,尽量不要画蛇添足地去搞什么“动态”。真正好的动态程序,也是强类型的,解决了稳定性问题的。 而 .net 最初设计时,设计者不懂泛型。在 .net 正式发布了好几年之后,才支持泛型。而且是在 JIT 层面支持的,编译出来的代码少、性能好(远比 c++模板好很多)。 所以,一些过去非常重要的低级的接口,后来也都有使用泛型的重构实现。但是老的东西不能想当然地删除,就保留下来了。所以你会看到有一个不用泛型的枚举接口,还有一个使用泛型的。其核心目的是一样的,区别只是后者重构了、去掉了用弱类型的 object 来声明一些属性和方法的方式。 二者实质是一样的,不要分开来理解。 在你使用时,如果你会用,那么你可以只用泛型的,不要使用老的。 |
|
Java 抽象类和普通类、接口的区别——看完你就顿悟了
Java 抽象类和普通类、接口的区别——看完你就顿悟了
版权声明:本文为博主csdn_aiyang原创文章,未经博主允许不得转载。
目录(?)[+]
概念:
一、抽象类与普通类的区别:
1、普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。
2、普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。
看一个实例:
- public class Pet {
- public void play(){ //这是宠物类,普通父类,方法里是空的
- }
- }
- --------------------------
- public class Cat extends Pet { //这是子类,是一个猫类,重写了父类方法
- public void play(){
- System.out.println("猫爬树");
- }
- }
- ------------------------
- public class Dog extends Pet { //这是子类,是一个狗类,重写了父类方法
- public void play(){
- System.out.println("狗啃骨头");
- }
- }
- -------------------------
- public class Test {
- public static void main(String[] args) { //这是测试类,分别调用了子类的不同方法
- Pet p1=new Dog(); //多典型的多态表现啊,相当的给力
- Pet p2=new Cat();
- p1.play();
- p2.play();
- }
- }
-----------------------
输出结果:
狗啃骨头
猫爬树
-----------------------
问题:把父类改成抽象类,方法改成抽象方法,那么
public void play();//抽象方法没方法体
子类不变,依然重写父类方法,那这个跟普通父类没区别啊?
难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容不就得了,不跟抽象方法一个样吗??
别跟我说抽象类还不能实例化,哥也不需要去new它!
普通类都能搞定的,还弄个抽象类有什么意义?我前面都说了普通类的方法我可以空着不写,达到跟抽象类方法没方法体一样的效果。
既然两种方式都能达到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还是为了强制让别人用的时候必须强制化实现抽象方法省的你忘了什么的?
答:就是为了强制不能实例化,以及强制子类必须实现方法这不是你忘不忘的问题
你说你不去new它就行了,这话没错
那你想另一个问题,为什么要有访问控制呢?为什么要有private和public之分呢?
我可以全部public,不该访问的,我不访问就行了啊
小程序里,看不出什么区别,反而private成员要写一堆set和get函数,多麻烦,我自己写小程序的时候也会偷懒全部public
但是项目大了,代码多了,这种严谨的结构就很重要了
且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去
面向对象说到底就是方便你思考,模块化,易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。
二、抽象类与接口的区别:
1、概念不一样。接口是对动作的抽象,抽象类是对本质的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
2、使用不一样:
a.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
b.抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
c.抽象类主要用来抽象类别,接口主要用来抽象功能.
d.抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。
e.接口是设计的结果 ,抽象类是重构的结果
3、使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
注意:抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。
IEnumeratorTItem和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了...相关推荐
- Java抽象类(Abstract Class)与接口(Interface)区别
抽象类与接口比较 抽象类跟接口类似,都不能实例化,可能包含不需实现方法或已实现的方法. 抽象类可以定义一些不是静态或常量的字段,定义 public, protected, private访问级别的具体 ...
- java类接口的区别_java抽象类和接口区别
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- 中国移动宽带测试用哪个软件,中国移动评测四大类手机应用APP 看完你就知道5G和4G网络差距在哪儿...
原标题:中国移动评测四大类手机应用APP 看完你就知道5G和4G网络差距在哪儿 2020年5G手机大规模普及,数据显示,2020年国内5G手机渗透率高达62%.但不少人换5G手机却不用5G套餐,无法真 ...
- java抽象类及其派生类_java抽象类
本文指标: 1. 最基本的运用:掌握java类最简单,最核心的写法 2. 理论知识:语法角度,设计角度 3. 几种典型应用 最简单也是最核心的抽象类示例: 学习应该是一个循序渐进的过程,学java抽象 ...
- php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别
/** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...
- JAVA抽象类实例化对象实现接口的三种调用方法
在笔者的学习过程中抽象类实例化对象实现接口,笔者发现了三种表示方法.第一种是要实例化接口和抽象类,再用实例化的对象调用重写的的方法,这比较繁琐:第二种是直接实例化抽象类,将抽象类进行强转成对象,因为对 ...
- 【javase系列基础包装类及日历类详细总结,看完不会来找我~】
包装类及其日期类详细总结,希望大家能给小姐姐三联支持,感谢大家 1. 基本类型包装类 1.1 概述 1.2 Integer类的概述与使用 1.3 int和String的相互转换 1.4 案例-字符串中 ...
- java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)
3. 匿名内部类 没有名字的内部类就是匿名内部类. 3.1 匿名内部类特性 1. 匿名内部类总是默认实现某个接口或继承某个抽象类. 2.不能有构造方法,只能有一个实例. 3. 不能定义在任何静态成员. ...
最新文章
- OVS datapath包处理流程(二十)
- 阿里用回mysql_回mysql方式
- C# 快速高效率复制对象另一种方式 表达式树
- python数据结构与算法分析_数据结构和算法分析
- vim 图解常用快捷键操作
- PowerShell: 如何使用powershell处理Excel
- hackerrank刷题
- Fdfs_client类报错
- 老男孩python怎么样_老男孩Python为什么这么受关注?老男孩到底怎么样?
- 每周一磁 · 磁性材料的居里温度与工作温度
- 基于.net实现F4一键杀死指定进程(龙之谷秒掉器)
- 趣店PHP面经_腾讯助理PHP开发工程师外包岗面经
- 【流媒体开发】【数据与封装格式】20、AAC码流格式与解析
- 记一次艰苦的刷机历程,nexus7 刷cm12 nightly版,刷入gapps
- Git 使用的一些命令以及Git commit 注释格式
- Mybatis之Interceptor拦截器
- Java移位运算符详解实例——左移位运算符、带符号的右移位运算符
- 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)
- 推荐系统召回之itemCF
- Spring Boot集成Hibernate Validator
热门文章
- Angular中使用HttpClientModule模块实现get请求数据和post提交数据
- SpringBoot启动项目时提示:Error:java: 读取***.jar时出错;
- 【LeetCode】732. 我的日程安排表 III
- OpenHarmony的多内核
- Flutter 插件url_launcher简介及使用,打开外部浏览器,拨打电话,发送短信,打开微信,支付宝,qq等
- r语言plot函数x轴y轴名字_Matplotlib入门-1-plt.plot( )绘制折线图
- html棍子英雄电脑版源码,英雄难过棍子关电脑版
- golang string 转换 uint64_Golang 的 #x27;print#x27; 源码解读
- MySQL数据备份方式,及热备与冷备的优缺点
- Oracle 11G安装时遇到了net.bridge.bridge-nf-call-ip6tables错误