<center>Java与C++的差异(基础)</center>
JAVA基础
C++
的成员方法(函数) 在JAVA
中叫做方法
C++
的数据成员(属性) 在JAVA
中叫做字段
以下同此声明
C++
支持全局函数,可随处定义
JAVA
不支持全局函数,必须用类套起来
C++
导入声明头文件,进行函数引用#include XXX.h
JAVA
导入包.进行类对象的引用,import packetName.ClassName.*
JAVA
没有指针,都是引用!
JAVA
没有指针,都是引用!
JAVA
没有指针,都是引用!
基本语法
语法 | Java | C++ |
---|---|---|
大小写敏感 | 区分大小写 | 区分大小写 |
类的命名 | 首字母大写,驼峰命名 | 以I 或C 开头, 驼峰命名 |
程序文件名 | 以当前类名命名文件,一个文件只允许一个公有类 | 命名不要求,多个类可存于一个文件 |
程序入口 | public static void main(String args[]); |
int main(int argc, char* argv[]); |
程序入口 | Java程序都是从Main() 方法开始 |
C++程序从Main 函数开始 |
变量
变量名 | 变量说明 | 作用域 |
---|---|---|
局部变量 | 在方法中定义一个局部变量 | 随函数的退出而销毁 |
实例变量 | 在实例对象时,初始化的类内字段 | 随对象的生命周期而销毁 |
类变量 | 类的静态成员字段 | 全局属性,随程序生命周期而销毁 |
构造&&析构
JAVA | 功能 | C++ | 功能 |
---|---|---|---|
构造 | 初始化静态字段和实例字段,调用基类和字段为类实例的构造 | 构造 | 初始化数据成员,调用基类和成员变量为类实例的构造 |
析构 | 没有析构 | 析构 | 释放资源 |
数据类型
原始数据类型(基本数据类型)
JAVA
中都是有符号数,没有无符号数
JAVA类型名 | 类型占用大小 | C++类型名 | 类型占用大小 |
---|---|---|---|
byte | 8字节 | char | 8字节 |
short | 16字节 | short | 16字节 |
int | 32字节 | int | 32字节 |
long | 64字节 | long long | 64字节 |
float | 32位浮点 | float | 32位浮点 |
double | 64位浮点 | double | 64位浮点 |
boolean | 1比特 | bool | 1字节 |
char | 16字节Unicode字符 | short int(wchar_t) | 16字节宽字符 |
引用
JVAV
引用即C++
中的智能指针的引用(引用技术为0则垃圾回收)
JAVA
用法: class A = new A();
C++
用法: class* A = new A();
可访问描述符
Java 提供一系列可访问描述符来设定类,变量,方法和构造器的访问级别。四种访问级别如下:
描述符 | 功能 | 继承方式 |
---|---|---|
default |
默认,仅对包可见,不给描述符默认为此。 | 可继承 |
private |
私有,仅对本类方法可见 | 不可继承 |
public |
公有,全部方法可见 | 可继承 |
protected |
保护,仅对本类方法课件 | 可继承 |
不可访问描述符
Java 提供一些不可访问描述符来满足其他功能。
描述符 | 功能 |
---|---|
Static |
用来创造类方法和变量的。((全局的)静态方法或字段) |
Final |
用来最终确定和实施类、方法和变量的。 |
Abstract |
用来创造不允许实例化的类和方法。 |
synchronized 和 volatile
|
用来当做线的。 |
运算符
JAVA
算数运算符, 关系运算符, 位运算符, 逻辑运算符,赋值运算符, 三目条件运算符同C++
JAVA
新增一个位运算符>>>
功能: 右移补零运算应用: 负数
>>>
清掉最高位,变为整数
JAVA
新增一个运算符:instanceof
(类型识别,相当于MFC
的IsKindOf()
)
作用为: 判断当前对象是否属于某个类的派生类
运算符优先级,同
C++
转义序列,同
C++
(\r \b \n \b \t
等)
控制语句
JAVA
的if...else...
同C++
JAVA
的循环同C++
- [x]
while
循环 - [x]
do...while
循环 - [x]
for
循环
for
的新特性:for
循环增加一个迭代器特性(针对数组):
for(数据类型 : 数据类型数组[]){
数据类型...
}
//方便快速迭代数组,作用为:从下标`0`依次迭代到下标`MaxCount-1`的位置
JAVA
的Switch
语句 同C++
JAVA
的continue
与Break
语句 同C++
JAVA 数字
所有的包装类 (
Integer
,Long
,Byte
,Double
,Float
,Short
) 是抽象类 Number 的子类。
Number
(数字对象)
Number
的方法,请参阅JAVA
的文档说明
装箱与拆箱:即 临时变量的存储赋值和内容提取
Character
(字符对象)
Character
的方法,请参阅JAVA
的文档说明
String类(字符串相关操作)
String
类的方法,请参阅JAVA
的文档说明
数组
JAVA
数组的属性 同C++
(下标从0开始)
数组的实例则不同:
1.数据类型[] Name = new 数据类型[数组元素个数];
2.数据类型[] Name = {初始化数据1, 初始化数据2, 初始化数据3 ...};
处理数组:
当处理数组元素时,经常使用的是 loop 循环或 foreach 循环,因为一个数组中所有的元素是相同类型的并且数组的大小是已知的。
foreach
循环,为for
语句的新特性(参见控制语句中for
的新特性)
数组作为参数
public static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } }
方法的返回值为数组
public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result; }
Arrays类
java.util.Arrays
中的类包含各种静态方法用于排序和搜索数组、数组的比较和填充数组元素。这些方法为所有基本类型所重载。
Arrays
类的方法,请参阅JAVA
的文档说明
JAVA 的 日期和时间
Java
在java.util
包中提供了Date
类,这个类封装了当前的日期和时间。
Date
类支持两种构造函数。第一个构造函数初始化对象的当前日期和时间。
Date( )
下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数
Date(long millisec)
Date
类的方法,请参阅JAVA
的文档说明
获取日期和时间字符串
在 Java 中容易得到当前的日期和时间。可以使用一个简单的 Date 对象的 toString() 方法,如下所示打印当前日期和时间:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toString() System.out.println(date.toString()); } }
日期比较
有以下三种方式来比较两个日期:
- 可以使用 getTime() 来获得自1970年1月1日午夜十二时起已经过的毫秒数,然后比较两个对象的值.
- 可以使用 before( ), after( ), 和 equals( ) 方法,由于12日在18日前,例如, new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回值为 true.
- 可以使用 compareTo() 方法,这是由 Comparable 接口定义,由 Date 实现。
使用 SimpleDateFormat 格式化日期
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } }
方法
方法的定义与调用,同C++的函数定义与调用
重载,覆盖,隐藏均同C++
支持不定参,传入的是对象,可直接Obj.length
获取不定参,参数个数举例:
modifier returnType nameOfMethod (Parameter List) { // method body }
- modifier:他定义了方法的访问类型,它是可选的。
- returnType:方法是可能返回一个值的。
- nameOfMethod:这是方法的名称。方法签名包括方法名称和参数列表。
- Parameter List:参数列表,它是参数的次序,类型,以及参数个数的集合。这些都是可选的,当然方法也可以没有参数。
- 方法体:方法体定义了这个方法是用来做什么的。
finalize方法(终结器, 即C++的析构, MFC的
DestroyWnd
)垃圾回收(GC)机制,回收此对象之前,会调用
finalize()
回调,通知对象释放资源(关闭文件等操作)
一般定义:protected void finalize( ) { // finalization code here }
文件操作
相当于C++的
fstream
的两个派生类:ofstream
和ifstream
输入:FileInputStream
输出:FileOutputStream
注意: 此类对象,会抛异常,应使用Try...Catch...
包裹
try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } }
具体方法参见文档
遍历文件夹
import java.io.File; public class ReadDir { public static void main(String[] args) { File file = null; String[] paths; try{ // create new file object file = new File("/tmp"); // array of files and directory paths = file.list(); // for each name in the path array for(String path:paths) { // prints filename and directory name System.out.println(path); } } catch(Exception e) { // if any error occurs e.printStackTrace(); } } }
异常处理
try...catch...
功能与用法 同C++;差异:catch
的类型至少得是Exception
类型
throw
/throws
同C++的功能与用法;差异:throws
可抛出多个异常
try...catch...finally...
功能与用法 同C++;
所有异常类均继承于:java.lang.Exception
Exception
类含有两个子类:IOException
类和 RuntimeException
类。
Throwable
的一些常用方法:
SN | 方法名 | 方法描述 |
---|---|---|
1 | public String getMessage() |
返回关于发生异常的细节信息,这些信息在Throwable 的构造函数中被初始化 |
2 | public Throwable getCause() |
返回发生异常的原因,由 Throwable 对象来表示 |
3 | public String toString() |
返回与getMessage() 的结果相联系的类的名称 |
4 | public void printStackTrace() |
打印 toString() 跟踪错误输出流的栈地址的结果。 |
5 | public StackTraceElement [] getStackTrace() |
返回一个数组,其中包含每个元素在栈的地址。元素的索引0代表调用栈的顶部,最后一个元素表示方法调用栈的底部。 |
6 | public Throwable fillInStackTrace() |
用当前栈地址来填充 Throwable 对象的栈地址,添加到任何先前的栈地址信息。 |
以下几点需要注意:
-
catch
在没有try
关键字的情况下是不能够出现的。 -
try/catch
语句块中并不是强制出现finally
块。 -
try
语句块不能独立存在(即没有任何catch
和finally
块)。 - 在
try catch
和finally
块之间是不能出现任何代码的。
自定义的异常
你可以在 Java 中创建自己的异常。编写自己的异常类,要记住以下几点:
- 所有的异常必须继承自
Throwable
。 - 如果你想写一个自动遵守正确处理或声明规则的检测异常,需要继承
Exception
类。 - 如果你想编写一个运行时异常,需要继承
RuntimeException
类。
事例:class MyException extends Exception{ }
常见的异常
在 Java 中,可以定义两种异常和错误
JVM 异常:这些异常/错误是由 JVM 在逻辑层上或专门抛出的。例子:
NullPointerException
,ArrayIndexOutOfBoundsException
,ClassCastException
。
程序性异常:这些异常是由应用程序或是编写 API 的程序员明确抛出的
如:IllegalArgumentException, IllegalStateException。
关键字表
JAVA关键字|功能
:-|:-|:-|:-
abstract |表明类或者成员方法具有抽象属性
assert |用来进行程序调试
boolean |基本数据类型之一,布尔类型
break |提前跳出一个块
byte |基本数据类型之一,字节类型
case |用在switch语句之中,表示其中的一个分支
catch |用在异常处理中,用来捕捉异常
char |基本数据类型之一,字符类型
class |类
const |保留关键字,没有具体含义
continue |回到一个块的开始处
default |默认,例如,用在switch语句中,表明一个默认的分支
do |用在do-while循环结构中
double |基本数据类型之一,双精度浮点数类型
else |用在条件语句中,表明当条件不成立时的分支
enum |枚举
extends |表明一个类型是另一个类型的子类型,这里常见的类型有类和接口
final |用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
finally |用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float |基本数据类型之一,单精度浮点数类型
for |一种循环结构的引导词
goto |保留关键字,没有具体含义
if |条件语句的引导词
implements |表明一个类实现了给定的接口
import |表明要访问指定的类或包
instanceof |用来测试一个对象是否是指定类型的实例对象
int |基本数据类型之一,整数类型
interface |接口
long |基本数据类型之一,长整数类型
native |用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new |用来创建新实例对象
package |包
private |一种访问控制方式:私用模式
protected |一种访问控制方式:保护模式
public |一种访问控制方式:共用模式
return |从成员方法中返回数据
short |基本数据类型之一,短整数类型
static |表明具有静态属性
strictfp |用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super |表明当前对象的父类型的引用或者父类型的构造方法
switch |分支语句结构的引导词
synchronized |表明一段代码需要同步执行
this |指向当前实例对象的引用
throw |抛出一个异常
throws |声明在当前定义的成员方法中所有需要抛出的异常
transient |声明不用序列化的成员域
try |尝试一个可能抛出异常的程序块
void |声明当前成员方法没有返回值
volatile |表明两个或者多个变量必须同步地发生变化
while |用在循环结构中