Java 相关知识
Java 基础
Java和C++主要区别有哪些?各有哪些优缺点?
Java 和 C++都是面向对象的语言,他们一个是编译型语言,一个是解释型语言。
C++是编译型语言(首先将源代码编译生成机器码,再由机器运行机器码),执行速度快、效率高;依赖编译器、跨平台性差些。
Java是解释型语言(源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。),执行速度慢、效率低;依赖解释器、跨平台性好。PS:也有人说Java是半编译、半解释型语言。Java 编译器(javac)先将java源程序编译成Java字节码(.class),JVM负责解释执行字节码文件。
二者更多的主要区别如下:
Java | C++ | |
---|---|---|
跨平台 | 平台无关 | 平台有关 |
内存管理 | 自动 | 手动 |
参数传递方式 | 值传递 | 引用、指针、值传递 |
多重继承 | 不支持 | 支持 |
系统资源的控制能力 | 弱 | 强 |
适合领域 | 企业级Web应用开发 | 系统编程、游戏开发等 |
- C++是平台相关的,Java是平台无关的。
- Java是自动内存管理和垃圾回收的,C++需要手动内存管理,支持析构函数,Java没有析构函数的概念。
- C++支持指针,引用,传值调用 。Java只有值传递。
- C++支持多重继承,包括虚拟继承 。Java只允许单继承,需要多继承的情况要使用接口。
- C++对所有的数字类型有标准的范围限制,但字节长度是跟具体实现相关的,同一个类型在不同操作系统可能长度不一样。Java在所有平台上对所有的基本类型都有标准的范围限制和字节长度。
- C++除了一些比较少见的情况之外和C语言兼容 。 Java没有对任何之前的语言向前兼容。但在语法上受 C/C++ 的影响很大
- C++允许直接调用本地的系统库 。 Java要通过JNI调用。
Java的优点是跨平台能力强,支持自动内存管理减少内存泄露风险。有大量的库和框架支持(特别是企业级应用开发),并且还有较强的社区支持和资源。
Java的缺点是性能不如C++,对系统资源的控制能力较弱。
C++的优点是性能高,控制能力强。可以直接操作内存和硬件的能力。适用于系统编程、游戏开发、实时系统。同时也有丰富的库和工具,特别是在图形和游戏领域。
C++的缺点是内存管理复杂,容易出错。跨平台开发困难。代码会比较复杂,学习曲线比较陡。
如何理解面向对象和面向过程?
回答
面向过程把问题分解成一个一个步骤,每个步骤用函数实现,依次调用即可。
我们在进行面向过程编程的时候,不需要考虑那么多,上来先定义一个函数,然后使用各种诸如if-else、for-each等方式进行代码执行。最典型的用法就是实现一个简单的算法,比如实现冒泡排序。
面向对象将问题分解成一个一个步骤,对每个步骤进行相应的抽象,形成对象,通过不同对象之间的调用,组合解决问题。
就是说,在进行面向对象进行编程的时候,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现。比如想要造一辆车,上来要先把车的各种属性定义出来,然后抽象成一个Car类。
面向对象有封装、继承、多态三大基本特征,和单一职责原则、开放封闭原则、Liskov替换原则、依赖倒置原则和 接口隔离原则等五大基本原则。
扩展
面向对象的三大基本特征?
三大基本特征:封装、继承、多态。
- 封装
封装就是把现实世界中的客观事物抽象成一个Java类,然后在类中存放属性和方法。如封装一个汽车类,其中包含了发动机、轮胎 、底盘等属性,并且有启动、前进等方法。
- 继承
像现实世界中儿子可以继承父亲的财产、样貌、行为等一样,编程世界中也有继承,继承的主要目的就是为了复用。子类可以继承父类,这样就可以把父类的属性和方法继承过来。
如Dog类可以继承Animal类,继承过来嘴巴、颜色等属性, 吃东西、奔跑等行为。
- 多态
多态是指在父类中定义的方法被子类继承之后,可以通过重写,使得父类和子类具有不同的实现,这使得同一个方法在父类及其各个子类中具有不同含义。
继承和实现
在Java中,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。普通类可以实现接口,普通类也可以继承抽象类和普通类。
Java支持多实现,但是只支持单继承。即一个类可以实现多个接口,但是不能继承多个类。
面向对象的五大基本原则?
●单一职责原则(Single-Responsibility Principle)
○内容:一个类最好只做一件事
○提高可维护性:当一个类只负责一个功能时,其实现通常更简单、更直接,这使得理解和维护变得更容易。
○减少代码修改的影响:更改影响较小的部分,因此减少了对系统其他部分的潜在破坏。
●开放封闭原则(Open-Closed principle)
○内容:对扩展开放、对修改封闭
○促进可扩展性:可以在不修改现有代码的情况下扩展功能,这意味着新的功能可以添加,而不会影响旧的功能。
○降低风险:由于不需要修改现有代码,因此引入新错误的风险较低。
●Liskov替换原则(Liskov-Substituion Principle)
○内容:子类必须能够替换其基类
○提高代码的可互换性:能够用派生类的实例替换基类的实例,使得代码更加模块化,提高了其灵活性。
○增加代码的可重用性:遵循LSP的类和组件更容易被重用于不同的上下文。
●依赖倒置原则(Dependency-Inversion Principle)
○内容:程序要依赖于抽象接口,而不是具体的实现
○提高代码的可测试性:通过依赖于抽象而不是具体实现,可以轻松地对代码进行单元测试。
○减少系统耦合:系统的高层模块不依赖于低层模块的具体实现,从而使得系统更加灵活和可维护。
●接口隔离原则(Interface-Segregation Principle)。
○内容:使用多个小的专门的接口,而不要使用一个大的总接口
○减少系统耦合:通过使用专门的接口而不是一个大而全的接口,系统中的不同部分之间的依赖性减少了。
○提升灵活性和稳定性:更改一个小接口比更改一个大接口风险更低,更容易管理。