Java and C++

Java内置多线程支持。你可以通过继承Thread类来创建一个新的线程(重写run()方法)。互斥发生在使用synchronized关键字作为类型修饰符修饰方法的对象级别。在任一时刻,只能有一个线程访问特定对象的synchronized方法。换句话说,当进入一个synchronized方法时,首先会去对对象“上锁”,这对使用该对象的其他synchronized方法也有作用,并且当退出方法时“解锁”对象。没有显式的锁;上锁和解锁都是自动的。你依旧需要自己通过创建你自己的“监控者”类实现更加复杂的线程同步。递归的同步方法工作正常。时间片分配在相同优先级的线程之间得不到保证。

不同于C++使用控制块的声明,访问修饰符(public,private,和protected)被置于类中每个成员的定义处。没有显式的访问修饰符,一个元素默认为”friendly”,可以被同一个包下的其他元素访问(他们相当于都是C++中的友元),但是不能被包外的元素访问。类,和类中的每个方法,都有访问限定符去决定其是否对文件外可见。有时private关键字在Java中很少使用,因为“友好”访问权限比把同一个包下的其他类的访问排除在外通常更有用。(然而,对于多线程,private的正确使用是非常必要的。)Java中protected关键字意为“对于继承者和同一个包下的类可访问。”这与C++中的protected不同,C++中含义为“只允许继承者访问”(private
protected用来实现一样的效果,但是这对关键字的使用被取消了)。

嵌套类。在C++中,嵌套一个类目的在于名称隐藏和代码组织(但是C++的名称空间消除了名称隐藏的需求)。Java包机制提供了类似于名称空间的效果,所以名称隐藏对于Java而言不算是个问题。Java 1.1的内部类看起来如同内嵌类一样。然而,一个内部类的对象私藏着参与了内部类对象创建的外部类对象的引用。这意味着内部类对象可以无限制的访问外部类对象的成员,好像那些成员直接属于内部类一般。这提供了对于回调问题更加简洁的解决方案,在C++中使用指针来解决该问题。因为上一点所介绍的内部类,Java中没有指向成员的指针。没有内联方法。Java编译器可以自己决定内联一个方法,但是你对此没有太多控制力。你可以使用final关键字建议内联一个方法。然而,inline函数也只是对C++编译器的建议。Java的继承与C++有一样的作用,但是具体的语法有所不同。Java使用extends关键字来从基类进行继承,使用super关键字去调用基类中与子类同名的方法(然而,Java中super关键字只允许去访问直接父类中的方法,只能向上追溯一级。C++中则允许访问更深层的基类方法。)基类的构造器同样使用super关键字调用。正如之前提到的,所有的类最终均继承自Object类。Java中不像C++,没有显式的构造初始化列表,但是Java编译器强制你去在构造器方法中首先初始化基类,编译器不允许你之后再对基类进行初始化。Java中通过结合自动初始化与未初始化对象引用异常来保证成员的初始化。

Java中的继承并不改变基类中成员的保护级别。Java中和C++不同,你无法指定public,private,或者protected继承。同样,重写基类的方法也无法减少基类方法的访问权限。例如,如果基类中的方法是public的,如果你重写了该方法,那么你所重写的方法访问权限也必须是public的(编译器会对此进行检查)。

Java提供interface关键字,来创建一个只包含抽象方法并且没有数据成员的类似于抽象基类的类。这一机制将仅被设计用来作为接口与通过extends关键字拓展现有功能两者做出了清晰的划分。值得一提的是,abstract关键字会产生类似的效果,不能创建该类的对象。一个abstract类可以包括抽象方法(虽然不要求必须包含),但是它也可以包含实现,这使其受限于单继承。使用接口这一机制,防止了对于像C++中虚拟基类的需求。

使用implements关键字来创建可被实例化的interface版本,其语法看起来和继承相像

Java中没有virtual关键字,因为Java中的所有非静态方法均使用动态绑定。因此,Java程序员无需决定是否采用动态绑定。C++中存在virtual关键字是因为这样你就可以在进行性能调校时不使用它以获得轻微的性能提升(或者,换句话说,“如果你不用它,你就能够免受其累”),这通常会造成混淆与意外。final关键字为性能优化提供了一些余地 – 它让编译器知道所修饰的方法不能被重写,也就因此其可能被静态绑定(将其内联,因此用起来相当于C++的非虚方法调用)。这些优化取决于编译器。

Java不支持多继承(MI),至少和C++不在相同的意义上(支持)。如同protected,MI似乎挺好的,但是你知道只有当你面对某个设计问题时,你才需要它。因为Java使用单根继承,你将很少遇到需要MI的情况。interface关键字负责(让你可以)结合(使用)多接口。

