形成一个思想of course须要一定的基础知识
--而且有了一定的基础知识才能对该思想有更深的认识先不说思想,怎样才能更快地提高我们的基础知识呢?
基础知识如何获得并进一步深化呢?这里简略谈谈我自己对学java(包括学其它方面知识)的一些愚见1 广泛的阅读
 对各方面都要有一定的了解,这样才能更准确的把握全局,
 但不要过份地去追求新的事物,必须要有自己的重点项目2 深入的学习(当然是有一定基础的前提下)
 对于某一种方法,你得了解它为什么这么做,这样做有什么好处,
 进而类推能否用到其它的方面,同时应该思考该方法能否得到进一步改善。3 大量的实践
 要大量地用手,不是说你只要点击两个按钮,改两个属性,而是要进行真正的手工,
 尽量不要让代码自动生成(除非你能倒着背出这段代码),这样才能发现问题(自己不懂的),
 进而分析解决问题。--这绝对是你掌握精通某一知识的捷径!!4 反复的测试
 进一步发现问题(程序本身的)。
 找出新的解决方案,提高程序的可读性,可扩展性,可reuse性--当然是
 在执行效率不明显降低的情况下。后来我发现其上所述在我们学习过程中存在着一定的规律:
当你以某一领域研究得愈透彻,其靠后的方面(如实践和测试)就显得愈为重要。另外再给出两句名言:
  最重要的不是做什么,而是怎样去做。如果认真去做了,就会发现从这个项目得到的收获远远超过项目本身。
  
  如果没有丰富的实践经验,脱离了一个很扎实的基础,就算是学到了系统分析和系统设计的一个皮毛,那成功的可能性也是很小的。

