文档章节

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

zhangyujsj
 zhangyujsj
发布于 2015/05/10 18:43
字数 2075
阅读 59
收藏 1

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(全部都能访问)的基础上少了一个其他包中的非子类。

17 异常处理

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

18 多线程编程

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

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

19 函数定义格式

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

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()方法再获取一次。






© 著作权归作者所有

zhangyujsj
粉丝 24
博文 358
码字总数 224241
作品 0
广州
私信 提问
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米_思聪
2014/09/16
4.7K
0
Scala 不是改良的 Java,你会考虑使用 Scale 吗?

Scala 本身就基于 Java 平台,却要来跟 Java 比较,这有点不靠谱。 Scala编程语言拥有所有Java的语言特征,而且还支持所有的新兴的有趣的概念,例如闭包,higher-kinded类型,内联XML。如果你...

绿悠悠
2010/07/28
3.7K
10
C++不垃圾,只是Java很傲慢

《Thinking in C++》及《Thinking in Java》的作者Bruce Eckel向来是个“拥C++反Java”派,他曾经不止一次的提到,C++语言特性的添加有多么的深思熟虑,而Java又是如何的把一些奇怪的东西不停...

AlphaJay
2010/04/15
766
0
C++不垃圾,只是Java很傲慢

本文转自:http://developer.51cto.com/art/200906/131773.htm 《Thinking in C++》及《Thinking in Java》的作者Bruce Eckel向来是个“拥C++反Java”派,他曾经不止一次的提到,C++语言特性...

张明
2010/03/18
1K
0
Java程序员如何高效而优雅地入门C++

Java程序员如何高效而优雅地入门Cpp,由于工作需要,需要用C++写一些模块。关于C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 我也算是老手,但也还需要心生敬畏,本文会从...

小欣妹妹
2018/04/23
108
1

没有更多内容

加载失败,请刷新页面

加载更多

JDBC+C3P0+DBCP 基本使用

1.概述 这篇文章主要说了JDBC的基本使用,包括Statement,PreparedStatement,JDBC的连接,Mysql创建用户创建数据表,C3P0的连接与配置,DBCP的连接与配置. 2.mysql的处理 这里的JDBC使用Mysql作为...

Blueeeeeee
46分钟前
5
0
MVC Linux下开发及部署

linux使用的是 Ubuntu 64 位 18.04.2 LTS 首先复制C:\Program Files (x86)\Embarcadero\Studio\20.0\PAServer 下 LinuxPAServer20.0.tar.gz 到 linux 目录下 运行链接编译程序 delphi环境配置......

苏兴迎
今天
9
0
3.控件及其属性

1.文本 2.按钮

横着走的螃蟹
今天
7
0
安装Genymotion模拟器慢的解决方案

第一步点击下载, C:\Users\Administrator\AppData\Local\Genymobile\genymotion.log 中搜索 ova 会发现这个文件 使用迅雷下载即可. 在 虚拟机中导入这个.ova 文件 即可安装...

chenhongjiang
今天
5
0
4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)

你好,我是彤哥,本篇是netty系列的第四篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使用纯纯的N...

彤哥读源码
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部