Java程序员就业前景
Java程序员是美国SUN公司国际认证的程序员,她是目前全球最受重视、最受欢迎的程序员资格认证之一,具备这一认证就可以获得极好的工作机会和丰厚待遇。
Java程序员是美国SUN公司国际认证的程序员,她是目前全球最受重视、最受欢迎的程序员资格认证之一,具备这一认证就可以获得极好的工作机会和丰厚待遇。
Java跨平台等许多特性使之成为当代成长最快的软件产品:它受到了大约150个许可证颁发机构、200所大学和50万开发者的拥戴;1000多个应用程序是用它编写的;有关它的书籍有800余种;Java开发套件的下载次数超过一百万次;Java BEANS? 开发套件的下载次数超过10万次;受到了全球所有主要计算机厂商的支持,而这一切都发生在其发表后的800天内;Java闯入企业计算的心脏正成为大众传媒舆论的推动力量,正在改变企业的计算环境。它通过为因特网商务提供安全和稳健平台的方式改变商业自身。Java计算是各行各业中倍受信赖的企业解决方案。独立于平台的Java计算环境可以降低企业的总成本,缩短产品上市周期,安全地扩展公司的网络。不少国家到中国寻求合作伙伴时,都把能否用Java进行编程作为合作的前提条件。
当前世界各地持有Java Programmer证书的人员供需差距极大,迫使企业不得不用高薪聘请Java程序员。因此,Java Programmer的含金量比一般的技术人员要高出很大一块。在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,持有Java Programmer认证证书的人年薪均在4-10万美金,而在国内持有Java Programmer认证的程序员也有极好的工作机会和很高的薪水。
Struts安装配置
1、Struts的安装比较简单,下面的以Tomcat 4.1.24为例,讲述安装过程。
首先请到http://jakarta.apache.org/Struts下载Struts,建议使用release版,现在最高版本为1.1,下载后得到的是一个ZIP文件。 将ZIP包解开,可以看到这个目录:lib和Webapps,webapps下有一些WAR文件。 假设你的Tomcat装在c:\Tomcat下,则将那些WAR文件拷贝到C:\Tomcat\webapps,重新启动Tomcat即可。 打开浏览器,在地址栏中输入:http://localhost:8080/Struts-example/index.JSP,若能见到“powered by Struts”的深蓝色图标,即说明成功了。这是Struts自带的一个例子,附有详细的说明文档,可以做为初学者的入门教程。
另外,Struts还提供了一系统实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息等
2、关于Struts配置,由于我是采用JBuilder9为开发工具,这里主要说一下Struts在Jbuilder中配置:Jbuilder本身自带已经集成了Struts1.0,但目前的开发大部分都是在Struts1.1下,所以下面就介绍Struts1.1在Jbuilder中的配置:
1、下载
jakarta-struts-1.1.zip 包;jakarta-struts-1.1-src.zip包
2、将jakarta-struts-1.1.zip包解压到C:\JBuilder9\thirdparty目录下
jakarta-struts-1.1-src.zip包解压到C:\JBuilder9\extras目录下
3、启动jbuilder9
4、配置Library
(1)选择菜单 tools\Configure Libraries
(2)新建一个Library
(3)在New Library Wizard对话框中,
Name 输入:struts1.1,
location可选:User Home,
Library paths:add加入C:\JBuilder9\thirdparty\jakarta-struts-1.1\lib\struts.jar
(4)确定创建Library
(5)选中struts1.1,修改Library Settings
Class:C:\JBuilder9\thirdparty\jakarta-struts-1.1\lib\struts.jar
Source:C:\JBuilder9\extras\jakarta-struts-1.1-src\src\share
DocumentationC:\JBuilder9\thirdparty\jakarta-struts-1.1\webapps\struts-documentation.war\api
Required Library:空
Framework:在Framework下拉框中,选择struts,会自动出现6个taglib。
struts-bean
struts-html
struts-logic
struts-template
struts-tiles
struts-nested
(6)点击OK,创建Library成功。
关于在其他工具上的配置,如Eclipse 网上有很多资料。
Struts学习傻瓜式入门篇
或许有人觉得struts不容易学,似乎里面的一些概念让未接触过的人迷惑,MVC1、MVC2、模式……我写这篇文章是想让从来没有接触过struts的人,能有个简单的入门指引,当然,系统地学习struts是必要的,里面有很多让人心醉的东东,那是后话了。
该案例包括首页,用户登陆、网站向导页面。就这么简单,没有深奥的struts概念,主要靠动手,然后用心体会。
WEB Server用tomcat4。到http://jakarta.apache.org下载struts1.1,把zip文件释放到c:\struts,拷贝C:\struts\webapps\struts-example.war到c:\ tomcat4\webapps中,启动tomcat,war包被释放为struts-example文件夹,删除war包,把struts- example文件夹更名为test。
一、把WEB-INF\web.xml改成:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<!—这是struts中的Controller(控制器),系统的指令中转由其,既 ActionServlet 类负责,它从struts-config.xml中读取配置信息,并在服务器后台自动启动一个线程。如果没有特别的要求(如添加语言编转功能),程序员可以不管这部分,照用就可以了。–>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!–该系统的servlet可以映射成cool为后缀的文件,而不是常见的.jspdo等,后缀名可以改成任何名称,当然名字要健康#◎¥%!–>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.cool</url-pattern>
</servlet-mapping>
<!–该系统的默认首页是index.jsp,可以有多个,系统按次序找,类似IIS–>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、把test\WEB-INF\ struts-config.xml改成:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<!–FormBean是struts的一个概念,本质是JavaBean,用来自动存储页面表单中各个域的值,并在适当的时候回填表单域,不需要象传统那样request.getParameter(“fieldName”);,常被 action-mappings中的action 使用–>
<form-beans>
<!—稍后我们会新增一个UserForm类,用来存储用户信息。–>
<form-bean name="userForm" type="test.UserForm"/>
</form-beans>
<! –这里存放整个系统都可以使用的全局转向中转(Forward)地址,类似于javascript中的window.location (‘index.jsp’);,也类似于电视控制器上的各种按钮,可以转频道、调色等等是基于Struts的Web应用的控制流程流转。一般情况下,一个 Action处理完毕后,会转发到一个JSP页面进行显示。这也是JSP中的MVC的实现的要点。–>
<global-forwards>
<!–failed.cool将被当成servlet请求,到action-mappings中寻找对应的action处理。–>
<forward name="failed" path="/failed.cool"/>
<forward name="regist" path="/regist.jsp"/>
</global-forwards>
<!–还记得web.xml中后缀为cool的请求吗?它们是转到这里处理的。这里相当于struts的Model部分,Model部分是struts中比较灵活的地方。–>
<action-mappings>
<!–处理regist.cools的请求,使用的FormBean是userForm,既test.UserForm类,当处理过程发生错误时将返回index.jsp–>
<action path="/regist" type="test.RegistAction" name="userForm" scope="request" input="/index.jsp" />
<action path="/overview" forward="/hello.jsp"/>
<action path="/failed" forward="/wuwu.jsp" />
</action-mappings>
</struts-config>
三、增加一个FormBean,类路径为test.UserForm,以下是这个类的内容:
package test;
import org.apache.struts.action.ActionForm;
public class UserForm extends ActionForm
{
private String name="lpw";//用户名
private String ps="1111";//密码
public UserForm(){}
public void setName(String s) {name=s;}
public String getName() {return name;}
public void setPs(String s) {ps=s;}
public String getPs() {return ps;}
}
四、增加一个Action的子类,类路径为test. RegistAction,以下是这个类的内容:
package test;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import test.UserForm;
public final class RegistAction extends Action
{
public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
HttpSession session = request.getSession();
UserForm userform = (UserForm) form;
//此处可以调用其他类来执行数据库写入或其他逻辑判断
// 如果UserForm传来的参数name的值为默认的lpw,将forward到failed,
// 该名称将到struts-config.xml的<global-forwards>中寻找映射的url地址
// (可以是绝对路径,也可以是相对路径),对于本例,是转到failed.cool,
// 还记得吗?后缀为cool的请求全部到action-mappings中寻找
// 对应的action处理,最终目录是wuwu.jsp*/
if( "lpw".equals(userform.getName()) )
return (mapping.findForward("failed"));
els
e
return (mapping.findForward("regist"));
}
}
五、以下所有新增或修改的页面相当于struts的View部分,把首页index.jsp改成:
<%@ page contentType="text/html;charset=GBK" language="java" %>
<%@ page import = "test.*" %>
<a href="overview.cool">站点导航</a><br>
<form action="regist.cool" method="post">
<!—表单中的域的名称要和UserForm中的参数一样,就可以实现数据自动获取功能,不需要用request.getParameter(“param”);–>
用户:<input type="text" name="name"><br>
密码:<input type="password" name="ps"><br>
<input type=submit value="新增用户">
</form>
六、增加hello.jsp,用于站点导航:
<h1>site map</h1>The following is content filling by reader
七、增加wuwu.jsp,当没有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html;charset=GBK" language="java" %>
<jsp:useBean id="beanlpw" class="test.UserForm" scope="session"/>
现有用户:<%=beanlpw.getName()%><br>
密码:<%=beanlpw.getPs()%><br>
没有得到新的用户!
八、增加regist.jsp,当有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html;charset=GBK" language="java" %>
<jsp:useBean id="beanlpw" class="test.UserForm" scope="session"/>
新用户帐号:<%=beanlpw.getName()%><br>
密码:<%=beanlpw.getPs()%>
九、启动tomcat4,浏览器中键入http://localhost:8080/test/index.jsp,操作一下,就可以看到结果,并初步理解struts的M、V、C各部分的协同工作原理,当然这是作者的良好意愿,如果读者看得一头雾水,欢迎指出错误在哪里 :)
Java几个基础问题
1.String类和StringBuffer类
它们都是处理字符串的类,但是它们有一个最大的区别,那就是,String对象是存储你不能改动的文本字符
串,相反,如果你希望改动,则应使用StringBuffer类作为替换.
eg1:
……
//omit some code
String s1="You are hired!";
System.out.println(s1.replace('h','f'));//用f把字串中的h替换了
System.out.println(s1);
……
//omit some code
运行结果:
You are fired!
You are hired!
结果分析:
从结果,明显可知,s1的值并没有被改变,而第一行结果只是屏幕内容的替换.
eg2:
……
//omit some code
StringBuffer s2=new StringBuffer("Hello from Java!");
s2.replace(6,10,"to");
System.out.println(s2);
……
//omit some code
运行结果:
Hello to Java!
结果分析:
显然,s2的值已改变.
2.位逻辑与条件逻辑
首先声明, 为了与位逻辑更好区分开来,我把通常所说的逻辑取了个别名叫做条件逻辑.它们都有各自的操作符,位逻辑操作符有:&(与运算),^(异或运算),|(或运算);条件逻辑操作符有:&&(并且),||(或者).位逻辑运算通常是针对两个数而言,实行位操作;而条件逻辑运算是针对两个条件表达式而言,实行条件操作.其实,位逻辑操作符一样可以实现条件操作,但是此时有一个重要的区别:用位操作符时,不管操作符两边的条件表达式成不成立,它都要通通进行运算判断,而条件逻辑操作符不一样了,如果通过左侧的操作数就可以进行它们需要的判断,那么它就不会再计算右侧的操作数了,这种情况叫短路.废话少说!且看下例.
eg1:
……
//omit some code
double value=0;
if(value!=0 && 1/value<1000){
System.out.println("The value is not too small.");
}
else{
System.out.println("The value is too small.");
}
……
//omit some code
运行结果:
The value is too small.
结果分析:
照理说应会出现除数为0的错误,但是我刚才说了,由于条件逻辑操作符是短路操作符,显然,value!=0不成立,立即就可作出判断应执行else后的语句,所以它就不再会运算判断1/value<1000了.如果不懂请再看一例:
eg2:
……
//omit some code
double int1=0,int2=1,int3=1;
if(int1!=0 & (int2=2)==1){}
System.out.println("int2="+int2);
if(int1!=0 && (int3=2)==1){}
System.out.println("int3="+int3);
……
//omit some code
运行结果:
int2=2.0
int3=1.0
结果分析:
我想不用我分析了,你应该懂了吧.
3.实例变量与类变量
可以通过两种方法在类中存储数据───作为实例变量和类变量.实例变量是特定于对象的,如果你有两个对象(即一个类的两个实例),每一个对象中的实例变量独立于另一个对象中的实例变量的;另一方面,两个对象的类变量均指向相同的数据,并因此面保存相同的值,换句话说,类变量被类中的所有对象共享.差点忘了,它们在形式上的区别,类变量在声明时比实例变量多一个static.
eg:
class data
{
public int intdata=0;//显然,intdata在这儿是实例变量
}
public class exam
{
public static void main(String[] args)
{
data a,b;
a=new data();
b=new data();
a.intdata=1;
System.out.println("b.indata="+b.intdata);
}
}
运行结果:
b.intdata=0
结果分析:
可以看出,a.intdata的值虽然变了,但并没有影响b.intdata.但是如果在data类中声明intdata时,在其前面加上static就变成类变量了(即:public static int intdata=0;),则此时运行结果会变为:b.intdata=1这次a.intdata值的改变可把b.intdata影响了,事实上,对象a和b的类变量均指向相同的数据,所有值一样,这就是类变量的作用.
4.实例方法,类方法,构造器方法
我们通常所说的方法系指实例方法,就像c语言中的函数一样,其具体方法我就不用说了,在这里我主要是用它来区分类方法和构造器方法.类方法与实例方法最大的区别是:在形式上类方法多一个static,在用法上,不必创建对象就可直接调用类方法(而实例方法却一定要先创建对象,再通过对象调用).
eg:
class add
{
static int addem(int op1,int op2)
{
return op1+op2;
}
}
public class xxf
{
public static void main(String[] args)
{
System.out.println("addem(2,2)="+add.addem(2,2));
} //直接用类名作为对象调用类方法
}
注: 也可按通常的方法,即先创建对象,再调用方法,不过,这时static就无任何意义了.再说说构造器方法,它是用来初始化对象中的数据的一种方法,创建很容易,只需在类中加上一个与这个类同名的方法,不需要在前面加任何访问说明符或者返回类型,另外,构造器也一样可以向方法一样传递参数.
eg:
class data
{
private String data1;//事先声明
data(String s)
{
data1=s; /*通过接收数据来初始化变量.(注:不能在构造器内
声明变量,事先在外就要声明.)*/
}
public String getdata()
{
return data1;
}
}
public class xxf
{
public static void main(String[] args)
{
System.out.println((new data("I love you")).getdata());/*通过传递参数调用构造器新建一
个对象,再通过对象调用方法得到数据*/
}
}
5.接口与类
类是对一类特定对象的规格说明,我们可以类定义创建对象,通过创建对象来组合所有属于该类的组件,而接口不能这样做.而接口实质上就是一个常量和抽象方法的集合,要使用一个接口,就需要在类中实现这个接口,然后作为类定义的一部分,编写接口中声明的每一个方法,接口中的方法永远是public,abstract,接口中的常量永远是public static和final,因此不需要为它们说明属性.因为在Java中不支持多重继承,但是,可以用接口来实现类似的功能,这是接口的重要作用之一.
eg:
r />interface anyone //定义一个接口
{
final double PI=3.1416;
void setNumber(int number);
int getNumber();
}
interface anyother //定义另一个接口
{
void setString(String str);
String getString();
}
class xxf implement anyone,anyother //定义一个类,并使用两个接口
{
int number;
String str;
public xxf(){}
void setNumber(int number)
{
this.number=number;
}
void setString(String str)
{
this.str=str;
}
void int getNumber(){}//可以为一个空实现.
void String getString(){}
}
//在类中必须实现接口中声明的所有方法.(当然也可不必,但是要用到适配器类或用抽象类)
用java实现RSA算法
1 RSA算法的原理如下:
1.1原理
假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个Key,我们称之为密匙private_key,将这个可KEY始终保存在机器B中而不发出来;然后,由这个private_key计算出另一个Key,我们称之为公匙Public_key。这个Public_key的特性是几乎不可能通过该Key计算生成它的private_key。接下来通过网络把这个Public_key传给机器A,
机器A受到Public_key后,利用该key,将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的private_key,就可以解开加密信息。
1.2步骤
RSA算法的安全性依赖于大数因数分解的困难性。公匙和私匙都是两个大素数的函数。
1.2.1 首先选择两个大素数p、q,计算n=p*q; m=(p-1)*(q-1);
1.2.2 而后随机选择加密密匙Public_key,要求和m互质,比如Public_key=m-1;
1.2.3 利用欧几里德算法计算解密密匙private_key,使private_key满足
Public_key*private_key三1(mod m)
其中Public_key,n是公匙,private_key是密匙
1.2.4 加密信息text时,利用公式secretword=text^Public_key (mod n)得到密文secretword
1.2.5 解密时利用公式word=text^private_key(mod n)得到原文word=text.。
2程序
本算法用JAVA编程语言实现,开发环境为Eclipse
//BJTU 软件0404
import java.io.*;
public class Rsa
{
private int p=0;
private int q=0;
private long n=0;
private long m=0;
private long public_key=0;//公匙
private long private_key=0;//密匙
private long text=0;//明文
private long secretword=0;//密文
private long word=0;//解密后明文
//判断是否为素数
public boolean primenumber(long t)
{
long k=0;
k=(long)Math.sqrt((double)t);
boolean flag=true;
outer:for(int i=2;i<=k;i++)
{
if((t%i)==0)
{
flag = false;
break outer;
}
}
return flag;
}
//输入PQ
public void inputPQ()throws Exception
{
do{
System.out.println("请输入素数p: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.p=Integer.parseInt(br);
}
while(!primenumber(this.p));
do{
System.out.println("请输入素数q: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.q=Integer.parseInt(br);
}
while(!primenumber(this.q));
this.n=this.p*this.q;
this.m=(p-1)*(q-1);
System.out.println("这两个素数的乘积为p*q:"+this.n);
System.out.println("所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):"+this.m);
}
//求最大公约数
public long gcd(long a,long b)
{
long gcd;
if(b==0)
gcd=a;
else
gcd=gcd(b,a%b);
System.out.println("gcd:"+gcd);
return gcd;
}
//输入公匙
public void getPublic_key()throws Exception
{
do{
System.out.println("请输入一个公钥的值,这个值要求小于m并且和m互质: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.public_key=Long.parseLong(br);
}while((this.public_key >= this.m) || (this.gcd(this.m,this.public_key)!=1));
System.out.println("公钥为:"+this.public_key);
}
//计算得到密匙
public void getPrivate_key()
{
long value=1;
outer:for(long i=1;;i++)
{
value=i*this.m+1;
System.out.println("value: "+value);
 
; if((value%this.public_key==0)&& (value/this.public_key < this.m))
{
this.private_key=value/this.public_key;
break outer;
}
}
System.out.println("产生的一个私钥为:"+this.private_key);
}
//输入明文
public void getText()throws Exception
{
System.out.println("请输入明文:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.text=Long.parseLong(br);
}
//加密、解密计算
public long colum(long y,long n,long key)
{
long mul;
if(key==1)
mul=y%n;
else
mul=y*this.colum(y,n,key-1)%n;
return mul;
}
//加密后解密
public void pascolum()throws Exception
{
this.getText();
System.out.println("输入明文为: "+this.text);
//加密
this.secretword=this.colum(this.text,this.n,this.public_key);
System.out.println("所得的密文为:"+this.secretword);
//解密
this.word=this.colum(this.secretword,this.n,this.private_key);
System.out.println("解密后所得的明文为:"+this.word);
}
public static void main(String []args)throws Exception
{
Rsa t = new Rsa();
t.inputPQ();
t.getPublic_key();
t.getPrivate_key();
t.pascolum();
}
}
3试验介绍
2.1输入PQ,计算m、n
3.2输入公匙,产生密匙
3.3输入明文,产生密文,并解密
此处时间限制,明文暂时用个数字代替,有兴趣的可以改变程序,变成一段数字
请输入素数p:
23
请输入素数q:
29
这两个素数的乘积为p*q:667
所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):616
请输入一个公钥的值,这个值要求小于m并且和m互质:
611
gcd:1
gcd:1
gcd:1
gcd:1
公钥为:611
产生的一个私钥为:123
请输入明文:
311
输入明文为: 311
所得的密文为:653
解密后所得的明文为:311
JAVA+ACCESS编程体会
下午花了点时间,体会了下java&access的编程。实际上,是公司需要整合两个异质系统的数据。数据库一个采用ms的sql server,另一个是access。其实对于数据表的操作,免不了总是程序里面一个重要的步骤。之前,公司一直用sql server,数据库的访问操作都是用javabean进行封装好的,而且,大部分的公司实际上也都是这么做的。
就编程来讲,对于sql server,微软提供了专门的jdbc驱动程序,也就是大家平常用的那三个jar文件。但access的编程可没那么豪华,现在可用的编程方法,只是提供一个jdbc-odbc桥接器进行连接,效率就不用说了哦。
大概过程也略略罗嗦一下:
1,创建制定数据库的URL:同时配置access数据源
如: String url = "jdbc:odbc:Oblog";
2,加载驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
3,创建连接
Connection conn = DriverManager.getConnection(url, "user", "pwd");
4,创建sql语句对象
Statement stmt = conn.createStatement();
5,执行sql语句
stmt.execute(strSql.toString());
干脆贴个例子:
//Select.java
import java.sql.*;
class Select{
public static void main(){
try{
String url = "jdbc:odbc:wombat";
Connection conn = DriverManager.getConnection(url,"user","pwd");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Table1");
System.out.println("Got ResultSet Now");
rs.beforeFirst();
while(rs.next()){
System.out.println(rs.getString(1));
}
stmt.close();
conn.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
Java学习过程应该深入理解的一些重点
主要说说Java的几大块吧,无法说得很细,因为其实每一块拿出来都能说很多,我就说一下这几块学习的时候的重点或者应该注意的东西。
数值类型:
虽然是面向对象的语言,但是在使用上数值类型还是必不可少的,如果在C的学习中已经掌握了C的数值计算和转换规则,那我想这里应该没有什么问题,只有两点需要注意:1、14.0这样的浮点常量被认为是double型,只有加上f后缀才是float型的;2、整数常量说起来被认为是int型,但是在编译时,可以认为编译器将其看作能表示该数的最小数值,因此byte b = 100;不会报错。
引用类型:
我也是从C/C++转过来的,其实所谓引用类型在C++中已有体现,就是传参的时候有一种引用类型,从C来考虑,它就是一个指针,只不过,我们不能对它进行指针上的硬操作。所以这里的重点是:1、Java里所有的对象都是在堆中生成的,所以需要类似指针的东西指向它,那就是引用;2、我们通过引用操作的是引用所指向的对象,除了赋值操作外,应该就没有什么操作是针对引用本身的了,这一点是C的指针与Java的引用区别所在。
类和对象:
这是一个大块,有很多东西,不展开讲了,就说几个重点:1、类方法、类属性与成员方法、成员属性在加载、初始化、使用上的异同;2、在构造函数中,this()和super()的用法;3、子类的加载过程、初始化过程和构造过程;4、方法的重载和覆写;5、覆写所引出的多态问题。(注意:多态之应用在方法上,对属性没有作用)
函数调用的参数传递:
如果把引用类型所记录的地址值,就看作是引用类型变量的值的话,那么,Java的所有方法调用的时候,都是采用的值传递??数值类型传数值,引用类型传地址。
IO流:
与C比起来,Java的输入输出,尤其是输入是非常麻烦的,也许是因为出于面向对象的考虑吧?不知道。Java提供了很多的IO流,但是我们并不必将各种IO都搞清楚,我们只需要了解字节流与字符流各有什么功能,字符流是如何在字节流之上构造的,几乎所有的字符流构造的时候都是建立在一个已有的字节流的基础上的,并且它的这种设计使得我们可以像套管子一样,将IO流一节一节套起来,直到得到我们想使用的IO对象(例:BufferedReader的使用)。在我们以后使用的时候,我们可以再去查API,我觉得主要要看的几个类是:FileReader、FileWriter、BufferedReader,再配合上System.out对象,对于文本的输入、输出来说,就足够用了,至于其他的,我觉得不考试的话,没有必要看那么多,用的时候再看了。(我使用Java一年半来,基本上就在使用BufferedReader和System.out)
容器:
个人认为,这是Java编程的一大利器,我最爱用的类是:ArrayList(List)作为可变长数组、HashMap(Map)用来建立查找表,Set我很少用,只在HashMap的使用中连带用过一些。通过对这两个类的熟悉,能够将List、Set和Map三大类的基本用法掌握。另外它的几个辅助类要掌握:Iterator和Collections。Collections类提供容器的一些通用工具,比如排序。而说到排序,就牵扯出了比较器:Comparator。能够熟练使用Comparator类,可以让你为自己的需求和自己的类定制排序方案。
AWT和SWING:
个人认为,Java在图形界面的制作上有着非常好的封装性,我以前曾经试图学过MFC,MFC在生成图形界面的时候会帮助你生成一些代码,然后让你在这些代码的指定位置添加代码以实现功能,我这个人有个习惯,如果让我看到了一些东西,那么我不搞清除为什么这么写,就不会往下走,看到那许多代码,自然就想弄清楚那些是什么,结果引出来好多知识,后来我才知道其中有些是调用WinAPI,结果我到现在还是不会用MFC。这里并不是贬低MFC,我相信MFC有其过人之处,只不过个人认为它的封装性做得不好,暴露出了太多东西,也许能够提高灵活性,不过,可能我跟它无缘:(。在这方面Java就做得不错,给你一个类,你用就是了,它将图形界面的低层实现隐藏的很好,将其作为一个对象给你,而你只需要在这个对象上修修改改,挺方便的。
作为初学者,我觉得AWT的重点在于它的几个Listener的用法,还有布局格式,然后就是那许多的Component的用处和用法。(不过,我觉得,等到用的时候再去找合适的Component进行学习应该也不算太迟 ^_^)
不过,因为我个人使用的原因,所以至今AWT和SWING都用得很少,所以这方面也就不便多说了,抱歉。写这些并不是告诉大家怎么解决问题,因为每一个都有很多可写,只是希望能给初学者一点参考,希望能够帮助初学者们有的放矢地看书。

