1. 一切皆为对象
Java应用程序即是对象的集合,它旨在完全用对象去建模,按照事物存在的形态去思考问题的本身,程序逻辑都是对象之间相互发送消息完成的。甚至Java的main函数都是作为类的静态方法而存在,因此相对于C++,Java是纯的面向对象的语言。
Java对象除原始类型(primitive)会用栈空间外,其他类型都是通过new分配在堆上,然后通过对象的引用来操作对象,赋值对象传递对象都是传递引用。
2. 内存管理
让C++程序员最困扰的事之一便是内存管理,内存何时创建何时释放。Java的初衷便是让程序员从计算机语言,系统中解放出来,程序员更多考虑的是系统的构架,业务逻辑。Java语言本身会去帮你完成很多计算机方面的工作,当然包括管理内存,你永远不用去delete,它提供了垃圾回收的功能,然而这也会造成性能上的代价:一是在堆上分配空间的时间代价,二是垃圾回收器的代价,并且你永远不知道这片空间会何时释放,我就见到很多Java程序因为虚拟机内存耗光而强行退出,也听到会有Java内存泄露的问题。
3. 更为强迫的语言
很多在C++中可以通过编译,但不推荐的用法,在Java中是明令禁止的,即不能通过编译。
3.1 禁止的隐式转换
在C++中,非零即为真的原则在Java中废止,boolean只能是true和false,不能将其他类型隐式或强行转换为boolean,你只能通过关系操作符将他们转换为boolean类型。这避免了if (a = true)这样的错误。
在C++中的窄类型转换(narrowing conversion),一般编译器会给警告,而在Java中,如果没有明确的强制类型转换,则不能通过编译。
3.2 局部变量必须初始化
同样C++中没有初始化的局部变量,编译器会给警告信息,而在Java中,则是编译错误。Java的变量可以初始化为null,即空引用,很特别。
C++中的全局变量和静态变量会被初始化为合适的值,Java中没有全局变量,类的成员变量都会被初始化为合适的值。
3.3 更为明确的作用域
在C++中,一个变量的作用域内的子作用域,如果有同名的变量则,子作用域的变量会隐藏掉上层的变量。
在Java中,这是一个编译错误。
3.4 Java的class的默认访问修饰是public
这一点跟它的精神有些不符,不知为何
3.5 对象的引用
Java的对象都是由引用操作的,赋值,传递,都是引用,如果用等于(==)操作符去比较两个对象,则比较的是引用,虽然内容相同,但比较的结果却不相同,Java为每个类都提供一个equals方法用于比较内容。
对于String类型有一点特别。
以下内容转载自:http://www.cnblogs.com/tonyqus/archive/2004/12/07/73710.aspx
-------------------------------------------------------------------------------------------------------------------------
熟悉C++的人对于两个字符串比较的代码一定很了解:
(string1==string2)
但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false
Java中必须使用string1.equals(string2)来进行判断
补充
如果:
string s1=new String("Hello");
string s2=new String("Hello");
则(s1==s2)=false
如果:
string s1="Hello";
string s2="Hello";
则(s1==s2)=true;
因为他们指向的同一个对象。
如果把其他变量的值赋给s1和s2,即使内容相同,由于不是指向同一个对象,也会返回false。所以建议使用equals(),因为equals比较的才是真正的内容。
4. 对象的初始化和清理
4.1 特别的构造函数调用
Java中的构造函数能够相互调用完成初始化,但一个构造函数只能调用一个其他构造函数,并且必须是最先调用。调用用this,例子如下:
Java代码
public class JavaBasics {
private int i;
private String s;
public JavaBasics(int i_) {
i = i_;
}
public JavaBasics() {
this(0);
}
public JavaBasics(String s_) {
s = s_;
}
public JavaBasics(int i_, String s_) {
//s = s_;构造函数必须是最先调用
this(i_);
//this(s_); 在同一个构造函数中不能调用两个构造函数
s = s_;
}
}
4.2 垃圾回收和终结函数(finalize)
Java中没有析构函数,为了对特殊的资源进行回收,它提供了finalize方法,但它不同于C++的析构函数,在垃圾回收的时候它才会被调用,因此你不能确定它会在什么时候执行,那么在什么情况下会用到finalize呢?一种情况是例如你有文件打开,需要在对象被清理前关闭,即非内存的资源的释放(内存释放是垃圾回收处理的),第二种情况是你用本地方法(Native method)获得了内存资源,即通过JNI调用C或C++的方法。
由于垃圾回收和finalize方法都不确定在什么时候被调用,因此你的一些清理操作要显示的调用,例如,一个应用程序在屏幕上绘图,用户最小化应用程序时,你需要显示的调用方法清理屏幕。
4.3 成员的初始化
对象的成员会被合理的初始化,即使你没有显示的初始化它们,原始类型会被初始化为物理意义上的 0 ,而对象类型则被初始化为 null ,和 C++ 一样, Java 中对象成员的初始化顺序是成员在类中出现的顺序,接下来调用构造函数。
静态成员会在必要时(即用到时)初始化,先会初始化类的静态成员,并且只初始化一次,以后创建类的实例,都不再初始化静态成员。
你有 3 种初始化的方法
1. 在定义的时候初始化( Java 中不分声明和定义,都是声明和定义在一起)
2. 在构造函数中初始化
3. 可以有特别的代码块来初始化成员,例如:
Java代码
class Demo {
//init when definition
public static String str0 = new String("abc");
public int ival = 3;
public static double pi;
public long lval;
public static String str1;
//init explicit
static {
pi = 3.1415D;
}
{
lval = 100L;
}
public Demo() {
//init in constructor
str1 = new String("in constructor");
}
}
4.4 数组的初始化
1. 原始类型数组的初始化和 C++ 基本一样,但你必须初始化它。如:
int[] a1 = { 1, 2, 3, 4, 5 };
并且你不能在运行时改变它的大小,访问超过初始化时设置的大小的下标是会接受到超出范围的异常。
2. 若需要创建动态数组,则需要 new 一个动态数组,如:
int[] a = new int[rand.nextInt(20)];
3. 数组的传递,也是传引用。
4. 非原始类型的数组,初始化时其元素必须 new 出一个非空的引用。
分享到:
相关推荐
### Java面向对象编程:从C++到Java的理解与过渡 #### 一、Java与C/C++的区别 在从C++转向Java的过程中,理解和掌握面向对象编程(OOP)是非常重要的。本篇文章将着重介绍Java与C/C++之间的主要差异,并探讨Java如何...
【从C++到Java的成功之路】的转换是一个程序员在学习过程中常见的挑战,因为这两种语言虽然都属于面向对象的编程语言,但在很多方面有着显著的区别。本文将深入探讨这些差异,并提供从C++过渡到Java的指导。 首先,...
"C++转换JAVA工具" 提供了一种解决方案,使得开发者可以从C++代码无缝过渡到Java代码,或者将Java代码转换为C++,以适应不同的开发需求和环境。这种工具的主要目标是提高开发效率,降低维护成本,以及实现平台间的...
2. **类型映射**:理解C++和Java类型之间的差异,并进行适当的转换,如C++的int到Java的int,或者C++的指针到Java的对象引用。 3. **结构转换**:处理C++的类和对象到Java的类和对象的转换,包括构造函数、继承、...
《C++到Java转换器:理解跨语言编程的挑战与实践》 在计算机科学领域,跨语言编程是一项关键技能,特别是在需要利用不同编程语言的优势时。C++和Java是两种广泛应用且具有各自特点的编程语言。C++以其高效、灵活和...
例如,C++的类会被转换为Java的类,指针会映射到Java的对象引用,C++的动态内存管理会被转换为Java的垃圾回收机制。 在描述中提到的,这个工具对JNI开发很有帮助,意味着它可能能够帮助开发者更容易地将C++的本地...
Android Studio项目,此Demo实现Java调用C++函数,然后C++函数回调Java方法、纯C++直接调用Java方法,此为github地址链接
"从 Java 到 C++, 适合 Java 程序员快速学习 C++" 这篇文章旨在帮助 Java 程序员快速学习 C++,通过比较 Java 和 C++ 的区别,帮助读者快速理解 C++。以下是从 Java 到 C++ 的知识点总结: 数据类型和变量 * C++ ...
从C++过渡到Java,开发者需要注意以下几个关键点,以便更好地适应纯面向对象的Java编程。 1. **内存管理与垃圾回收** 在C++中,程序员需要手动进行内存分配和释放,而Java则采用了自动垃圾回收机制。Java的垃圾...
这部分涉及到Java与C++内存模型的差异,C++中的指针概念、内存堆管理、new与delete操作符、野指针、双重删除、返回指针的函数以及箭头(->)操作符的使用。 知识点六:标准模板库(STL)。书中强调了STL的重点内容...
超强的C++ to Java转换工具!!希望对大家有帮助。无污染。
总结来说,Qt平台上的C++与Java代码交互涉及到JNI接口的使用,包括C++函数的声明、Java方法的调用、动态库的加载以及在Qt项目中的整合。熟练掌握这些技巧,将有助于开发跨语言的复杂应用程序。在实践中,应不断学习...
本书《面向对象编程:C++与Java比较教程》详细比较和对比了当今最流行的两种编程语言C++和Java,旨在教授互联网时代至关重要的技能和面向对象编程技术。作者Avinash C. Kak凭借其成功教授的课程,撰写了一本全面的...
2. **JAVA语法基础**:学习JAVA的基础语法,包括数据类型、变量、常量、运算符、流程控制语句等,这些都是从C++到JAVA过渡的基础。 3. **类与对象**:JAVA的面向对象特性是其重要组成部分,讲解如何定义类、创建...
在从C++转向Java或反之的过程中,开发者需要适应这些语言间的差异。例如,C++程序员可能需要学习如何避免指针的直接操作,理解Java的垃圾回收机制;Java程序员则需要学会使用C++的模板和内存管理。 总之,C++和Java...
使用`javah`工具,从Java源代码生成JNI头文件。这将创建一个C++头文件,其中包含Java方法的声明和JNI所需的函数原型。假设我们有一个名为`com_example_JavaApp`的Java包,那么命令可能是这样的: ``` javah -jni...
因此,从C++到Java的转换不仅涉及语法层面的调整,还需要考虑诸如垃圾回收、异常处理和多线程等核心机制的变化。 1. **语法转换**:C++支持指针操作,而Java中使用引用,这要求在转换过程中处理指针与引用的区别。...
在IT行业中,编程语言的选择和转换是常见的议题。本文将深入探讨从C++编程转向Java编程的相关知识点,帮助...从C++转到Java需要学习新的概念和技术,但掌握这两门语言将使程序员具备更广泛的技能和解决问题的能力。