面向对象:
都知道Java是面向对象的编程语言,那么面向对象与面向过程的区别是什么?
先说面向过程吧,明白了面向过程来谈面向对象就更加好理解了。
面向过程:就是根据我们的思路去分析问题的解决步骤,和玩游戏本质一样,走这一步然后下一步,有个步骤的流程,每个步骤就是一个函数方法来实现的。
用经典的例子就是:五子棋。
1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。
面向对象:三大特性/封装、继承、多态。
"世间万物"都是对象,将对象抽象成一个类,例如把我自己进行抽象成一个类,那这个类就是人类了,而人类的具体实例化又是我自己了,可以理解类为一个类型。
**封装:**将人这个类包含的共有属性进行汇合,例如:年龄、性别、眼睛/2、鼻子/1、嘴巴/1等等。将这些功能给封装起来方便其他人调用,对其他人有什么好处?能够隐藏功能属性的实现细节,对外仅提供公共的访问方式,能复用又安全。
**继承:**我自己继承了我妈和我爸的一些属性,比如:我眼睛长得像我妈的眼睛。
**多态:**我自己就是一个实体,当然在类中不单单就只有黄种人了,还有其他肤色的人/派生类。
按照面向对象思想可以将五子棋分为:黑白双方、棋盘系统、规则系统。
第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
面向对象/抽象类-接口-重载与重写
抽象类:
抽象类可以有非抽象的方法。
一个类可以实现多个接口,但只能实现一个抽象类。
接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)
抽象类就像是一本武林基本功秘籍,如果是private,那么就不能衍生出其他的功法秘籍了。
接口:
所谓的接口就是将这些功能给封装起来,然后类/抽象类可以实现接口的功能方法,这些方法必须是抽象的,例如眼睛也可以再进行区分,接口中没有对眼睛进行具体的区分和实现,这就是抽象,让人能够去猜想,接口不是类,因为类能有属性,而接口就只能有方法。
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
JDK 1.8 以后,接口里可以有静态方法和方法体
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
重载:只能在同一个类中,同一个方法,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
面向过程:
优点:性能比面向对象高,因为面向对象中类调用时需要实例化,开销比较大,比较消耗资源。
缺点:没有面向对象易维护、易复用、易扩展。
面向对象:
优点:易维护、易复用、易扩展,低耦合。
缺点:性能比面向过程低。
如何将封装、继承、多态、接口、抽象类、重载、重写联系?
封装:
父类/老师类:属性(姓名、性别、年龄)/ 方法 (上课、下课)。
接口/方法:讲课、布置作业。
继承:
子类(语文老师类、数学老师类)继承老师类并实现接口。
多态:
一个接口,多个方法。
语文老师类/方法:写范文。
数学老师类/方法:写公式。
重载:
语文老师可能一天要布置多次作业,数学老师也是如此。
重写:
语文老师上课与下课不能太提前也不能太过拖延,这样会影响到其他老师的课程,数学老师也是如此。
总结下面向对象的五大基本原则:
单一职责原则SRP(Single Responsibility Principle)
一个类的功能要单一
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
PS:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
里式替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。
PS:假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能 造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
低耦合、高内聚:
低耦合:类之间的依赖性降到最小。
高内聚:模块内的各个功能/元素之间的联系达到高度紧密。
上面讲完了面向对象,下面来看看Java的其他特点:
跨平台:
Java代码是运行在JVM中的,首先将.java文件编译成二进制字节码/中间码.class文件,随后JVM对class文件进行解析并执行,因为不同系统平台可以有不同的JVM,所以Java不需要考虑平台。
JVM:
JRE的一部分。
运行Java字节码的虚拟机。
.java文件/源代码——> 通过JDK中的javac编译——>.class文件——>JVM。
JDK:
编译、调试java程序用的开发工具包。
JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。
JRE:
Java运行时环境,所有的Java 程序都要在JRE下才能运行。
JVM——>JRE——>JDK。
Oracle JDK 与 Open JDK:
非常接近 - Oracle JDK版本构建过程基于OpenJDK 7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和Java WebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源Oracle JDK的所有部分,除了我们考虑商业功能的部分。
Oracle JDK性能比OpenJDK好。
Java与C++的区别:
都是面向对象的语言,都支持封装、继承和多态
Java 不提供指针来直接访问内存,程序内存更加安全
Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
Java 有自动内存管理机制,不需要程序员手动释放无用内存
什么是 Java 程序的主类 应用程序和小程序的主类有何不同?
程序主类就是包含有main()方法的类。
Java小程序:applet 小程序。
Java 应用程序与小程序之间有那些差别?
应用程序:主线程启动/main。
小程序:调用init()/run()在浏览器运行。
应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。