热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里巴巴Java成神之路笔记(1)Java面向对象基础

Java面向对象基础Java三大特性–继承封装多态1.关于多态的进一步理解现在流行一种说法,包括维基百科也说明,多态还分为动态多态****和静态多
Java 面向对象基础

Java三大特性–继承封装多态


1.关于多态的进一步理解

现在流行一种说法, 包括维基百科也说明, 多态还分为动态多态****和静态多态
通常的那种 父类引用指向子类对象 这种动态绑定认为是动态多态, 因为只有在运行期才能知道真正调用的是哪个类的方法。

还有一种静态多态, 一般认为 Java 中的方法重载是一种静态多态, 因为他需要在编译期决定具体调用哪个方法

关于这个动态静态的说法, 我更偏向于重载和多态其实是无关的。

但是也要看情况, 普通场合, 我会认为只有方法的重写算是多态, 毕竟这是我的观点。但是如果在面试的时候, 我“ 可能” 会认为重载也算是多态, 毕竟面试官也有他的观点。 我会和面试官说: 我认为, 多态应该是一种运行期特性, Java 中的重写是多态的体现。 不过也有人提出重载是一种静态多态的想法, 这个问题在 StackOverflow 等网站上有很多人讨论, 但是并没有什么定论。 我更加倾向于重载不是多态。

2. 重载 VS 重写

关于重载和重写, 你应该知道以下几点:

1、 重载是一个编译期概念、 重写是一个运行期间概念。
2、 重载遵循所谓“ 编译期绑定” , 即在编译时根据参数变量的类型判断应该调用哪个方法。
3、 重写遵循所谓“ 运行期绑定” , 即在运行的时候, 根据引用变量所指向的实际对象的类型来调用方法。
4、 因为在编译期已经确定调用哪个方法, 所以重载并不是多态。 而重写是多态。 重载只是一种语言特性, 是一种语法规则, 与多态无关, 与面向对象也无关。 (: 严格来说,重载是编译时多态, 即静态多态。 但是, Java 中提到的多态,在不特别说明的情况下都指动态多态)

3. 继承和实现

继承: 如果多个类的某个部分的功能相同, 那么可以抽象出一个类出来, 把他们的相同部分都放到父类里, 让他们都继承这个类。
实现: 如果多个类处理的目标是一样的, 但是处理的方法方式不同, 那么就定义一个接口, 也就是一个标准, 让他们的实现这个接口, 各自实现自己具体的处理方法来处理那个目标。

所以,
继承根本原因是因为要复用,
实现根本原因是需要定义一个标准

在 Java 中, 继承使用 extends 关键字实现, 而实现通过 implements 关键字。

在接口中只能定义全局常量( static final) 和无实现的方法( Java 8 以后可以有defult 方法) ; 而在继承中可以定义属性方法,变量,常量等。

4. Java变量

Java 中共有三种变量, 分别是类变量成员变量局部变量
他们分别存放在 JVM的方法区堆内存栈内存中。

5. 成员变量和方法的作用域

对于成员变量和方法的作用域, public, protected, private 以及不写之间的区别:

public : 所有类或者对象都可以直接访问。
protected : 同在一个包中的类可见,其他包下子类可见。
default : 同一个包的可见, 其他包子类也不可见
private : 只有该类可见,其他所有(包括子类)不可见

平台无关性

对于 Java 的平台无关性的支持, 是分布在整个 Java 体系结构中的。 其中扮演者重要的角色的有 :

  1. Java 语言规范、
  2. Class 文件、
  3. Java虚拟机(JVM)。

编译原理基础

在 Java 平台中, 想要把 Java 文件, 编译成二进制文件, 需要经过两步编译, 前端编译和后端编译:

  • 前端编译 主要指与源语言有关但与目标机无关的部分。 Java 中, 我们所熟知的 javac的编译就是前端编译。 除了这种以外, 我们使用的很多 IDE, 如 eclipse, idea 等, 都内置了前端编译器。 主要功能就是把.java 代码转换成class文件。

  • 后端编译 主要是将中间代码再翻译成机器语言。 Java 中, 这一步骤就是 Java 虚拟机来执行的。


JVM

对于不同的硬件和操作系统, 最主要的区别就是指令不同。 比如同样执行 a+b, A 操作系统对应的二进制指令可能是 10001000, 而 B 操作系统对应的指令可能是 11101110。那么, 想要做到跨平台, 最重要的就是可以根据对应的硬件和操作系统生成对应的二进制指令。

而这一工作, 主要由我们的 Java 虚拟机完成。

虽然 Java 语言是平台无关的, 但JVM 却是平台有关的, 不同的操作系统上面要安装对应的 JVM。

Java语言规范

已经有了统一的 Class 文件, 以及可以在不同平台上将 Class 文件翻译成对应的二进制文件的 Java 虚拟机, Java 就可以彻底实现跨平台了吗?

其实并不是的, Java 语言在跨平台方面也是做了一些努力的, 这些努力被定义在Java 语言规范中。

比如, Java 中基本数据类型的值域和行为都是由其自己定义的。 而 C/C++中, 基本数据类型是由它的占位宽度决定的, 占位宽度则是由所在平台决定的。 所以, 在不同的平台中, 对于同一个 C++程序的编译结果会出现不同的行为。

举一个简单的例子, 对于 int 类型, 在 Java 中, int 占 4 个字节, 这是固定的。
但是在 C++中却不是固定的了。 在 16 位计算机上, int 类型的长度可能为两字节; 在32 位计算机上, 可能为 4 字节; 当 64 位计算机流行起来后, int 类型的长度可能会达到 8字节。

Java通过保证基本数据类型在所有平台的一致性,为平台无关性提供强了有力的支持。

语言无关性

其实, Java 的无关性不仅仅体现在平台无关性上面, 向外扩展一下, Java 还具有语言无关性

前面我们提到过。 JVM 其实并不是和 Java 文件进行交互的, 而是和 Class 文件, 也就是说, 其实 JVM 运行的时候, 并不依赖于 Java 语言

时至今日, 商业机构和开源机构已经在 Java 语言之外发展出一大批可以在 JVM 上运行的语言了, 如 Groovy、 Scala、 Jython 等。 之所以可以支持, 就是因为这些语言也可以被编译成字节码( Class 文件) 。
虚拟机并不关心字节码是有哪种语言编译而来的

Java中的值传递

常见的误解:

  • 错误理解一: 值传递和引用传递, 区分的条件是传递的内容, 如果是个值, 就是值传递。如果是个引用, 就是引用传递。
  • 错误理解二: Java 是引用传递。
  • 错误理解三: 传递的参数如果是普通类型, 那就是值传递, 如果是对象, 那就是引用传递。

具体内容可以参考:传送门

结论: Java 中只有值传递, 只不过 传递的内容对象的引用 。但是, 绝对不能认为 Java 中有引用传递。


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
长大的夜夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有