热门标签 | 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 中有引用传递。


推荐阅读
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社区 版权所有