形成一个思想of course须要一定的基础知识
--而且有了一定的基础知识才能对该思想有更深的认识先不说思想,怎样才能更快地提高我们的基础知识呢?
基础知识如何获得并进一步深化呢?这里简略谈谈我自己对学java(包括学其它方面知识)的一些愚见1 广泛的阅读
对各方面都要有一定的了解,这样才能更准确的把握全局,
但不要过份地去追求新的事物,必须要有自己的重点项目2 深入的学习(当然是有一定基础的前提下)
对于某一种方法,你得了解它为什么这么做,这样做有什么好处,
进而类推能否用到其它的方面,同时应该思考该方法能否得到进一步改善。3 大量的实践
要大量地用手,不是说你只要点击两个按钮,改两个属性,而是要进行真正的手工,
尽量不要让代码自动生成(除非你能倒着背出这段代码),这样才能发现问题(自己不懂的),
进而分析解决问题。--这绝对是你掌握精通某一知识的捷径!!4 反复的测试
进一步发现问题(程序本身的)。
找出新的解决方案,提高程序的可读性,可扩展性,可reuse性--当然是
在执行效率不明显降低的情况下。后来我发现其上所述在我们学习过程中存在着一定的规律:
当你以某一领域研究得愈透彻,其靠后的方面(如实践和测试)就显得愈为重要。另外再给出两句名言:
最重要的不是做什么,而是怎样去做。如果认真去做了,就会发现从这个项目得到的收获远远超过项目本身。
如果没有丰富的实践经验,脱离了一个很扎实的基础,就算是学到了系统分析和系统设计的一个皮毛,那成功的可能性也是很小的。
--而且有了一定的基础知识才能对该思想有更深的认识先不说思想,怎样才能更快地提高我们的基础知识呢?
基础知识如何获得并进一步深化呢?这里简略谈谈我自己对学java(包括学其它方面知识)的一些愚见1 广泛的阅读
对各方面都要有一定的了解,这样才能更准确的把握全局,
但不要过份地去追求新的事物,必须要有自己的重点项目2 深入的学习(当然是有一定基础的前提下)
对于某一种方法,你得了解它为什么这么做,这样做有什么好处,
进而类推能否用到其它的方面,同时应该思考该方法能否得到进一步改善。3 大量的实践
要大量地用手,不是说你只要点击两个按钮,改两个属性,而是要进行真正的手工,
尽量不要让代码自动生成(除非你能倒着背出这段代码),这样才能发现问题(自己不懂的),
进而分析解决问题。--这绝对是你掌握精通某一知识的捷径!!4 反复的测试
进一步发现问题(程序本身的)。
找出新的解决方案,提高程序的可读性,可扩展性,可reuse性--当然是
在执行效率不明显降低的情况下。后来我发现其上所述在我们学习过程中存在着一定的规律:
当你以某一领域研究得愈透彻,其靠后的方面(如实践和测试)就显得愈为重要。另外再给出两句名言:
最重要的不是做什么,而是怎样去做。如果认真去做了,就会发现从这个项目得到的收获远远超过项目本身。
如果没有丰富的实践经验,脱离了一个很扎实的基础,就算是学到了系统分析和系统设计的一个皮毛,那成功的可能性也是很小的。
解决方案 »
- 开源项目:三国杀改 -》 王朝杀
- Collections.sort的问题
- 关于父类引用指向子类对象,到底优点在哪里?老师描述的很抽象
- 分享一个局域网的聊天室程序 (支持窗口界面和telnet界面)
- MenuItem.addSelectionListener() 怎么得到MenuItem的类名.
- 谁能帮我介绍几个关于java 或vc/c++的网站或论坛
- 大家开发界面使用什么,有多少人使用Swing,觉得优势是什么?
- 怎样用JAVA在B/S结构下实现二个服务器之间的文件交换
- 问个java2核心技术例子中的一个问题(RMI)
- 求教!搭建简单的dubbo框架
- 有关Java学习的,请各位指教
- 请讨论打成可执行jar后的问题!!
因为在系统启动时,已自动对系统类进行初始化,分配了相应的内存区。
系统类是专门为用户程序而设置的,它为用户程序提供当前环境下的系统资源。其有一些好用的功能:(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();几乎每个程序里都有的啦,就是退出系统。
俺就知道这么多,谁知道再补上去啊!
类文件格式规定、堆栈、内存垃圾收集器、存储区六个部分。指令集采用独立于平台的字节码形式;寄存器给中包含程序计数器、堆栈指针、
运行环境指针和变量指针;类文件也独立于平台;堆栈用来传递参数和返回运行结果;垃圾收集器收集不再使用的内存片段;
存储区则用来存放字节码。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平台。
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的单个实例就可以被 多个线程运行,如果是这样的话,
任何实例变量都是由所有线程共享的。
________________________________________________________________________________
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组数据
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+";");
}
}
}
偶是(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程序员还是蛮困难的,对一个没编程思想的人来说尤其如此,不过我现在正在向这个“极限”挑战,我为自己加油,呵呵,同时也希望各位大虾多指点,以便偶少走弯路.................
javabean->Swing->JavaHelp->Java2D->ImageIO->JAI->Java3D......
Enterprise类
JDBC->JDO->Servlet->JSP->EJB->JMS->JTA,JTS........
用applet去请求servlet servlet请求sessionBean sessionBean调用实体bean
"开始时步履维艰,我边上没有学java的,遇到问题只能靠自己,有时候遇到一个问题可能会“卡“上好几天,真的是巨郁闷!最后好多问题都只的绕道而行......."
55555----大家一样啊
同是天涯命苦人,.......(后面一句就不用说了)
虽说这样培养了独立思考的能力,但必竞“百日之所思不如一日之所学”啊
现在虽然找到了一点点路子,但要想继续深造,不结实几个同道中人还是不行呀。
my QQ :66459723
我现在正在学习java,你的经验对我来说大珍贵了,非常值得我学习,衷心地谢谢你!
调用构造方法遵循的一些规则1 从一个类创建对象时,可以调用此类的父类构造方法。调用父类的构造方法很容易,只要在类的构造方法的方法体中,第一条为super语句就可以了,super可以调用父类的任何一个带入口参数或不带入口的参数的构造方法。2 如果一个类的构造方法中第一个语句没有用super来调用其父类的构造方法,则编译器也会默认为在构造方法中,用super()语句调用父类的不带参数的构造方法。但是假如此时父类中的所有构造方法都 是必须带有入口参数的,那就会使编译出错。3 如果某个类的构造方法第一个语句是用this来调用的另一个构造方法。那么java系统就不会再默认为这个构造方法调用父类的构造方法。4 一个构造方法用this 语句调用本类的另一个构造方法时,如果被调用的构造方法又是调用父类的构造方法而又没有用super语句,那么java编译器会默认它含有super()语句。此时,如父类中不存在不带参数的构造方法,则将使编译出错。
此线程正在调用这个对象的方法,另一种是此线程调用了wait()方法。3 当一个线程从一个同步方法调用返回时,或者调用wait()方法时,其他线程就可以访问此对象。4 作为总的原则,系统总是使队列中拥用最高优先级的线程获得运行机会。5 如果一个线程由于调用wait()方法而进入等待队列,那么,它必须由别的线程通过调用notity()方法
来唤醒它,才能安排它重新执行。当然,上面列出的几个原则有些繁杂,但在实际处理中其实很简单,只要按照下列三条规则去做就可以了。1 如果两个或多个线程修改一个对象,那么将执行修改操作的方法用关键字synochronized定义为同步方法。2 如果一个线程必须等待某个对象的状态被改变,那么此线程应在对象队列中等待,这种等待是通过
进入同步方法或者调用wait()方法来实现的。3 每当一个方法修改了某个对象的状态时,这个方法就应该再调用notify()方法,这样给那些外于等待
队列中的线程一个机会,使其能够检测环境是否已经发生改变,从而可使其重新运行。
通过具体项目实践发现问题,然后通过看书和上java论坛来解决问题,解决问题以后多思考一下自己的水平就提高了^_^
推荐看的书:Thinking in java
如果E文好可以多看看sun公司网站上的资料
Java核心技术(巻I,巻II都不错)
<<用实例学Java2>>(不比Thinking in Java差)
不要用IDE
其实不是好书就可以把所有概念讲的让人容易接受,我经常碰到一些不甚理解的概念,然后没有办法去翻阅若干本书才找到答案。以后再有什么不理解的我会问你们的。
我希望大家一起努力
Hodex我已经发信息了,我的QQ29441008
你是我的榜样gongqh21
你说得很对
我的第三条“3 大量的实践”,也正好提到了这一点
Thinking in java
Java核心技术(巻I,巻II都不错)
<<用实例学Java2>>(不比Thinking in Java差)
我只看完了 java核心技术卷一
二还没看
我觉得可以结合着英文版一起看!
给个地址
在哪下,我也不知道。
其实java.sun.com上面本身就有很多好书和资料
希望大家能多照顾照顾!!!