用了很久C++,突然要用Java,买了本《Java从入门到精通》,争取三天看完精通Java,读书笔记就放在这里吧。
第一章:
2分钟看完,老生常谈,即使没怎么用过java也知道这些。第二章:
1.instanceof应该是c++中没有的,c++使用RTTI解决这个问题的,很难用。
2.super这种引用父类的方法也是比较简单的,C++中是用父类名::父类方法()解决的,有点难看。
贴点代码试试看?public class FatherClass {
    public void print(String str)
    {
        System.out.println("father print:"+str);
    }
}public class SonClass extends FatherClass {
    public void print(String str)
    {
        System.out.println("son print:"+str);
        System.out.println("call father print.");
        super.print(str);
    }
}public class TestSuperClass {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SonClass son = new SonClass();
        son.print("Test");
    }
}
3.自动类型转换和C++一样,精度变高的随便转,精度变低的会丢失。
4.强制类型转换只有(type)这一种,不像c++有static_cast、dynamic_cast、reinterpret_cast、和const_cast。
5.运算符什么的和c++几乎一模一样。
半小时看完。

解决方案 »

  1.   

    第三章:
    1.break可以跳出语句块,c++中没有语句块。语句块的定义就是在一段语句前加上花括号和冒号; 
    其他基本上和c++一样,5分钟看完。
      

  2.   


    如果我没记错,break与continue应该是与loop的相关概念...还有楼主对语句块的定义有问题...
      

  3.   

    你都会C++了,除非看Haskell一类的,其他的都很简单了。
      

  4.   

    第四章:
    1.java数组越界会在运行时抛异常,c++不会,声明数组的方法也有些不一致。
    java 声明数组的所有办法
    int[] a = new int[4];
    int a[] = new int[4];
    int[] a = {1, 15, 26};
    int a[] = {1, 15, 26};2.java的数组是一个对象,自带length属性,使用简单。c++的数组不自带方法和属性,要知道数组长度只能sizeof(arrayObject)/sizeof(int)。当然如果使用STL中的vector之类的也和java一样简单。3.java的所谓数组赋值(或者叫数组拷贝)其实就是c++中的两个数组指针的赋值,java没有指针,所以作者费了一大堆口水。好在java有垃圾回收,要不然一个指针的内存就算泄露了。至于真正的数组内容赋值,是使用System.arraycopy(ir, srcPos, ir, destPos, length);而C++一般使用memcpy等函数。若使用STL中的vector,那么就看vector的拷贝构造函数怎么写的,应该是vector的对象赋值过去而不是指针指过去。4.重温了冒泡排序(时间复杂度O(n2)),和快速排序(最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n))。5.For-Each语法被引入java了,在很多地方用起来真是简单。Python和c#早就支持了,c++中虽然STL的algorithm包中引入了for_each,但是由于需要使用函数指针还是略显繁琐。
    这章挺多,看了一个多小时啊!
      

  5.   

    第五章:类和对象
    1.Java中方法的重载和c++的一样,都是通过参数的不同来区别。但是c++中可以设置默认参数,而java不可以。2.java中的对象大部分只能new出来,或者clone出来,或者反射出来,而不能直接在栈上定义出来。而c++的对象在栈上和堆上创建的都很多。3.基本类型的参数传递,java和c++都是传值。对象的参数传递,java是传引用,c++是拷贝,也就是传值。其实c++中大部分时候也是传引用或者传指针,但java没有指针,也没有选择耗时耗空间的拷贝,只能传引用了。这章对于c++程序员来说太简单,几分钟过一遍就可以了。
      

  6.   

    第六章:继承
    1.方法被覆写后,如果要调用父类的方法,c++必须用父类名::方法名,而java用super.方法名即可。2.多态和动态绑定,java和c++几乎一样,都很简单。3.final关键字:java中的final关键字可以讲一个类限制为无法继承的,同样的还有C#中的sealed关键字。而c++是没有这个玩意的。4.java的抽象类和c++几乎一样。5.java是独根语言,引入了Object类,它的clone方法就好像c++中的拷贝构造函数,它的equals方法是用来比较内容的,而toString方法是将对象作为字符串输出的。这章对于c++程序员来说同样简单,几分钟过一遍就可以了。
      

  7.   

    第七章:接口
    1.java中有接口。C++没有,唯一类似的是含有纯虚函数的虚类(没有纯虚基类这个说法)。但是COM、CORBA等中间件中都有IDL语言(接口定义语言),使用这些中间件的c++程序员也没有少写接口。2.接口实现的一些规定:
    1)如果实现接口的不是抽象类,则必须实现其接口的所有方法才能被实例化;
    2)接口中所有的方法默认为public;3.接口可以用来实现多态;4.java的内部类和c++差不多,都没人关心,最多懒得想名字的时候用用那个匿名内部类(例如什么UI的响应函数)。5.java的对象克隆,吹了一堆就是个c++中的拷贝构造函数。所谓什么“浅克隆、深克隆”问题,就是c++中拷贝构造是遇上类中定义了指针的问题。C++程序员一望即知。接口是为了维护单继承机制弄出来的,花半小时看看还是值得的。 
      

  8.   

    这里漏了很重要两点:
    1.Java和C++的数组本质上是完全不同的。
    Java的数组可以理解为一种特殊的对象(这是Java的易用性特性决定的)。它与其它对象实例一样,存储位置在堆上。它创建时的系统消耗远高于C++数组,同样存在内存释放的问题(虽然这是由Java的gc自动完成的)。和其它存储在堆上的对象一致,Java数据的空间是动态分配的,例如这样分配是允许的:    int n=new java.util.Scanner(System.in).nextInt();
        int a[]=new int[n];另外,Java数组名实质上是指针变量,它指向的内存空间是可以变更的:    int a[]=new int[5],b[]=new int[7];
        a=b;
    相对的,C/C++程序开发的目的是高效,为了这个目的往往会降低易用性。C++数组是存储在栈上的(全局数组和静态数组存储在静态区),其内存分配与释放是编译器实现的,系统消耗少。C++数组只能静态分配,它分配的空间大小在编译期就已经确定:void fun(int n)
    {
        //int a[n];  //这句通不过编译
    }另外,按不少C/C++程序员的说法,C++数组名实质上是“指针常量”。只要它分配到的空间被定下来了,就不能再指向另一个地址了(不能作为左值使用):int a[5],b[7];
    //a=b;   //这句通不过编译
      

  9.   

    (上接15楼)
    2.关于这点可能大多数接触Java不久的同鞋都还不清楚:
    Java没有多维数组!
    有些人可能认为
    int[][] a=new int[5][7];
    定义的a是二维数组,实质上不是。a指向的对象的实质是元素为数组的数组。按照C/C++的理解,实质上就是指针数组。因此它并不具备二维数组的特性:a的每个元素不一定是等长的,例如这样定义是完全可以的: int a[][] = new int[5][]; for (int i = 0; i < a.length - 1; i++)
    a[i] = new int[i + 1]; a[a.length - 1] = null;
      

  10.   

    难道这样的java数组也是分配在堆上的?int[] a = {1, 15, 26};
      

  11.   

    忘记了java的所有对象都是分配在堆上的,所以:数组不数组的,反正就是个指针,或者说对象实例的引用。总结:java栈上无对象,数组皆是new出来,多维数组即指针数组。这样理解就好了!
      

  12.   

    看了好久JAVA ,最近没空了。。
      

  13.   

    还没写完,周末有空再写。
    都是什么线程、awt、swing,感觉作者写得很垃圾啊!
      

  14.   

    [Quote=引用 23 楼  的回复:]
    有空去看看。现在的作者,有能力的不愿写,嫌钱少;
    愿意写的能力不够,或者表达力不够。所以,中国的技术书籍一塌糊涂,郁闷。说的好啊
      

  15.   

    第九章:异常处理
    1.java的异常处理中有finally语句块,而c++中没有,所以程序员要自己想办法来处理异常发生后诸如“资源释放”之类的问题;
      

  16.   

    第十章:线程
    1.java语言自带线程机制,c++目前还是不带线程机制的。虽然boost::thread库也被众多c++程序员广泛使用。但是windows下用得最多的还是windows SDK自带的线程函数;而linux下用得最多的还是pthread。另外还有一些号称同时支持多个平台的多线程库。
    2.java多线程有两种方法实现,第一是派生Thread类,第二种是实现Runnable接口。
    3.java线程分为4种状态:new、runnable、non runnable和done,这和其他线程库大同小异;
    4.run、start、stop、sleep、suspend、resume、yield、wait、notify和notifyall等方法的含义也和其他线程库一致。但suspend、resume和stop等方法是不建议使用的,因为可能会导致死锁。
    5.java可使用join方法来等待线程结束,而在某些线程库中join方法经常是不可用的。
    6.java的互斥使用synchonized关键字实现,它很类似于boost.thread中的lock(mutex),只不过它是对线程对象隐含的锁加锁。其实这很不利于新手理解。另外还介绍了synchonized的一些乱七八糟的用法,相信对于新手这只有反作用。这一章对于线程,介绍得比较浅显,实现简单的多线程应该没问题,但是稍微复杂一点的也许就需要其他的开发包了。Java线程连个Mutex类都没有,这是最让我吃惊的,仅仅使用synchonized来实现同步、互斥、信号量该多麻烦啊,也许是我还没弄懂java多线程吧。
      

  17.   

    第十一章:图形编程
    1.IDE的年代,GUI还是画出来吧。Java中也就Layout类需要看看,其他大部分Layout类也是凑数的,根本不会有人用。
      

  18.   

    2.java多线程有两种方法实现,第一是派生Thread类,第二种是实现Runnable接口。你说的两种方法,仅仅是线程运行时需要执行的任务,而不是多线程的两种方法实现。Java 里的线程就 Thread 一种实现,并没有两种!
      

  19.   

    POSIX threads        jdk
    ------------------   ----------------------------------------
    mutex                java.util.concurrent.locks.Lock
    rwlock               java.util.concurrent.locks.ReadWriteLock
    cond                 java.util.concurrent.locks.ConditionJDK 5 使用了 CPU 原生的 CAS 指令,在此基础上弄出了很多多线程并发工具,比如:计数信号量、倒计数门闩、循环障栅、线程交换器等等。基于 ARM, PowerPC, SPARC, x86 等芯片的 BSD, Linux, Solaris, Windows 平台,Java HotSpot VM 的 CAS 实现是通过 AT&T/x86 内联汇编指令 cmpxchg, cmpxchg8b 等完成的。对于 C/C++ 而言要实现 lock free 的 CAS,可以使用系统函数库,或者根据不同平台使用内联汇编自己写Windows 中的 InterlockedCompareExchange 函数
    Linux 没有现成的函数,在 GCC 4.1+ 有内置的 __sync_bool_compare_and_swap 函数
    Intel 的 TBB 库中有现成的 atomic<T> 模板
      

  20.   

    很好,java多线实在是不熟悉啊。
      

  21.   

     
    java有标签。可以跳出多层循环的。。他说的语句块,就是标签
      

  22.   


    JDK 5 之后的并发包(java.util.concurrent)中的东西非常复杂,像 java.util.concurrent.locks.AbstractQueuedSynchronizer 就是其中最为重要,最为复杂的一个类。如果你有 C/C++ 多线程/并发 开发的经验,以及对于现代 CPU 架构较为了解的话,那 Java 中的多线程以及并发包中的实现也是很好理解的。在 Java 中除了最为基础的东西之外,你只要看三样东西就可以了:Java 中有三大支柱,在 java.util.concurrent、java.security、javax.cropty、javax.security 四个包中就占了两个(多线程、安全)还有一个网络在 java.net、javax.net 中,呵呵掌握了上面 6 个包及其子包中内容的话,那 Java 水平可以说达到了另一种境界。PS:三大支柱是我之前给 Java 中多线程、网络和安全取的代号,嘿嘿这三样中的东西非常多,基本上就是 Java 的核心所在。多线程(multi-threading and concurrent)1:关键词:volatile, sychronized2:传统的线程 API:java.lang.Thread, java.lang.Runnable, java.lang.ThreadGroup, Object#wait, Object#notify, Object#notifyAll3:JDK 5 并发包(java.util.concurrent)API:线程池、任务执行器、计数信号量、倒计数门闩、并发集合(并发 Map、阻塞队列等)、基于 CPU CAS 指令的原子 API(java.util.concurrent.atomic)、锁 API(java.util.concurrent.lock)和条件对象等。4:作为个人知识提升,还需要理解诸如自旋锁、分离锁、分拆锁、读写锁等的同步锁策略,以及可重入锁、锁的公平性的意义。以及各种并发锁的算法,比如:Peterson锁Bakery锁 等等,以及现代 CPU 体系结构涉及多线程及并发的 API 在 java.lang 中及 java.util.concurrent.* 中。
    网络(network communication)1:阻塞 TCP 通信、阻塞 UDP 通信、组播
    2:非阻塞 TCP 通信、非阻塞 UDP 通信
    3:客户端通信 API(java.net.URL, java.net.URLConnection 等类库)涉及网络通信的 API 都在 java.net 和 java.nio.channels 包中。这里的网络已经将 RMI 相关包 java.rmi, javax.rmi 都排除了。
    安全(security, cryptography and AAA)1:Java 加密类库 JCA
    2:Java 加密类库扩展 JCE
    3:涉及密码学知识点的消息摘要、消息认证码、对称加密、非对称加密、数字签名
    4:涉及网络通信证书管理工具(keytool)及 API(PKI、X.509证书)
    5:基于 SSL/TLS 的安全网络通信 API(JSSE),包括:密钥库管理、信任库管理、阻塞 SSL 通信和非阻塞 SSL 通信等等
    6:Java 认证及授权服务(JAAS)API涉及安全的东西都在:java.security(JCA、JCE、数字证书,以及 JCE 的 SPI)
    javax.net(SSL/TLS)
    javax.security(JAAS)
    javax.crypto(密码学)
    keytool 的 JDK 工具
      

  23.   

    第十二章:事件处理
    随便看看了解即可,新手可以试着写写代码,老手直接IDE中添加事件即可。第十三章:Swing用户界面设计
    同第十一章,随便看看即可。界面一般有专人搞,普通程序员能看懂就行了。总结:《java从入门到精通》这本书整体质量尚可,c++熟手大概一到两天可以看完,掌握程度在80%左右。看完后能够有一些基本概念,可以写一些基本程序。看完后离入门还早,更谈不上精通了。
    说说我看完后的两个迷惑之处吧,第一是从来没有提到java中的对象、常量、代码所在的堆、栈等内存分布情况,对于c++程序员来说是很难适应的,可能是篇幅的原因吧;第二没有介绍垃圾回收机制,这可能是c++程序员更感兴趣的吧。总之,结贴,散分。