运行时类型检查功能同C++中的很相像。

和C中强制类型转换的样子一样。编译器无需额外的语法,会自动调用动态转换机制。虽然这没有C++中“new casts”的自解释好处,但是Java会检查其使用情况并适时抛出异常,不会同C++中一般有错误的转换。

Java中由于没有析构函数,其异常处理与C++有所不同。可以添加finally子句块去强制执行必须的清理语句。Java中所有的异常类型都是Throwable类的子类,这种情况保证你能够有一个通用接口。

Java的异常规范同C++相比有很大优势。不像C++的方式,在运行时调用函数,当错误发生异常被抛出,Java异常规范在编译时被核查并执行。除此之外,重写后的方法必须遵循异常规范:同基类中被重写的方法相比,重写的方法可以抛出与被重写方法相同类型或是其子类型的异常。这提供了更为健壮的异常处理代码。

Java有方法重载,但是没有操作符重载。String类使用+和+=操作符来连接字符串,并且String表达式使用自动的类型转换,但这只是特殊的内置情况。

C++中的const问题在Java中很自然的就避免了。你只能向对象传递引用,并且不会为你自动生成本地副本。如果你想要同C++一样的传值,你可以调用clone()去生成参数的本地副本(虽然clone()机制设计的有些不好 – 见第12章)。

Java中不会自动调用拷贝构造函数。

创建一个编译时常量,你可以这样:

因为安全问题,编写一个“程序”同编写一个“applet”是有很大区别的。一个重要的问题是applet将不会让你写磁盘,因为这将允许一个程序从一台未知机器上进行下载而弄脏你的磁盘。这种情况随着Java 1.1数字签名的应用而有些改观,(数字签名)让你明确地知道每一个程序的作者对你的系统所拥有的特殊权限(其中的一个可能弄脏了你的磁盘;你需要知道是哪一个和发生了什么。)。Java 1.2也承诺了对applets的更强大支持。

由于Java在某些情况下具有很强的限制性,你可能被阻止进行重要的任务,例如直接访问硬盘。Java通过native method来解决这一问题,使用本地方法,你可以调用另一种语言编写的程序(目前仅支持C和C++)。这样一来,你就可以处理针对平台的问题(以一种相对而言不可移植的方式,然而,代码是单独的)。Applets无法调用本地方法,只有应用程序可以。

Java对于注释文档提供了内置支持,所以,源代码文件可以包含其自己的文档,这些文档之后会被一个程序剥离并重新格式化为HTML形式。这对于文档维护和使用而言是一个好消息。

Java包括解决特定任务的标准库。C++则依赖第三方非标准库。这些任务包括(或者将很快包括):

- 网络

- 数据库连接(通过JDBC)

- 多线程

- 分布式对象(通过RMI和CORBA)

- Commerce

这些库实用性和标准性的本质使得能够更快的完成程序开发。

Java 1.1包括Java Beans标准,这可用于在可视化编程环境下创建组件。这推动了可用于所有开发商开发环境下的可视化组件(的发展)。因为你不同特定开发商设计的可视化组件相关联,这使得组件的选择性和实用性更好。除此之外,Java Beans的设计对于程序员而言更好理解;特定开发商的组件框架往往具有陡峭的学习曲线。

如果对Java引用的访问失败,就会抛出异常。这在引用被使用前不会发生;Java规范仅仅指明异常必须以某种方式被抛出。许多C++运行时系统同样可以为坏指针抛出异常。

时间: 2024-11-10 14:56:27

Java and C++的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java自学序言

Java自学序言 亲爱的自己和各位读者朋友: 您们好! 这是作者本人自学Java编程开发的一系列文章,不具有一定的权威性,也算是自己一个人的学习笔记和总结,希望自己通过博客的形式将我自己的学习效率得到提高.如自学的稳重存在不足或错误的地方希望广大的博客朋友们多多指教.本人在此不胜感激! 学习Java是一件很痛苦的事儿,我自己要想不断的去挑战一下自己,把自己大学所学的Java知识能够巩固起来.不断的去改正自己开发中的不足之处.如何来学习Java?如何来更好的掌握Java开发语言?这些都是我们要不断

接口测试(java+testng+ant+jenkins)第五篇 java二

1.数据代码分离,方便维护. 一般做法是将数据保存在excel,通过程序读取. 2.读取excel数据. 在D盘新建excel,A列放url,B列放参数. 新建class redExcel package com.lx; import java.io.File; import java.io.IOException; import jxl.*; import jxl.read.biff.BiffException; public class redExcel{ public static voi