Java程序员你可能遗忘的点

面向过程与面向对象

首先看一下百度百科给出的解释

  • 面向过程 : 是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。
    • 面向对象 : 主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。

区别

  • 面向过程 : 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
    Java程序员你可能遗忘的点
  • 面向对象 : 是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
    Java程序员你可能遗忘的点

三大基本特征

  • 1,封装
    封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。对不可信的信息隐藏。隐藏实现细节,使得代码模块化。
    比如: 人是有名字、年龄、性别等属性,行为有:走路、说话等。人Person可以视为一个对象,其属性有名字name、年龄age、性别sex;行为(方法)有走路walk()、说话speek()。这就是一个封装。UML类图如下:
    Java程序员你可能遗忘的点

  • 2,继承
    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。同样也可以进行扩展。
    比如: 学生Student也是人,他可以继承人这个对象;但是学生也有自己的属性,譬如学号no、班级class。他也具有人的行为:走路、说话。也有自己的行为考试test();这就是一个继承。UML类图如下:
    Java程序员你可能遗忘的点

  • 3,多态
    多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
    多态存在的三个必要条件:

    • 继承
    • 重写(子类继承父类后对父类方法进行重新定义)
    • 父类引用指向子类对象
      比如: 学生继承人这个走路的行为,但是现在学生走路需要走正步。那么学生就需要重写走路walk()这个行为,这就是多态的一种表现。UML类图如下:
      Java程序员你可能遗忘的点

五大基本原则

  • 1,单一职责原则(SRP)
    一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
    比如: 一个人的接口IPerson同时实现了维护属性(name、age、sex)和行为(walk、speek);那么在更新人的姓名(name)的时候,或者执行用户的行为(walk);都会导致在这个类改变,这样就属于违背了单一职责原则。应该定义两个接口分别去维护属性和行为。
    优点

    • 1,降低类的复杂性,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
    • 2,提高类的可读性,提高系统的可维护性;
    • 3,降低变更引起的风险,变更是必然的,如果单一职责原则遵守的好,当修改一个接口的功能时,可以显著降低对其他接口功能的影响。
  • 2,开放封闭原则(OCP)
    软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
    坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!

  • 3,里氏替换原则(LSP)
    任何基类可以出现的地方,子类一定可以出现。通俗的说,即父类出现的地方子类也可以出现,并且将父类用子类替换后,也不会产生任何问题。然而,需要注意的是里氏替换原则反过来使用是不行的,子类出现的地方,父类未必适用。
    里氏替换原则为良好的继承定义了一个规范,一句简单的话包含了4层含义

    • 1,子类必须完全实现父类的方法
    • 2,子类可以拥有自己的“个性”
    • 3,覆盖或实现父类方法时输入参数可以被放大
    • 4,覆盖或实现父类方法时输出结果可以被缩小
  • 4,依赖倒置原则(DIP)
    高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。//“抽象”指“接口或抽象类”,“细节”指“实现类”
    依赖倒置的本质原则就是 :通过抽象(接口或抽象类)使各个类或模块实现彼此独立,互不影响,实现模块间的松耦合。

  • 5,接口隔离原则(ISP)
    客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
    接口隔离原则 : 不要把一大堆方法塞进一个接口里,导致这个接口变得臃肿无比。应该要根据实际需要,让接口中只有用得上的方法,也就是说要细化我们的接口。
    接口隔离原则和单一职责原则非常类似。单一职责原则要求接口的职责是单一的,而接口隔离原则要求接口尽量细化,它们有异曲同工之妙,都是要让我们的接口功能尽量单一,尽量小。
    但是,单一职责原则的着重点是在“职责”,而接口隔离原则只单纯地要求接口最小化。

Java 的平台无关性

一次编译,到处执行

Java种说的最多的一句话就是一次编译,到处执行;这就话的意思就是Java的class文件,可以在不需要任何改变的情况下,运行在多个平台上面(这里的平台可以理解为安装了jdk的不同的操作系统或者不同的设备,譬如打印机、扫描仪等)。这个就是Java 的平台无关性的体现。

如何实现Java 的平台无关性

  • 1,首先是Java代码的编译,我们都知道计算机只能识别0和1;真正计算机执行的文件也是由0和1组成的二进制的文件。JVM编译分成两步编译,一个是前端编译,一个属于后端编译;前端编译就是我们熟知的利用javac将Java代码编译成class文件。后端编译就是class文件运行在JVM上,由JVM将class文件再编译成0和1的二进制文件,最后由计算机进行执行。
  • 2,Java的语义规范;Java中基本数据类型的值域和行为都是由其自己定义的。而C/C++中,基本数据类型是由它的占位宽度决定的,占位宽度则是由所在平台决定的。所以,在不同的平台中,对于同一个C++程序的编译结果会出现不同的行为。
    举个简单的例子:对于int类型,在Java中,int占4个字节,这是固定的。但是在C++中却不是固定的了。在16位计算机上,int类型的长度可能为两字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。所以以后怎么发展就是未可知的。

总结实现Java平台无关性
Java语言规范
通过规定Java语言中基本数据类型的取值范围和行为
Class文件
所有Java文件要编译成统一的Class文件
Java虚拟机
通过Java虚拟机将Class文件转成对应平台的二进制文件等

为什么说Java只有值传递

首先我们理解一下值传递和引用传递的概念(请看百度百科)
值传递 : 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递 : 引用传递是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java之所以说只有值传递,即使在传递引用对象时,修改了引用对象;是的原有对象也发生改变,但是Java传递的是引用地址的复制,而不会原有的引用地址,可以理解为有两个引用地址指向同一个物理地址,所以修改对象也会使得原有对象发生改变。所以说Java只有值传递。引用传递的概念是直接传递引用地址,并非复制一份地址后再进行传递。

Java 中还支持的其他语言

Kotlin、Groovy、JRuby、Jython、Scala等,其中Kotlin、Groovy可以扩展一下

之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。