Java与C++的差异(基础)

<center>Java与C++的差异(基础)</center>

JAVA基础

C++的成员方法(函数)JAVA中叫做方法
C++的数据成员(属性)JAVA中叫做字段
以下同此声明

C++支持全局函数,可随处定义
JAVA不支持全局函数,必须用类套起来

C++导入声明头文件,进行函数引用 #include XXX.h
JAVA导入包.进行类对象的引用,import packetName.ClassName.*

JAVA没有指针,都是引用!
JAVA没有指针,都是引用!
JAVA没有指针,都是引用!


基本语法

语法 Java C++
大小写敏感 区分大小写 区分大小写
类的命名 首字母大写,驼峰命名 IC开头, 驼峰命名
程序文件名 以当前类名命名文件,一个文件只允许一个公有类 命名不要求,多个类可存于一个文件
程序入口 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 用来创造不允许实例化的类和方法。
synchronizedvolatile 用来当做线的。

运算符

JAVA算数运算符, 关系运算符, 位运算符, 逻辑运算符,赋值运算符, 三目条件运算符C++

JAVA新增一个位运算符>>>
功能: 右移补零运算

应用: 负数 >>> 清掉最高位,变为整数

JAVA新增一个运算符:instanceof(类型识别,相当于MFCIsKindOf())
作用为: 判断当前对象是否属于某个类的派生类

运算符优先级,同C++

转义序列,同C++(\r \b \n \b \t 等)


控制语句

JAVAif...else...C++

JAVA的循环同C++

  • [x] while循环
  • [x] do...while循环
  • [x] for循环

for的新特性:for循环增加一个迭代器特性(针对数组):

for(数据类型 : 数据类型数组[]){
    数据类型...
}
//方便快速迭代数组,作用为:从下标`0`依次迭代到下标`MaxCount-1`的位置

JAVASwitch 语句 同 C++

JAVAcontinueBreak 语句 同 C++


JAVA 数字

所有的包装类 (Integer, Long, Byte, Double, Float, Short) 是抽象类 Number 的子类。

Number(数字对象)

Num继承图

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 的 日期和时间

Javajava.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的两个派生类:ofstreamifstream
输入: 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 语句块不能独立存在(即没有任何 catchfinally 块)。
  • try catchfinally 块之间是不能出现任何代码的。

自定义的异常

你可以在 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 |用在循环结构中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容