解决方案 »

  1.   

    谈谈系统类java.lang.System的一些特点java.lang.System是一个特殊的类,它是Object类的子类,其最主要的特点是使用前不需要用new语句进行初始化,
    因为在系统启动时,已自动对系统类进行初始化,分配了相应的内存区。
    系统类是专门为用户程序而设置的,它为用户程序提供当前环境下的系统资源。其有一些好用的功能:(in和out,err就不用说了,)getProperty();系统属性的获取
    比如:System.getProperty("OS.name");//
          System.getProperty("Java.version");//
          同样还有其它入口参数
          user.dir//用户目录
          user.name//用户名
          path.separator//当前操作系统的路径分隔符
          Java.name//java安装目录
          File.separator//文件分隔符
    同样还有setProperties()啦,setProperties方法用来设置或修改系统的属性。不过,经过用户程序修改的系统属性是暂时性的
    ,如果系统重新启动,系统属性又将是其原始属性了。
    比如System.setProperties(p);
    上述语句将系统属性按对象p的内容来设置,p是此前已经创建的一个属性对象。
    System.currentTimeMillis();获取当前时间,这个功能可用在一些系统管理程序中。
    System.exit();几乎每个程序里都有的啦,就是退出系统。
    俺就知道这么多,谁知道再补上去啊!
      

  2.   

    也谈JVMjava虚拟机(java vistual machine)是一种假想的计算机。从结构上看,它由一组抽象的部件组成,这些部分包括指令集、寄存器组、
    类文件格式规定、堆栈、内存垃圾收集器、存储区六个部分。指令集采用独立于平台的字节码形式;寄存器给中包含程序计数器、堆栈指针、
    运行环境指针和变量指针;类文件也独立于平台;堆栈用来传递参数和返回运行结果;垃圾收集器收集不再使用的内存片段;
    存储区则用来存放字节码。JVM仅仅规定了部件的功能和规格,虽然这些功能和规格是统一的,但是并没有元宝这些部件的具体实现技术,
    就是说,可以用任何一处技术来实现。
    在java推出初期,jvm都是通过软件仿真的方法实现的,这种方法目前仍被广泛采用。但是,现在也有硬件实现的java虚拟机,
    它们都必须符合和遵从jvm规范,完成相应的功能。指令集规定了java支持的基本数据类型,可以是1、2、4、8字节,也包括浮点数,指令集也也规定了指令格式,如规定所有指令都有操作码
    和操作数组成,操作码为8位。这样,理论上最多可以有256条指令。
    JVM只设置了数量很少的寄存器,它们是程序计数器,堆栈栈顶指针,运行环境指针和局部变量指针。这些寄存器全是32们的。这样做
    可以使得一只配置少量寄存器的计算机也能建立java运行环境,而使一些配置较多寄存器的计算机通过优化技术则能充分利用资源,
    提高性能。
    从结构上,类文件的内容可以分为四个部分。第一部分是标志和版本信息,每个类文件都以CAFEBABE开头,这是类文件的标志,接着标明
    java编译器的版本号。第二部分称为常数池,常数池的前两个字节指出当前常数池中的表项数,接下来一字节叫标签,它指出常数类型。
    其实,常数池是一系列常数组成的一个表,这些常数可能是字符串,域名,类名以及代码所引用的常数等。
    第三部分是对程序中用到的类的方法的说明。最后一部分就是由字节码表示的程序主体
    JVM彩面向堆栈的机制,这为只设置少量寄存器建立了前提。在JVM中,许多指令的操作数来自堆栈,操作结果也放在堆栈中。确定JVM规范的意义在于为Java提供了跨平台性和安全性。
    凡是符合JVM规范的计算机机,便可以作为JVM来运行Java软件。所以符合JVM规范的计算机就可以成是一种Java平台。
      

  3.   


    Servlet常见错误校验表:________________________________________________________________________________
    故障现象           可能的原因
    ________________________________________________________________________________
    servlet不能编译        除了通常的java语言错误以外,还有一些跟servlet有关的原因:
    1 没有导入javax.servlet.*或javax.servlet.http.*;
    2 类没有实现子类servlet或者它的一个子类;
    3 servlet.jar没有在类路径中设置
    ________________________________________________________________________________
    没有加载servlet          这可能有多种原因:
    1 使用了错误的url(如,没有指定/servlet);
    2 大小写错;
    3 类没有在servlet引擎的servlet路径中;
    4 有关的类没有在servlet引擎的类路径中;
    5 servlet在初始化过程中失败
    6 servlet引擎没有处于运行状态;
    7 web服务器没有处于运行状态
    ________________________________________________________________________________
    空的参数值               查看getParameteter()是否使用了一个带多个值的参数
    ________________________________________________________________________________
    空指针异常               这可能表明这样的失败:在从会话提取值以前创建会话失败
    ________________________________________________________________________________
    初始参数的错误取值        确认参数名称拼写得是否跟程序中的和servlet属性中的完全一样
    (注意大小写)
    ________________________________________________________________________________
    空的初始化参数           init()方法没有调用super.init(config)
    ________________________________________________________________________________
    Servlet引擎在关闭时挂起  destroy()方法没有调用super.destroy();
    ________________________________________________________________________________
    错误的MIME类型           确保在写入到响应流以前是否调用了setContentType();
    ________________________________________________________________________________
    被破坏的数据值           确认在非同步化的方法中是否使用实例变量。
    记住:除非显示地实现SingleThreadMode,否则
    servlet的单个实例就可以被 多个线程运行,如果是这样的话,
    任何实例变量都是由所有线程共享的。
    ________________________________________________________________________________
      

  4.   

    给出一个将数据转换成图表的小程序(由两个类文件组成,也可以当小应用程序)import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;public class MainApp extends Applet {
        ControlsApp controls;
        CanvasApp canvas;    public void init() {
    setLayout(new BorderLayout());
    canvas = new CanvasApp();
    add("Center", canvas);
    add("South", controls = new ControlsApp(canvas));
        }    public void destroy() {
            remove(controls);
            remove(canvas);
        }    public void start() {
    controls.setEnabled(true);
        }    public void stop() {
    controls.setEnabled(false);
        }    public void processEvent(AWTEvent e) {
            if (e.getID() == Event.WINDOW_DESTROY) {
                System.exit(0);
            }
        }    public static void main(String args[]) {
    Frame f = new Frame("TestApp");
    MainApp mainApp = new MainApp(); mainApp.init();
    mainApp.start(); f.add("Center", mainApp);
    f.setSize(600, 600);
    f.show();
        }    public String getAppletInfo() {
            return "An interactive test of the Graphics routines.";
        }
    }
    *************第二个文件******************import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import java.io.*;class CanvasApp extends Canvas { String[][] datastr1;
    int[][] data1;
    int gti1;
    String filestr="datenum.txt";
        Font font = new java.awt.Font("Courier", Font.BOLD, 12);    public void paint(Graphics g) {
         try{
         File file=new File(filestr);
    FileReader in=new FileReader(file);
    int filesize=(int)file.length();
    char[] data=new char[filesize];
    int charsreaded=in.read(data);
    String datastr=new String(data);
    String[] dataall=datastr.split("\n");
    datastr1=new String[dataall.length][2];
    data1=new int[dataall.length][2];
    gti1=dataall.length;
    for(int i=0;i<dataall.length;i++){
    datastr1[i]=dataall[i].split(" ");
    int adate=Integer.valueOf(datastr1[i][0].trim()).intValue();
    data1[i][0]=adate;
    int anum=Integer.valueOf(datastr1[i][1].trim()).intValue();
    data1[i][1]=anum;
    }

    }
    catch (IOException e){
    System.out.print("can't read : "+e);
    }
    Rectangle r = getBounds();
    int h = r.height / 20;
    int v = r.width / 20;

    g.setColor(Color.pink);
    for (int i = 1; i <= 20; i++) {
        g.drawLine(0, i * h, r.width, i * h);
    }
    for (int i = 1; i <= 20; i++) {
        g.drawLine(i * v, 0, i * v, r.height);
    }
    g.setColor(Color.blue);
    for(int i=1;i<20;i++){
    g.drawString(Integer.toString(i),v*i,19*h+h*2/3);
    g.drawString(Integer.toString(i*10-10),v/4,20*h-i*h);
    }
    g.drawString("Num",v,h);
    g.drawString("Date",19*v,19*h);

    g.setColor(Color.black);
    g.setFont(font);
    g.drawLine(v, h, v, 19* h);
        g.drawLine(v, 19*h, r.width - v, 19* h);
        
        for(int i=0;i<gti1-1;i++){
         g.drawLine((data1[i][0])*v,19*h-(data1[i][1])*h/10,(data1[i+1][0])*v,19*h-(data1[i+1][1])*h/10);
        }

        }     public void redraw(boolean cgo,String cfile) {
         this.filestr=cfile;
         repaint();    }
    }
    class ControlsApp extends Panel
                      implements ActionListener {
        TextField tfile;
        CanvasApp canvas;
        Button b = null;
        Frame myFrame=new Frame();
    FileDialog myDialog=new FileDialog(myFrame,"gogogo");    public ControlsApp(CanvasApp acanvas) {

    this.canvas = acanvas;
    add(tfile = new TextField("Clink the Go button to input the data files"));
    b = new Button("Go");
    b.addActionListener(this);
    add(b);
        }    public void actionPerformed(ActionEvent ev) {
    myDialog.setMode(myDialog.LOAD);
    myDialog.setVisible(true);
    String label = ev.getActionCommand();
    String fstr=myDialog.getFile();

    if(fstr==null) fstr="datenum.txt";
    canvas.redraw(label.equals("Go"),fstr);
    tfile.setText(fstr);
        }
    }
     datanum.txt等文件为默认数据文件,所以必须,运行时请自行创建,如
    1 123
    2 94
    3 108
    4 96
    5 115
    6 105
    7 68
    8 70
    9 102
    10 77
     在主窗口中点击 go选择数据文件,数据文件格式为
    x y
    x1 y1
    x2 y2
    ....
    .... 其中日期为1-20,人数为1-200;
     最大可容纳20组数据
      

  5.   

    给出一个显示类各成员的小程序import java.lang.reflect.*;
    import javax.swing.*;public class Reflection{
    public static void main(String[] args){
    String name;
    if(args.length>0) name=args[0];
    else name=JOptionPane.showInputDialog("input a class name(e.g java.util.Date):");
    try{
    Class cl=Class.forName(name);
    Class supercl=cl.getSuperclass();
    Class[] c=cl.getInterfaces();
    if(!cl.isInterface()){
    System.out.print("class ");
    }
    else System.out.print("interface ");
    System.out.print(cl.getName().substring(cl.getName().lastIndexOf('.')+1));
    if(supercl!=null&&supercl!=Object.class)
    System.out.print(" extends "+supercl.getName().substring(supercl.getName().lastIndexOf('.')+1));
    if(c.length>0){
    if(cl.isInterface()){
    for(int i=0;i<c.length;i++){
    System.out.print(" extents "+c[i].getName().substring(c[i].getName().lastIndexOf('.')+1));
    }
    }
    else{
    System.out.print(" implements ");
    for(int i=0;i<c.length;i++){
    if(i>0)System.out.print(",");
    System.out.print(c[i].getName().substring(c[i].getName().lastIndexOf('.')+1));
    }
    }
    }
    System.out.print("{\n");
    printConstructors(cl);
    System.out.println();
    printMethods(cl);
    System.out.println();
    printFields(cl);
    System.out.println("}");
    }
    catch(ClassNotFoundException e){
    e.printStackTrace();
    }
    }
    public static void printConstructors(Class cl){
    Constructor[] cons=cl.getDeclaredConstructors();
    for(int i=0;i<cons.length;i++){
    String name=cons[i].getName();
    int a=name.lastIndexOf('.');
    String name1=name.substring(a+1);
    System.out.print(Modifier.toString(cons[i].getModifiers()));
    System.out.print(" "+name1+"(");
    Class[] paramTypes=cons[i].getParameterTypes();
    for(int j=0;j<paramTypes.length;j++){
    if(j>0)System.out.print(",");
    System.out.print(paramTypes[j].getName().substring(paramTypes[j].getName().lastIndexOf('.')+1));
    }
    System.out.println(");");
    }
    }
    public static void printMethods(Class cl){
    Method[] methods=cl.getDeclaredMethods();
    for(int i=0;i<methods.length;i++){
    Method m=methods[i];
    Class r=m.getReturnType();
    String name=Modifier.toString(m.getModifiers());
    System.out.print(Modifier.toString(m.getModifiers()));
    System.out.print(" "+r.getName().substring(r.getName().lastIndexOf('.')+1)+" "+m.getName()+"(");
    Class[] p=m.getParameterTypes();
    for(int j=0;j<p.length;j++){
    if(j>0)System.out.print(",");
    System.out.print(p[j].getName().substring(p[j].getName().lastIndexOf('.')+1));
    }
    System.out.println(");");
    }
    }
    public static void printFields(Class cl){
    Field[] fields=cl.getDeclaredFields();
    for(int i=0;i<fields.length;i++){
    Field f=fields[i];
    String name=f.getName();
    String type=f.getType().getName().substring(f.getType().getName().lastIndexOf('.')+1);
    System.out.print(Modifier.toString(f.getModifiers()));
    System.out.println(" "+type+" "+name+";");
    }
    }
    }
      

  6.   

    我来谈谈我的学习经历:
        偶是(2003)应届毕业生,虽说平时应付考试有一套,但实际功夫不怎么样,(就拿编程来说吧,以前压根就没真正意义上编过程),直到去年年底要找工作了,才认识到问题的“严重性“(我这人向来都这样,火不烧眉毛不急,没办法,天生就这幅德性),买不掉,怎么办?!找份计算机应用的活干吗,有点不甘心(差点去当老师去了),毕竟是科班出生,于是准备学点东西,学一门能吃饭的工具.看了人才招聘会上要java程序员的还是蛮多的,于是就选了java.
       大学四年真正的意义上的学习终于开始了,3月来,我基本上每天坚持学习不下10小时以上,从这学期开学一直至今,每天除了学习,睡觉,吃饭,不干别的事情,当然还是会玩一下游戏,调剂调剂!呵呵这是我的老本行!虽说有时候会觉得好累,但整的来说,这一段可能是我大学期间过的最充实的日子,并且自我感觉进步也不小。
       期间我学了2个月的J2SE,一个月的J2EE.基础非常重要,于是“重点“学习了一下Java2,开始时步履维艰,我边上没有学java的,遇到问题只能靠自己,有时候遇到一个问题可能会“卡“上好几天,真的是巨郁闷!最后好多问题都只的绕道而行.......后来幸亏来了csdn,在这里结识了几个网友,并且从他们那里获得了不少帮助。慢慢的慢慢的开始找到感觉了,步入正轨,自己边学习边实践,写了个搜索引擎搜索器(下载网站的东东)---也是毕业设计,指导老师看了,还挺满意的,呵呵(当时乐了半天)!!当然还在进一步的完善之中!!但光学个Java2还是不行,因为java的优势在于J2EE。接下来开始学习J2EE,我是从EJB开始学起的,呵呵一般来说都是先学JSP,javabean,servlets然后再学EJB,可我当时并不知道,就单纯的认为EJB在J2EE中最重要,于是借了本Master of EJB就开工了,先看了一下理论,结合书上实列,自己也跟着写些简单的Sessionbean,BMP,CMP.但是,我写好的EJB怎么用啊,于是就开始学Servlets,学着用servlets调用EJB,但是我发现写servlets好麻烦,尤其是那些输出语句,即使是写个简单的登陆页面都好麻烦,后来开始接触JSP,JavaBean, 并且帮同学做了简单的通讯录jsp+javaben+sessionbean+CMP,.........现在仍然在Studing,准备向structs进军!!学一下MVC.......
       虽然现在还没工作,但我还是蛮欣慰的,3个月打造一个J2EE程序员还是蛮困难的,对一个没编程思想的人来说尤其如此,不过我现在正在向这个“极限”挑战,我为自己加油,呵呵,同时也希望各位大虾多指点,以便偶少走弯路.................
      

  7.   

    GUI类:
    javabean->Swing->JavaHelp->Java2D->ImageIO->JAI->Java3D......
    Enterprise类
    JDBC->JDO->Servlet->JSP->EJB->JMS->JTA,JTS........
      

  8.   

    用applet访问数据库的一个好的路线
    用applet去请求servlet servlet请求sessionBean sessionBean调用实体bean
      

  9.   

    to "gongqh21(找老公)"
    "开始时步履维艰,我边上没有学java的,遇到问题只能靠自己,有时候遇到一个问题可能会“卡“上好几天,真的是巨郁闷!最后好多问题都只的绕道而行......."
    55555----大家一样啊
    同是天涯命苦人,.......(后面一句就不用说了)
    虽说这样培养了独立思考的能力,但必竞“百日之所思不如一日之所学”啊
    现在虽然找到了一点点路子,但要想继续深造,不结实几个同道中人还是不行呀。
    my QQ :66459723
      

  10.   

    Hodex:
    我现在正在学习java,你的经验对我来说大珍贵了,非常值得我学习,衷心地谢谢你!
      

  11.   


    调用构造方法遵循的一些规则1 从一个类创建对象时,可以调用此类的父类构造方法。调用父类的构造方法很容易,只要在类的构造方法的方法体中,第一条为super语句就可以了,super可以调用父类的任何一个带入口参数或不带入口的参数的构造方法。2 如果一个类的构造方法中第一个语句没有用super来调用其父类的构造方法,则编译器也会默认为在构造方法中,用super()语句调用父类的不带参数的构造方法。但是假如此时父类中的所有构造方法都 是必须带有入口参数的,那就会使编译出错。3 如果某个类的构造方法第一个语句是用this来调用的另一个构造方法。那么java系统就不会再默认为这个构造方法调用父类的构造方法。4 一个构造方法用this 语句调用本类的另一个构造方法时,如果被调用的构造方法又是调用父类的构造方法而又没有用super语句,那么java编译器会默认它含有super()语句。此时,如父类中不存在不带参数的构造方法,则将使编译出错。
      

  12.   

    Java 多线程同步机制的几条主要原则1 如果一个类包含一个或几个同步方法,那么由此类生成的每个对象都配备一个队列用来容纳那些等待执行同步方法的线程。2 对于一个线程来说,有两种途径会使其进入等待队列,一种是在其他线程调用含有同步方法的对象时,
    此线程正在调用这个对象的方法,另一种是此线程调用了wait()方法。3 当一个线程从一个同步方法调用返回时,或者调用wait()方法时,其他线程就可以访问此对象。4 作为总的原则,系统总是使队列中拥用最高优先级的线程获得运行机会。5 如果一个线程由于调用wait()方法而进入等待队列,那么,它必须由别的线程通过调用notity()方法
    来唤醒它,才能安排它重新执行。当然,上面列出的几个原则有些繁杂,但在实际处理中其实很简单,只要按照下列三条规则去做就可以了。1 如果两个或多个线程修改一个对象,那么将执行修改操作的方法用关键字synochronized定义为同步方法。2 如果一个线程必须等待某个对象的状态被改变,那么此线程应在对象队列中等待,这种等待是通过
    进入同步方法或者调用wait()方法来实现的。3 每当一个方法修改了某个对象的状态时,这个方法就应该再调用notify()方法,这样给那些外于等待
    队列中的线程一个机会,使其能够检测环境是否已经发生改变,从而可使其重新运行。
      

  13.   

    多实践,多学习,多思考
    通过具体项目实践发现问题,然后通过看书和上java论坛来解决问题,解决问题以后多思考一下自己的水平就提高了^_^
    推荐看的书:Thinking in java
    如果E文好可以多看看sun公司网站上的资料
      

  14.   

    我也推荐两本
    Java核心技术(巻I,巻II都不错)
    <<用实例学Java2>>(不比Thinking in Java差)
      

  15.   

    刚开始学,工具最好用JDK+JPadPro
    不要用IDE
      

  16.   

    看上去很难呀,我在英国学习,也是刚刚学习java,别的还好说,就是语言不习惯,我的意思是说中文的翻译术语有些糊涂,有时候会反应不过来,不过看常了到也惯了。我是对编程语言一点基础也没有,所以我觉得在起步的时候,概念一点要搞清楚,多做练习,不一定要用好的编写工具,其实用notepad或textpad就很能学到东西。
      

  17.   

    有时候觉得书太多而乱了脚步,因为似乎有很多书都是人们推荐的好书。于是好长一段时间看看这本书,瞅瞅那本。有时候都觉得学到的不是很多。我很佩服gongqh21的经历,其实我开始学的时间更早。但相比之下,只能说还很菜。
    其实不是好书就可以把所有概念讲的让人容易接受,我经常碰到一些不甚理解的概念,然后没有办法去翻阅若干本书才找到答案。以后再有什么不理解的我会问你们的。
    我希望大家一起努力
     Hodex我已经发信息了,我的QQ29441008
    你是我的榜样gongqh21
      

  18.   

    seven1996(小七) 
    你说得很对
    我的第三条“3 大量的实践”,也正好提到了这一点
      

  19.   

    我才开始学习Java,大家有什么看过的好的书可以推荐一下吗?
      

  20.   

    楼上说了的嘛
    Thinking in java
    Java核心技术(巻I,巻II都不错)
    <<用实例学Java2>>(不比Thinking in Java差)
      

  21.   


    我只看完了 java核心技术卷一
    二还没看
      

  22.   

    Thinking in java的中文版翻译的实在惨不忍睹
    我觉得可以结合着英文版一起看!
      

  23.   

    楼主:<<用实例学Java2>>哪里有下的?
    给个地址
      

  24.   

    <<用实例学Java2>>我也是从图书馆看到的,
    在哪下,我也不知道。
      

  25.   

    其实我学JAVA的目的是为了工作啊!!! 养家糊口,难啊ING!!!兄弟们,一起努力吧!!! :)
      

  26.   

    我觉得学习JAVA是一件不容易的事,我也是刚学,看了上面的各位高手的回复后,我学到了很多,谢谢你们。也要谢谢提这个问题的人。
      

  27.   

    看docs和tutorial是非常重要的
    其实java.sun.com上面本身就有很多好书和资料
      

  28.   

    我也是刚开始学习java
    希望大家能多照顾照顾!!!