java学习需要什么基础
随着java这种语言的广泛运用,越来越多从事开发的人员开始学习接触这门课程,那么,java学习需要什么基础?java刚刚入门应该接触哪些知识呢?java入门应该学习什么内容呢?
首先要说明的,java有三个大的方向(j2se,j2me,j2ee),走不同的方向可能学的技术和要花费的时间可能有所不同。我是搞www.bsmz.neto
{
public static void main(string[] args)
{
int x= 7;
//逻辑运算符用于连接boolean类型的表达式。
//x>3 & x<6 = true & true = true;
/*
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& : 只要两边的boolean表达式结果,有一个为false。那么结果就是false。只有两边都为true,结果为true。
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| : 两边只要有一个为true,结果为true。
只有两边都有false,结果为false。
^ : 异或;就是和|有点不一样。当true ^ true = false;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^ : 两边相同结果是false。
两边不同结果是true。
&和&&的特点:
&:无论左边是true是false。右边都运算。
&&:当左边为false时,右边不运算。
|:两边都参与运算。
||:当左边为true。右边不运算。
int n = 3,m = 8;
system.out.println("n="+n+",m="+m);
1,通过第三方变量。
/*int temp; temp = n; n = m; m = temp;
2不用第三方变量。
11 = 3 +8; 3 = 11 - 8; 8 = 11 - 3; n = n + m;//如果n和m的值非常大,容易超出int范围。 m = n - m;
3.用^来交换
}
} n = n - m; n = n ^ m; m = n ^ m;//(n^m)^m; n = n ^ m;//n ^ (n ^ m) system.out.println("n="+n+",m="+m);
if和swww.bsmz.netport =”java.util.*” %>;
session可以不赋值,默认为true,如果session=”false”,则在jsp页面中,隐含的变量session就不能使用。
3. 请求控制器结构(request controller)
也被称之为jsp model 2 architecture
这种途径涉及到使用一个servlet或一个jsp作为一个应用程序或一组页面的入口点。
为创建可维护的jsp系统,request controller是最有用的方式之一。
不是jsp,而是java类才是放置控制逻辑的正确的地方。
请求控制器的命名模式为: xxxcontroller.jsp
请求控制器类的命名模式为: xxxrequestcontroller
2.jsp中的javabean
jsp三种bean的类型
1) 页面bean
2) 会话bean
3) 应用bean
大多数的系统会使用一个会话bean来保持状态,而对每一个页面使用一个页面bean 来对复杂的数据进行表示。
页面bean是一个模型,而jsp是一个视图。
3.custom tag
bean是信息的携带者,
而tag更适用于处理信息。
标记库包含一个标记库描述符(tld)和用于实现custom tag的java类
在翻译阶段,jsp容器将使用tld来验证页面中的所有的tag是否都被正确的使用。
标记处理程序只是一个简单的适配器,而真正的逻辑是在另一个类中实现的,标记处理程序只是提供了一个供其他的可复用的类的jsp接口
servlet
1.servletconfig
 一个servletconfig对象是servlet container在servlet initialization的时候传递给servlet的。
servletconfig包涵 servletcontext 和 一些 name/value pair (来自于deployment descriptor)
 servletcontext接口封装了www.bsmz.netl就是www.bsmz.netl
1.xml基础知识
1. 一个xml文档可以分成两个基本部分:
首部( header )
内容( content )
2. xml名字空间规范中指定:
xml文档中的每一个元素都处在一个名字空间中;如果没有指定的名字空间,缺省的名字空间就是和该元素相关联的名字空间。
3. a document that is www.bsmz.netl.sax.reader
/|
org.xm.l.sax.xmlreader
/|
org.apche.xerces.parsers.saxparser
2.www.bsmz.netlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/www.bsmz.netlschema">;
<element name="tradepricerequest">;
<complextype>;
<all>;
<element name="tickersymbol" type="string"/>;
</all>;
</complextype>;
</element>;
<element name="tradeprice">;
<complextype>;
<all>;
<element name="price" type="float"/>;
</all>;
</complextype>;
</element>;
</schema>;
</types>;
<message name="getlasttradepriceinput">;
<part name="body" element="xsd1:tradepricerequest"/>;
</message>;
<message name="getlasttradepriceoutput">;
<part name="body" element="xsd1:tradeprice"/>;
</message>;
<porttype name="stockquoteporttype">;
<operation name="getlasttradeprice">;
<input message="tns:getlasttradepriceinput"/>;
<output message="tns:getlasttradepriceoutput"/>;
</operation>;
</porttype>;
<binding name="stockquotesoapbinding"
type="tns:stockquoteporttype">;
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>;
<operation name="getlasttradeprice">;
<soap:operation
soapaction="http://example.com/getlasttradeprice"/>;
<input>;
<soap:body use="literal"/>;
</input>;
<output>;
<soap:body use="literal"/>;
</output>;
</operation>;
</binding>;
<service name="stockquoteservice">;
<documentation>;my first service</documentation>;
<port name="stockquoteport" binding="tns:stockquotebinding">;
<soap:address location="http://example.com/stockquote"/>;
</port>;
</service>;
</definitions>;
它包含了以下的关键信息:
消息的描述和格式定义可以通过xml文档中的<types>;和<message>; 标记来传送。
<porttype>; 标记中表示了消息传送机制。 (e.g. request-only, request-response, response-only) 。
<binding>; 标记指定了编码的规范 。
<service>; 标记中表示服务所处的位置 (url)。
www.bsmz.neti客户并且可以和容器所管理的环境外面的代码进行通讯。
6.使用映象api查询ejb组件由于安全规则所不能访问的类。这个约束加强了java平台的安全性。
7.欲创建或获得一个类的加载器,设置或创建一个新的安全管理器,停止java虚拟机,改变输入、输出和出错流。这个约束加强了安全性同时保留了ejb容器管理运行环境的能力。
8.设置socket工厂被url's serversocket,socket和stream handler使用。避免这个特点,可以加强安全性同时保留了ejb容器管理运行环境的能力。
9.使用任何方法启动、停止和管理线程。这个约束消除了与ejb容器管理死锁、线程
和并发问题的责任相冲突的可能性。
通过限制使用10-16几个特点,你的目标是堵上一个潜在的安全漏洞:
10.直接读写文件描述符。
11.为一段特定的代码获得安全策略信息。
12.加载原始的类库。
13.访问java一般角色所不能访问的包和类。
14.在包中定义一个类。
15.访问或修改安全配置对象(策略、安全、提供者、签名者和实体)。
16.使用java序列化特点中的细分类和对象替代。
17.传递this引用指针作为一个参数或者作为返回值返回this引用指针。你必须使用
sessioncontext或entitycontext中的getejbobject()的结果。
java2平台的安全策略
以上所列的特点事实上正是java编程语言和java2标准版中的标准的、强有力的特色。ejb容器允许从j2se中使用一些或全部的受限制的特色,尽管对于ejb组件是不可用的,但需通过j2se的安全机制来使用而不是通过直接使用j2se的api。
java2平台为ejb1.1规范中的ejb容器所制定的安全策略定义了安全许可集,这些许可在ejb组件的编程限制中出现。通过这个策略,定义了一些许可诸如:java.io.filepermission,java.net.netpermission,java.io.reflect.reflectpermission,java.lang.security.securitypermission,以便加强先前所列出的编程限制。
许多ejb容器没有加强这些限制,他们希望ejb组件开发者能遵守这些编程限制或者是带有冒险想法违背了这些限制。违背这些限制的ejb组件,比标准方法依赖过多或过少的安全许可,都将很少能在多个ejb容器间移植。另外,代码中都将隐藏着一些不确定的、难以预测的问题。所有这些都足以使ejb组件开发者应该知道这些编程限制,同时也应该认真地遵守它们。
任何违背了这些编程限制的ejb组件的实现代码在编译时都不能检查出来,因为这些特点都是java语言和j2se中不可缺少的部分。
对于ejb组件的这些限制同样适用于ejb组件所使用的帮助/访问(helper/access)类,j2ee应用程序使用java文档(jar)文件格式打包到一个带.ear(代表enterprise archive)扩展名的文件中,这个ear文件对于发送给文件部署器来说是标准的格式。ear文件中包括在一个或多个ejb-jar文件中的ejb组件,还可能有ejb-jar所依赖的库文件。所有ear文件中的代码都是经过深思熟虑开发的应用程序并且都遵守编程限制和访问许可集。
未来版本的规范可能会指定通过部署工具来定制安全许可的能力,通过这种方法指定了一个合法的组件应授予的许可权限,也指定了一个标准方法的需求:如从文件系统中读文件应有哪些要求。一些ejb容器/服务器目前在它们的部署工具中都提供了比标准权限或多或少的许可权限,这些并不是ejb1.1规范中所需要的。
理解这些约束
ejb容器是ejb组件生存和执行的运行期环境,ejb容器为ejb组件实例提供了一些服务如:事务管理、安全持久化、资源访问、客户端连接。ejb容器也负责ejb组件实例整个生命期的管理、扩展问题以及并发处理。所以,ejb组件就这样寄居在一个被管理的执行环境中--即ejb容器。
因为ejb容器完全负责ejb组件的生命期、并发处理、资源访问、安全等等,所以与容器本身的锁定和并发管理相冲突的可能性就需要消除,许多限制都需要使用来填上潜在的安全漏洞。除了与ejb容器责任与安全冲突的问题,ejb组件还意味着仅仅聚焦于商务逻辑,它依赖于ejb容器所提供的服务而不是自己来直接解决底层的系统层的问题。
可能的问题
通常,ejb组件在容器之间的移植不可避免地与如下问题相关:
1.它需要依靠的受限制的特点在特定ejb容器中没有得到加强。
2.它需要依靠的非标准的服务从容器中可获得。
为了保证ejb组件的可移植性和一致的行为,你应该使用一个具有与java2平台安全
策略集相一致的策略集的容器来测试ejb组件,并且其加强了前述的编程限制。
总结
ejb组件开发者应该知道这些推荐的关于ejb组件的编程限制,明白它们的重要性,并且从组件的稳定性和可移植性利益方面考虑来遵循它们。因为这些编程限制能阻止你使用标准的java语言的特点,违背了这些编程限制在编译时不会知道,并且加强这些限制也不是ejb容器的责任。所有这些原因都使你应很小心地遵守这些编程限制,这些限制在组件的合同中已经成为了一个条款,并且它们对于建造可靠的、可移植的组件是非常重要的。
2. 优化ejb
entity bean为在应用程序和设计中描述持久化商业对象(persistent business objec ts)提供了一个清晰的模型。在java对象模型中,简单对象通常都是以一种简单的方式进行处理但是,很多商业对象所需要的事务化的持久性管理没有得到实现。entity bean将持久化机制封装在容器提供的服务里,并且隐藏了所有的复杂性。entity bean允许应用程序操纵他们就像处理一个一般的java对象应用。除了从调用代码中隐藏持久化的形式和机制外,entity bean还允许ejb容器对对象的持久化进行优化,保证数据存储具有开放性,灵活性,以及可部署性。在一些基于ejb技术的项目中,广泛的使用oo技术导致了对entity bean的大量使用,sun的工程师们已经积累了很多使用entity bean的经验,这篇文章就详细阐述的这些卡发经验:
*探索各种优化方法
*提供性能优化和提高适用性的法则和建议
*讨论如何避免一些教训。
法则1:只要可以,尽量使用cmp
cmp方式不仅减少了编码的工作量,而且在container中以及container产生的数据库访问代码中包括了许多优化的可能。container可以访问内存缓冲中的bean,这就允许它可以监视缓冲中的任何变化。这样的话就在事物没有提交之前,如果缓存的数据没有变化就不用写到数据库中。就可以避免许多不必要的数据库写操作。另外一个优化是在调用find方法的时候。通常情况下find方法需要进行以下数据库操作:
查找数据库中的纪录并且获得主键
将纪录数据装入缓存
cmp允许将这两步操作优化为一步就可以搞定。[具体怎么做我也没弄明白,原文没有具体阐述]
法则2:写代码时尽量保证对bmp和cmp都支持
许多情况下,ejb的开发者可能无法控制他们写的bean怎么样被部署,以及使用的container是不是支持cmp.
一个有效的解决方案是,将商业逻辑的编码完全和持久化机制分离。再cmp类中实现商业逻辑,然后再编写一个bmp类,用该类继承cmp类。这样的话,所有的商业逻辑都在cmp类中,而持久化机制在bmp中实现。[我觉得这种情况在实际工作中很少遇到,但是作者解决问题的思路值得学习]
法则3:把ejbstore中的数据库访问减小到最少。
如果使用bmp,设置一个缓存数据改变标志dirty非常有用。所有改变数据库中底层数据的操作,都要设置dirty,而在ejbstore()中,首先检测dirty的值,如果dirty的值没有改变,表明目前数据库中的数据与缓存的一致,就不必进行数据库操作了,反之,就要把缓存数据写入数据库。
法则4:总是将从lookup和find中获得的引用进行缓存。(cache)
引用缓存对session bean和entity bean 都是适用的。
通过jndi lookup获得ejb资源。比如datasource,bean的引用等等都要付出相当大的代价。因此应该避免多余的lookup.可以这样做:
将这些引用定义为实例变量。
从setentitycontext(session bean使用setsessioncontext)方法查找他们。setentitycontext方法对于一个bean实例只执行一次,所有的相关引用都在这一次中进行查找,这样查找的代价就不是那么昂贵了。应该避免在其他方法中查找引用。尤其是访问数据库的方法:ejbload()和ejbstore(),如果在这些频繁调用的方法中进行datasource的查找,势必造成时间的浪费。
调用其他entity bean的finder方法也是一种重量级的调用。多次调用finder()方法的代价非常高。如果这种引用不适合放在setentitycontext这样的初始化时执行的方法中执行,就应该在适当的时候缓存finder的执行结果。只是要注意的是,如果这个引用只对当前的entity有效,你就需要在bean从缓冲池中取出来代表另外一个实体时清除掉这些引用。,这些操作应该在ejbactivate()中进行。
法则5:总是使用prepare statements
这条优化法则适用于所有访问关系数据库的操作。
数据库在处理每一个sql statement的时候,执行前都要对statement进行编译。一些数据库具有缓存statement和statement的编译后形式的功能。数据库可以把新的statement和缓存中的进行匹配。然而,如果要使用这一优化特性,新的statement要必须和缓存中的statement完全匹配。
对于non-prepared statement,数据和statement本身作为一个字符串传递,这样由于前后调用的数据不同而不能匹配,就导致无法使用这种优化。而对于prepared statement,数据和statement是分开传递给数据库的,这样statement就可以和cache中已编译的statement进行匹配。statement就不必每次都进行编译操作。从而使用该优化属性。
这项技术在一些小型的数据库访问中能够减少statement将近90%的执行时间。
法则6:完全关闭所有的statement
在编写bmp的数据库访问代码时,记住一定要在数据库访问调用之后关闭statement,因为每个打开的statement对应于数据库中的一个打开的游标。
security
1.加密
对称加密
(1)分组密码
(2)流密码
常用的对称加密算法:
des和tripledes
blowww.bsmz.netdash;—ssl(se cure socketslayer),并且已经几乎成为了目前www.bsmz.netanager,并且 logincontext 已经认证了一个带有名为“admin”的 com.ibm.resource.security.auth.principalexample 主体的 subject。
清单 4. 一个简单的授权请求
public class jaasexample {
public static void main(string[] args) {
...
// www.bsmz.netpleaction 类中。还要注意,调用类不要求为 jaasexampleaction 类代码源授予许可权,因为它实现了一个 privilegedaction。
扩展 jaas
大多数应用程序都有定制逻辑,它授权用户不仅仅在类上执行操作,而且还在该类的实例上执行操作。这种授权通常建立在用户和实例之间的关系上。这是 jaas 的一个小缺点。然而,幸运的是,这样设计 jaas 使得 jaas 可以扩展。只要做一点工作,我们将可以扩展 jaas,使其包含一个通用的、类实例级的授权框架。
在文章开头处我已经说明了,抽象类 javax.security.auth.policy 被用于代表 jaas 安全性策略。它的缺省实现是由 com.sun.security.auth.policyfile 类提供。policyfile 类从 jaas 格式的文件(象清单 3 中显示的那个一样)中读取策略。
我们需要向这个文件添加一个东西为类实例级授权扩展策略定义:一个与许可权语句相关的可选关系参数。
缺省 jaas 许可权语句的格式如下:
permission <permission implementation class>; [name], [actions];
我们在这个许可权语句的末尾添加一个可选的关系参数来完成策略定义。下面是新许可权语句的格式:
permission <permission implementation class>;
[name], [actions], [relationship];
在为类实例级授权扩展 jaas 时要注意的最重要的一点是:许可权实现类必须有一个带三个参数的构造函数。第一个参数是名称参数,第二个是行为参数,最后一个是关系参数。
解析新文件格式
既然文件格式已经改变,就需要一个新的 javax.security.auth.policy 子类来解析文件。
为简单起见,我们的示例使用了一个新的 javax.security.auth.policy 子类 com.ibm.resource.security.auth.xmlpolicyfile,来从 xml 文件读取策略。在实际的企业应用程序中,关系数据库更适合执行这个任务。
使用 xmlpolicyfile 类代替缺省的 jaas 访问控制策略实现的最容易的方法是向 java.security 属性文件添加 auth.policy.provider=com.ibm.resource.security.auth.xmlpolicyfile 条目。java.security 属性文件位于 java 2 平台运行时的 lib/security 目录下。清单 5 是与 xmlpolicyfile 类一起使用的样本 xml 策略文件:
清单 5. 一个 xml 策略文件
<?xml version="1.0"?>;
<policy>;
<grant codebase="file:/d:/sample_actions.jar">;
<principal classname=
"com.ibm.resource.security.auth.principalexample" name="users">;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="create" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="read" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="www.bsmz.netission"
name="com.ibm.security.sample.bid"
actions="accept"
relationship="actionowww.bsmz.netple.auction", "create");
accesscontroller.checkpermission(permission);
}
所有者关系
resourcepermission 类的 implies(permission p) 方法是这个框架的关键。implies() 方法就等同性比较名称和行为属性。如果定义了一个关系,那么必须把受保护的类实例(resource)传递到 resourcepermission 构造函数中。resourcepermission 类理解所有者关系。它将类实例的所有者与执行代码的 subject(用户)进行比较。特定关系被委托给受保护类的 fulfills() 方法。
例如,在清单 5 中所示的 xml 策略文件中,只有 auction 类实例的所有者可以更新(写)文件。该类的 setter 方法使用清单 6 中显示的保护代码:
清单 6. 运行中的 implies(permission) 方法
public void setname(string newww.bsmz.nete = newww.bsmz.nete().equals(auctionowww.bsmz.netple.jar
exampleactions.jar
resourcesecurity.jar 文件包含允许实例级访问控制的 jaas 扩展框架。它还包含一个 loginmoduleexample 类,这个类从 xml 文件读取用户认证信息。用户标识和密码存储在 users.xml 文件中。用户组存储在 groups.xml 文件中。关于 loginmoduleexample 的更多信息,请参阅参考资料部分。
该示例包含四个附加的文件:
login.conf
policy
resourcepolicy.xml
run.bat
在试图运行这个示例程序之前,请确保更新了 run.bat、policy 和 resourcepolicy.xml 文件中的路径。缺省情况下,所有的密码都是“passwww.bsmz.netanager)
每个java application都可以有自己地security manager,但是默认地java application没有一个security manager
可以通过下面地代码得到一个security manager
try
{
system.setsecuritymanager(newww.bsmz.nete%/jre/lib/ext/*.jar
如果光copy不ren为.jar是没有用的。
4. 事务处理
本地事务
java.sql.connection接口可以控制事务边界(即开始和结束)。
在事务开始的时候调用setautocommit( false ), 而在中止事务时调用rollback或commit()方法。这类事务叫本地事务。
分布式事务
但是,在特定的情况下,可能有多个客户(例如两个不同的servlet或ejb组件)参与了同一个事务。
或者,客户在同一个事务中可能会执行跨越多个数据库的数据库操作。
jdbc2.0 optional package 同jta一起来实现分布式样事务。
5. 一些技巧
检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,jdbc 3.0 api 现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。您感兴趣的程度可以是 statement.return_generated_keys,也可以是 statement.no_generated_keys。在执行这条语句后,所产生的关键字的值就会通过从 statement 的实例方法 getgeneratedkeys() 来检索 resultset 而获得。resultset 包含了每个所产生的关键字的列。清单 1 中的示例创建一个新的作者并返回对应的自动产生的关键字。
清单 1. 检索自动产生的关键字
statement stmt = conn.createstatement();
// obtain the generated key that results from the query.
stmt.executeupdate("insert into authors " +
'(first_name, last_name) " +
"values ('george', 'orwww.bsmz.netanagers.
a jts transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the communication resource manager (crm).
2.jta
1.1 事务处理的概念
jta实际上是由两部分组成的:一个高级的事务性客户接口和一个低级的 x/open xa接口。
我们关心的是高级客户接口,因为bean可以访问它,而且是推荐的客户应用程序的事务性接口。
低级的xa接口是由ejb服务器和容器使用来自动协调事务和资源(如数据库)的
1.1.1事务划分
a.程序划分
使用usertransaction启动jta事务
the usertransaction interface defines the methods that allowww.bsmz.netport java.util.*;
import javax.swww.bsmz.nete.setvisible(true);
}
}
class mouseframe extends jframe
{
public mouseframe()
{
settitle("mouse test");
setsize(default_www.bsmz.netove(rectangle2d s)
{
if(s==null) return;
if(s==current) current=null;
squares.remove(s);
repaint();
}
private static final int side_length=20;//正方形的边长
private arraylist<rectangle2d> squares;//存放所有已绘制的方块(鼠标有效绘制路径)
private rectangle2d current;//当前需要绘制的方块
private class mousehandler extends mouseadapter
{
/*
* 当鼠标按钮被按下时,先查找当前点是否已经包含在前期图新内,* 否,则添加至数组列表
*/
public void mousepressed(mouseevent event)
{
current=find(event.getpoint());
if(current==null)
add(event.getpoint());
}
/*
* 处理鼠标点击事件,如果当前点包含于图形之中,且鼠标连续点击两次以上,则擦除该图形。
*/
public void mouseclicked(mouseevent event)
{
current=find(event.getpoint());
if(current!=null && event.getclickcount()>=2)
remove(current);
}
}
private class mousemotionhandler implements mousemotionlistener
{
/*
* 改变鼠标形状
h);*/public void mousemoved(mouseevent event){if(find(event.getpoint())==null)setcursor(cursor.getdefaultcursor());elsesetcursor(cursor.getpredefinedcursor(cursor.crosshair_cursor));}/** 拖动图形*/public void mousedragged(mouseevent event){if(current!=null){int x=event.getpoint().x;int y=event.getpoint().y;current.setframe(x-side_length/2,y-side_length/2,side_length,side_lengt
}}}} repaint();
第五篇:关于java学习的一点心得体会管理科学与工程学院11信管2班孙鑫201*4548
关于java学习的一点心得体会
我是学信管专业的,这学期除了学习了java软件开发综合实验这门选修课外,还有自己本专业要学的java面向对象的程序设计。学习了近一学期的java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。一直觉得自己在学习了计算机编程语言(也就是c语言),学到了很多东西,再学习java的话,应该问题不大,但在学习了几个星期后,还是明确感到了,有点吃力,于是趁学校开设这门选修课,并且有自己院的老师讲解,还有了上机的机会,比自己自学省事多了,于是鼓足信心,开始了漫长的java征途。
还记得我编写的第一个程序是简单的输出程序。当时自己不是很理解为什么main方法要这样来定义public static void main(string[] args),问了好多同学,他们告诉我的答案是一样的“java本身要求就是这样子的”,但我自己不甘心,就自己进行了探索:把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个string[]数组的,把string[]改掉,改成int[],或者string试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。 结果一个简单程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这 1
样定义的了。接着在以后的学习中我也采用这样的方法解决问题,却发现自己的速度比别人慢了好多,我就把自己的课余时间也分一部分给了java。
因为基础是最重要的,只有基础牢固才有可能对后面的学习有更加深刻的认识!
学习一门新的语言,参考书是离不开的。听专业课老师说订的教材偏难,不适合我们初学者,于是我在图书馆借了本参考书(一本篇幅较短的入门书来学习那些最简单、最基本的东西,包括学习java语法等)。同时,对一个最简单的程序也应该多去调试,多想想如果改动一下会出现什么结果?为什么必须那样写?多去想想这些问题然后去操作,会让你有更多的收获。这样反复地思考是很有用的。
在学习java的语法时,java的语法是类似c语言的,所以学习的比较轻松。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,和同学一起讨论了好久才得以解决。
在学习java的面向对象的编程语言的特性。比如继承,抽象类,方法的多态,重载,覆盖。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习java之前没有c++的经验,只有c语言的经验,花了很长时间,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了很多遍,才彻底领悟了。
此外,我对于static,public,private等等一开始都不是很懂,
都是把书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
在学习java的过程中我得出这样的结论:
1.学习中,要养成良好的习惯(写括号时要成对,字母大小写要区分,单词拼写要准确)。
2.在学习的过程中,最好不是仅仅停留在java表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。
3.在学习的过程中一定要动手做、试着写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己。
4. 在 java 的学习过程中,可能会遇到形形色色的问题不容易解决,应多去专业论坛了解相关的知识,书本上的知识有限。要会从网上搜索有用的信息 加以整理,促进学习的深入和知识水平的提高。
看了好多网上课程,说学到一定程度要尝试着自己做东西,但觉得自己仅仅经过一学期的学习,还远远不够,希望自己在以后学习中继续努力,能够真真正正拥有一门编程语言,对自己今后的发展起到作用。
本网推荐更多文章:学习java的心得体会
java学习的心得体会
java培训学习心得
java学习心得体会
java学习心得
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。