Java与C/C++语言的差异——语言细节问题

1 char类型

java中char是16位的,因为使用的是unicode字符集。

2 字符串常量

"hello"在java中是一个存在于堆区的匿名内部类对象,因为是对象所以可以直接用它来调用成员方法,如"hello".equals("hello");这是因为java中采用了“共享设计”的方法,提供一个字符串池保存全部内容。新实例化的对象如果已经在池中定义了,则不再重新定义,而从池中直接取出继续使用。String就是采用了这样的设计,所以内容重复的时候,会将对象指向已经存在的实例空间。

3 变量类型

java中的变量类型总共可以分为两大类,一个是基本数据类型,一个是引用数据类型。其中数组和类对象都是属于引用类型的,这个有什么不同呢?仔细看代码:

JavaClass obj = new JavaClass();

int a[] = new int[100];

这类似于C/C++里面的指针,但是,不是指针。

4 sizeof运算符

 java中没有sizeof运算符

5 内存管理

java中new了堆内存是不用管的,有GC机制去回收。但是C/C++里面,new了之后不释放是找死。

6 ==运算符对于String类型的重载

在java中当==运算符计算是两个String类型对象的时候,计算的是两个对象的地址是否相等,这点特别要注意,如果要判断内容是否相等要用成员方法equals()。

7 String类对象内容不可改变

String对象内容的改变实际上是通过内存地址的“断开-连接”变化完成的,而本身字符串中的内容没有任何变化。所以,如果对String类对象的内容进行更改效率是极低的,可以使用StringBuffer类来完成,字符串对象的内容的更改。

8 引用作为参数

java中要注意,当引用作为参数传递的时候,引用本身是值传递,但是引用指向的对象是相同的。类的成员函数中可以用本类的引用作为参数类型。

9 this表示当前对象

this调用本类中的属性;this强调本类中的方法;this调用构造方法(注意这时候this()必须是在构造函数的第一行被调用);this表示当前对象。注意this访问本类中的属性的时候,如果本类中没有此成员,那么继续从父类中去找。super并没有表示父类对象的概念。但是,super可以直接访问父类的成员。super调用构造父类构造方法是默认在子类的构造函数中的,而且是先于子类的构造函数调用。如果自己想要指定父类的构造函数,那么必须放在子类构造函数的第一行代码。

10 代码块

Java中共有4种代码块:普通代码块,构造代码块,静态(static)代码块,同步代码块。

其中构造代码块是直接写在类中的代码块,每次实例化对象时均执行,且先于构造函数执行。static代码块在一个类被加载时执行,且仅仅执行一次。

11 内部类

java中内部类的唯一好处是可以直接访问包含内部类定义的外部类中的私有成员。

12 重载与覆盖

在java中,重载是在一个类中,同名方法不同形参列表。覆盖是在继承子类中,子类定义了与真正继承到的东西(除父类的private成员之外)同名的成员,这时就是覆盖,要访问父类中的成员要用super关键字。

13 final

java中特有final关键字。用于类定义,不能被继承;用于函数,不能被子类覆盖;用于变量,则成为常量不能再修改。特别注意,全局常量:public static final String INFO = "gdut_abc";

14 抽象类

java中的抽象类用abstract关键字修饰类的定义和其中的成员函数定义。其实,java中的抽象类(只是多了abstract方法)除了不能实例化之外,与普通的类没有不同。

15 多继承

java没有多继承,但是java通过接口来补偿。java的接口interface从理解的角度讲是一个只能包含:全局常量和抽象函数的类。接口不可以继承抽象类,但是可以继承extends多个(注意是多个)接口。

16 访问权限

java中的访问权限如下图所示:其中特别注意的是增加了同一包中的类,而且除了是private不能访问之外,其他的都能访问。留意default。记住protected是在public(全部都能访问)的基础上少了一个其他包中的非子类。

Java与C/C++语言的差异——语言细节问题_第1张图片

17 异常处理

java中的异常处理有try{}catch{}finally{};以及Exception类及其子类;还有e.printStackTrace();还有throw与throws。其中throw是丢出具体的异常类对象;throws是放在函数名的后面,表示这个函数不处理异常,所有在本函数中产生的异常丢给调用处。

18 多线程编程

java直接支持多线程编程,java多线程两种方式实现,一个是new Thread(实现Runnable接口的类);另一个是创建一个类直接extends Thread。但是操作线程的主要方法在Thread类中,如下图所示:

Java与C/C++语言的差异——语言细节问题_第2张图片

注意:其中的区别是有些类的方法在主线程中调用,有些方法在新建立的线程中调用。区别就在于如果这个动作是子线程自己发起来的,那么肯定是在子线程中调用方法,如获取当前线程实例Thread.currentThread();线程休眠(特别注意这个是一个类方法)Thread.sleep(ms);线程礼让执行Thread.currentThread().yield();。而其他的操作则是由主线程对新线程进行操作的,那么肯定在主线程中执行,如在主线程中设置子线程的优先级t.setPriority(Thread.MIN_PRIOTIRY);对进程的等待t.join();设置线程为后台线程t.setDaemon(true);中断线程t.interrupt();等等。

19 函数定义格式

java中函数的修饰部分比较多,完整的格式如下:

Java与C/C++语言的差异——语言细节问题_第3张图片

20 泛型

反正泛型的类的类名一定是指定了泛型类型参数的类名。如:Info<String> info = new Info<String>();注意那个<String>已经成为了类名的一部分。

主要强调下java中受限泛型的运用有两种方式一种是在声明泛型类的对象时用,一种是在定义泛型类本身时用,当然也可以一起用。

1 如在函数的形参列表里要声明泛型类对象:void fun(Info< ? extends 具体上限类名> {.......}

2 class Info<T extends  上限类名> {}

如果用super替换extends,那么表示下限类名。

注意泛型函数的定义不像泛型类的定义那样在泛型类的后面去定义<T>泛型参数。而是在public等之后就要指出<T>。

21 类集框架/标准模板库

java中的类集框架是类似于C++里的标准模板库类似的东西,但是没C++的复杂。

Collection接口有四大子接口:List,Set,Queue,SortedSet接口。其中的List接口有ArrayList和Vector以及LinkedList子类(链表的操作类)。Set接口(元素不可重复的子类)有HashSet(元素不可重复不排序散列存放)和TreeSet子类(元素不可重复排序存放)。TreeSet靠实现了Comparable接口的compareTo()来完成排序;Set接口靠Object的hashCode()判断是否对象可能重复,如果有两个对象的hashCode相同,那么进一步调用equals()方法继续判断。

Iterator是标准的用于访问类集的接口。但是注意,它在每一次类集对象.iterator()之后其实是静态的,如果这时候类集对象自己remove()了其中的元素,那么这个Iterator就会无效。除非用iterator()方法再获取一次。






你可能感兴趣的:(Java与C/C++语言的差异——语言细节问题)