java基础

<script type="text/javascript"> function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();} </script>  JAVA初学者必须掌握的30个基本概念

1.OOP中唯一关心的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关心能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。

2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)

3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)

4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。

5.对象的3个主要特性

ehavior---说明这个对象能做什么。

tate---当对象施加方法时对象的反映。

dentity---与其他相似行为对象的区分标志。

每个对象有唯一的indentity 而这3者之间相互影响。

6.类之间的关系:

use-a :依赖关系

has-a :聚合关系

is-a :继承关系--:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)

7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。

:Data类的构造器叫Data

ew Data()---构造一个新对象,且初始化当前时间。

Data happyday=new Data()---把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者

是不同的.new返回的值是一个引用。

构造器特点:构造器可以有0个,一个或多个参数

构造器和类有相同的名字

一个类可以有多个构造器

构造器没有返回值

构造器总是和new运算符一起使用

8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。

9.(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang java.util javanet等,包是分层次的所有的java包都在javajavax包层次内。

10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。

11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类)

12.多态:java中,对象变量是多态的.java中不支持多重继承。 13.动态绑定:调用对象方法的机制。

1)编译器检查对象声明的类型和方法名。

2)编译器检查方法调用的参数类型。

3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。

4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。

5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。

14.final:为防止他人从你的类上派生新类,此类是不可扩展的。

15.动态调用比静态调用花费的时间要长。

16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract

: public abstract string getDescripition

17.Java中的每一个类都是从Object类扩展而来的。

18.object类中的equaltoString方法。

equal用于测试一个对象是否同另一个对象相等。

toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示。

(toString 方法是一个很重要的方法)

19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。

20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小。

21.class object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。

22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。

能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大。

1)在运行时分析类的能力。

2)在运行时探察类的对象。

3)实现通用数组操纵代码。

4)提供方法对象。

而此机制主要针对是工具者而不是应用及程序。

反射机制中的最重要的部分是允许你检查类的结构.用到的API:

java.lang.reflect.Field 返回字段。

java.reflect.Method 返回方法。

java.lang.reflect.Constructor 返回参数。

方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。

23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface

24.接口不是一个类,而是对符合接口要求的类的一套规范。

若实现一个接口需要2个步骤:

1)声明类需要实现的指定接口。

2)提供接口中的所有方法的定义。

声明一个类实现一个接口需要使用implements 关键字

class actionB implements Comparable actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口。

25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable

26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。

:ActionListener 接口监听。

类似的API:

java.swing.JOptionPane

java.swing.Timer

java.awt.Tookit

27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。

28.内部类:一个内部类的定义是定义在另一个内部的类。

原因是:

1)一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

2)对于同一个包中的其他类来说,内部类能够隐藏起来。

3)匿名内部类可以很方便的定义回调。

4)使用内部类可以非常方便的编写事件驱动程序。

29.代理类(proxy):

1)指定接口要求所有代码

2object类定义的所有的方法(toString equals)

30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型。

 

(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:

ThisIsAClassName

thisIsMethodOrFieldName

若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。

Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如comorgnet或者edu等,全部都应小写(这也是Java 1.1Java 1.2的区别之一)。

 

(2) 为了常规用途而创建一个类时,请采取"经典形式",并包含对下述元素的定义:

 

equals()

hashCode()

toString()

clone()implement Cloneable

implement Serializable

 

(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。

 

(4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。

 

(5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。

(6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:

■一个复杂的开关语句:考虑采用"多形"机制

■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现

■许多成员变量在特征上有很大的差别:考虑使用几个类

 

(7) 让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素--只有private字段才能在非同步使用的情况下受到保护。

 

(8) 谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。

 

(9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。

 

(10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14 14.1.2 小节的"用内部类改进代码")。

 

(11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

 

(12) 避免使用"魔术数字",这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道"100"到底是指"数组大小"还是"其他全然不同的东西"。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。

 

(13) 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。

 

(14) 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。

 

(15) 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。

 

(16) 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。

 

(17) 创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象"造型"到数组里。

 

(18) 尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。

 

(19) 在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果(参见第7章的详细说明)。

 

(20) 对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。

 

(21) 在现成类的基础上创建新类时,请首先选择"新建""创作"。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要地复杂。

 

(22) 用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个"颜色"字段。

 

(23) 为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。

 

(24) Java 1.1 AWT中使用事件"适配器"时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现成方法。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。

 

(25) 用合理的设计方案消除"伪功能"。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条"只生成其中一个"注释。请考虑将其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。

 

(26) 警惕"分析瘫痪"。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷入"死逻辑"中。

 

(27) 警惕"过早优化"。首先让它运行起来,再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。除非用专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。

 

(28) 请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己,还是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。

 

(29) 如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家,但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行后再解决问题而造成的金钱及精力方面的损失。

 

(30) 良好的设计能带来最大的回报。简言之,对于一个特定的问题,通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法,以后的工作就轻松多了,再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血,最终获得一个出色的设计方案,成功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失

 

 

谁都会写代码!几个月的编程经验可以让你写出“可运行应用程序”。让它可运行容易,但是以最有效率的方式编码就需要下更多的功夫!

 

 

要知道,大多数程序员在写”可运行代码,“而不是”高效代码“。我们在这个指南课程前面提到,你想成为你们公司”最尊贵的专业人员“吗?写”高效代码“是一项艺术,你必须学习和实践它。

 

 

 

 

 

命名惯例和规范

 

 

 

注记 :

Pascal 大小写形式-所有单词第一个字母大写,其他字母小写。

Camel 大小写形式-除了第一个单词,所有单词第一个字母大写,其他字母小写。

 

 

 

类名使用Pascal 大小写形式

public class HelloWorld{ ...}

 

 

 

方法使用Pascal 大小写形式

public class HelloWorld{ void SayHello(string name) { ... }}

 

 

变量和方法参数使用Camel 大小写形式

 

 

 

 

 

public class HelloWorld{ int totalCount = 0; void SayHello(string name) { string fullMessage = "Hello " + name; ... }}

不要使用匈牙利方法来命名变量

 

 

以前,多数程序员喜欢它-把数据类型作为变量名的前缀而m_作为成员变量的前缀。例如:

string m_sName;int nAge;

然而,这种方式在.NET编码规范中是不推荐的。所有变量都用camel 大小写形式,而不是用数据类型和m_来作前缀。

 

 

用有意义的,描述性的词语来命名变量

 

 

- 别用缩写。用name, address, salary等代替 nam, addr, sal

- 别使用单个字母的变量象i, n, x . 使用 index, temp

用于循环迭代的变量例外:

for ( int i = 0; i < count; i++ ){ ...}

如果变量只用于迭代计数,没有在循环的其他地方出现,许多人还是喜欢用单个字母的变量(i) ,而不是另外取名。

- 变量名中不使用下划线 (_)

- 命名空间需按照标准的模式命名

 

 

...

 

 

 

文件名要和类名匹配

 

 

例如,对于类HelloWorld, 相应的文件名应为 helloworld.cs (, helloworld.vb)

缩进和间隔

缩进用 TAB . 不用 SPACES.

注释需和代码对齐.

花括弧 ( {} ) 需和括号外的代码对齐.

用一个空行来分开代码的逻辑分组。.

 

 

bool SayHello (string name) { string fullMessage = "Hello " + name; DateTime currentTime = DateTime.Now; string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); MessageBox.Show ( message ); if ( ... ) { // Do something // ... return false; } return true; }

这段代码看起来比上面的好::

bool SayHello ( string name ) { string fullMessage = "Hello " + name; DateTime currentTime = DateTime.Now; string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); MessageBox.Show ( message ); if ( ... ) { // Do something // ... return false; } return true; }

在一个类中,各个方法需用一空行,也只能是一行分开。

花括弧需独立一行,而不象if, for 等可以跟括号在同一行。.

好:

if ( ... ) { // Do something }

不好:

if ( ... ) { // Do something }

在每个运算符和括号的前后都空一格。.

 

 

好:

if ( showResult == true ) { for ( int i = 0; i < 10; i++ ) { // } }

不好:

if(showResult==true) { for(int i= 0;i<10;i++) { // } }

良好的编程习惯

 

 

遵从以下良好的习惯以写出好程序

 

 

 

避免使用大文件。如果一个文件里的代码超过300400行,必须考虑将代码分开到不同类中。

避免写太长的方法。一个典型的方法代码在125行之间。如果一个方法发代码超过25行,应该考虑将其分解为不同的方法。

方法名需能看出它作什么。别使用会引起误解的名字。如果名字一目了然,就无需用文档来解释方法的功能了。

 

 

好:

void SavePhoneNumber ( string phoneNumber ) { // Save the phone number. }

 

 

不好:

// This method will save the phone number. void SaveData ( string phoneNumber ) { // Save the phone number. }

一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。

 

 

好:

// Save the address. SaveAddress ( address ); // Send an email to the supervisor to inform that the address is updated. SendEmail ( address, email ); void SaveAddress ( string address ) { // Save the address. // ... } void SendEmail ( string address, string email ) { // Send an email to inform the supervisor that the address is changed. // ... }

 

 

不好:

// Save address and send an email to the supervisor to inform that the address is updated. SaveAddress ( address, email ); void SaveAddress ( string address, string email ) { // Job 1. // Save the address. // ... // Job 2. // Send an email to inform the supervisor that the address is changed. // ... }

使用C# VB.NET的特有类型,而不是System命名空间中定义的别名类型。

 

 

好:

int age; string name; object contactInfo;

 

 

不好:

Int16 age; String name; Object contactInfo;

别在程序中使用固定数值,用常量代替。

别用字符串常数。用资源文件。

避免使用很多成员变量。声明局部变量,并传递给方法。不要在方法间共享成员变量。如果在几个方法间共享一个成员变量,那就很难知道是哪个方法在什么时候修改了它的值。

必要时使用enum 。别用数字或字符串来指示离散值。

好:

enum MailType { Html, PlainText, Attachment } void SendMail (string message, MailType mailType) { switch ( mailType ) { case MailType.Html: // Do something break; case MailType.PlainText: // Do something break; case MailType.Attachment: // Do something break; default: // Do something break; } }

 

 

 

不好:

void SendMail (string message, string mailType) { switch ( mailType ) { case "Html": // Do something break; case "PlainText": // Do something break; case "Attachment": // Do something break; default: // Do something break; } }

别把成员变量声明为 public protected。都声明为 private 而使用 public/protected Properties.

不在代码中使用具体的路径和驱动器名。 使用相对路径,并使路径可编程。

永远别设想你的代码是在“C:”盘运行。你不会知道,一些用户在网络或“Z:”盘运行程序。

应用程序启动时作些“自检”并确保所需文件和附件在指定的位置。必要时检查数据库连接。出现任何问题给用户一个友好的提示。

如果需要的配置文件找不到,应用程序需能自己创建使用默认值的一份。

如果在配置文件中发现错误值,应用程序要抛出错误,给出提示消息告诉用户正确值。

错误消息需能帮助用户解决问题。永远别用象"应用程序出错", "发现一个错误" 等错误消息。而应给出象 "更新数据库失败。请确保登陆id和密码正确。" 的具体消息。

显示错误消息时,除了说哪里错了,还应提示用户如何解决问题。不要用 "更新数据库失败。"这样的,要提示用户怎么做:"更新数据库失败。请确保登陆id和密码正确。"

显示给用户的消息要简短而友好。但要把所有可能的信息都记录下来,以助诊断问题。

注释

别每行代码,每个声明的变量都做注释。

在需要的地方注释。可读性强的代码需要很少的注释。如果所有的变量和方法的命名都很有意义,会使代码可读性很强并无需太多注释。

行数不多的注释会使代码看起来优雅。但如果代码不清晰,可读性差,那就糟糕。

如果应为某种原因使用了复杂艰涩的原理,为程序配备良好的文档和重分的注释。

对一个数值变量采用不是0,-1等的数值初始化,给出选择该值的理由。

简言之,要写清晰,可读的代码以致无须什么注释就能理解。

对注释做拼写检查,保证语法和标点符号的正确使用。

 

 

异常处理

不要“捕捉了异常却什么也不做“。如果隐藏了一个异常,你将永远不知道异常到底发生了没有。

发生异常时,给出友好的消息给用户,但要精确记录错误的所有可能细节,包括发生的时间,和相关方法,类名等。

只捕捉特定的异常,而不是一般的异常。

 

 

好:

void ReadFromFile ( string fileName ) { try { // read from file. } catch (FileIOException ex) { // log error. // re-throw exception depending on your case. throw; } }

不好:

void ReadFromFile ( string fileName ) { try { // read from file. } catch (Exception ex) { // Catching general exception is bad... we will never know whether it // was a file error or some other error. // Here you are hiding an exception. // In this case no one will ever know that an exception happened. return ""; } }

不必在所有方法中捕捉一般异常。不管它,让程序崩溃。这将帮助你在开发周期发现大多数的错误。

你可以用应用程序级(线程级)错误处理器处理所有一般的异常。遇到”以外的一般性错误“时,此错误处理器应该捕捉异常,给用户提示消息,在应用程序关闭或 用户选择”忽略并继续“之前记录错误信息。

不必每个方法都用try-catch。当特定的异常可能发生时才使用。比如,当你写文件时,处理异常FileIOException.

别写太大的 try-catch 模块。如果需要,为每个执行的任务编写单独的 try-catch 模块。 这将帮你找出哪一段代码产生异常,并给用户发出特定的错误消息

如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类SystemException派生,而要继承于. IApplicationException

 

此文中的代码主要列出连接数据库的关键代码,其他访问数据库代码省略

 

1Oracle8/8i/9i数据库(thin模式)

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

String url="jdbc:oracle:thin:@localhost:1521:orcl";

//orcl为数据库的SID

String user="test";

String password="test";

Connection conn= DriverManager.getConnection(url,user,password);

 

2DB2数据库

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();

String url="jdbc:db2://localhost:5000/sample";

//sample为你的数据库名

String user="admin";

String password="";

Connection conn= DriverManager.getConnection(url,user,password);

 

3Sql Server7.0/2000数据库

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";

//mydb为数据库

String user="sa";

String password="";

Connection conn= DriverManager.getConnection(url,user,password);

 

4Sybase数据库

Class.forName("com.sybase.jdbc.SybDriver").newInstance();

String url =" jdbc:sybase:Tds:localhost:5007/myDB";

//myDB为你的数据库名

Properties sysProps = System.getProperties();

SysProps.put("user","userid");

SysProps.put("password","user_password");

Connection conn= DriverManager.getConnection(url, SysProps);

 

5Informix数据库

Class.forName("com.informix.jdbc.IfxDriver").newInstance();

String url =

"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;

user=testuser;password=testpassword";

//myDB为数据库名

Connection conn= DriverManager.getConnection(url);

 

6MySQL数据库

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"

//myDB为数据库名

Connection conn= DriverManager.getConnection(url);

 

7PostgreSQL数据库

Class.forName("org.postgresql.Driver").newInstance();

String url ="jdbc:postgresql://localhost/myDB"

//myDB为数据库名

String user="myuser";

String password="mypassword";

Connection conn= DriverManager.getConnection(url,user,password);

 

 

主  题:

 

本人的自学java的学习计划,还请GGJJ们提个建议!

作  者:

 

chenfeng40936199 (宝宝)

等  级:

 

信 誉 值:

 

100

所属社区:

 

Java 非技术区

问题点数:

 

100

回复次数:

 

42

发表时间:

 

2006-4-25 4:09:20

说来惭愧,其实我学习软件方面有1年了,主要是java. 但我一直没怎么学,现在边上的同学都一个个做自己的项目,我才发现自己什么也不会,我都22了,大学里刚出来,现在我很后悔,当时怎么就那么混不学习。搞的现在时间这么紧张,(我打算在6月左右出来找工作)。痛定思痛,我觉的现在起步也不晚,我还有时间!我要对的起我的家人的厚望还要对的起我自己,我不想做一个被人看扁的人。这几天我狂看书,想马上就追上来,但总觉的不得要领,看了半天书感觉又没看什么东西。我上网看别人的贴子发现有很多学java的新人和我有类似的情况:怎么才能学好java

别人的回答在我看来不外乎:从基础做起,学好基础,再求精进

我结合自己的情况粗拟了个学习java的计划,在这说一下自己的情况。我觉的自己的脑子不笨但很懒,有c,sql等的方面的基础,但很长时间不碰又很生疏了。哎,惭愧惭愧!

说了这么多废话,就说正题吧!

学习计划如下:
时间:2006425日开始。
第一阶段:目标:掌握基础中的基础。
    [1]
:学习《面向对象程序设计》,  共九章,一天学一章。用时9天。
    [2]
:学习《java2编程思想》,  主要的学习内容有50章。一天5章。用时10天。(java基础方面比较熟,但掌握的不牢靠,要精学。)
    [3]
:学习sqlsever基本知识。  9章,一天一章。用时9天。(有基础)
    [4]
:学习html,共9章,一天一章。用时9天。(有基础)
   
以上的学习,学完理论后全部进行上机练习。

第二阶段:巩固自己的基础知识。
    [1]
:精读《think in java》,共15章。在这之前我以看的差不多(内容方面)。所以主要是完成书后的大作业。也许会很困难吧。看自己了。 大概10天也许更长。
    [2]
:学习xml5章一天一章。用时5天。
    [3]
:抽时间看看《数据结构》,无具体任务。

3阶段:
    [1]
:学习serverlet,还有javascript.不知道什么书好。请大家推荐,最好是电子版的。
    [2]
:学习《jsp应用开发详解》,共25章,一天5章。完成练习。期间一个小作业:论坛。大作业:网上商城。用时15天。
    [3]
:抽时间看《java与模式》,无具体任务。
学完出去找工作,虽然水平还不够,但我想要是能找到工作对自己的学习是有很大帮助的。薪水无所谓,不过恐怕很难找,想找项目做或者兼职又不知道去哪找,还望有过经验的人能帮帮小弟。指点一二。

4阶段:
    [1]
:学习《精通struts.25章,一天3章。不知道自己那时是个什么水平。时间不好估算。
    [2]
:学习hibenate,不知道有什么好书,用时同上。
    [3]
:看《软件工程》。
找工作。

5阶段:
   
学习《精通EJB》,只能用心学啦。听别人说很难。我还没看过不知道啊。
找工作。

学完计划的第3阶段大概要1个半月吧。我知道学的太快了。有人会说SB一个,这么短的时间怎么可能学好,时间我不改保证,我只想尽快的学完,我浪费的时间太多了。在这我想问一下到底要学到哪种程度,才可以去找工作,找工作的时候自己做的项目很重要么。还有最重要的是大家对我这个计划有什么看法和建议,请大家尽管开口,无论鸡蛋石头我都无所谓。只要大家肯帮助我就很开心,还有就是我想问学历对找工作而言是不是很重要。我曾经是为了找工作才接触java的,网上都说像我怀这种动机的人都该转行,因为不能坚持。可现在我觉的我可以学好我有信心。希望我们彼此共同进步。

ps:高手们不知哪些有大慈大悲之心,可以在此留下QQ号,或邮箱什么的。可以教教我,如有不胜感激。谢谢所有看完此贴的同仁们。

回复的原文

    楼主,诚心进你一言。找工作压力大可以了解,你的上进心也可以理解。但是坦白地讲,你的计划大而全,在你实施的过程中,很快就会面临各种意想不到的困难。
   
你的第一阶段的计划,鉴于你自己有过JAVASQLHTML的基础知识,用40天的时间复习一遍是很有必要的,也将会是富有成效的。但在这一阶段我认为你主要的任务不是看书,而是上机练习。把书看懂和把书看精差别是很大的。举个列子,在JAVA学习的基础阶段,我们通常会认为写SWING,加事件监听并不是什么困难的事情,写applet也不会存在什么问题。这个时候,假如要求我们写一些简单但具有一定综合性的小程序,比如在applet中综合使用swing和多线程,再加上两个事件监听,你是否能够在不看书的情况下比较顺畅地写出来呢?当你觉得自己已经清晰地理解了基础的概念,并能够熟练地写出这些基础的代码的时候,对于JAVA的初学者来说,可以考虑进入下一步的学习了。
   
对于楼主的第二阶段计划, thinging in java》既然你说已经看过,后面的作业其实是没有必要做的。你更应该在第一阶段就把基础打牢,深入理解知识点的含义。我们学习JAVA,不是以看了几本经典的著作为标志,也不是以是否做了后面的练习为标志。是吧?至于《数据结构》,学起来本来就没有个深浅,其实在开发中涉及到数据结构的地方少而又少,楼主应该放在工作之后再学。现在看,可以说是既浪费时间又不利于提高自信,当不考虑。这样说来,楼主第二阶段的任务就剩下学习XML了。
   
再来分析你的第三阶段计划。此时学习serverletjavasript,jsp自然是应该的。如果你的目的是为了找工作,那么这就是你的重点中的重点之一。多做两个项目。踏实地学40天,把你的网上商城的所有代码弄懂,弄精,直到你搞明白它的来世今生。
   
你既然想急着出来找工作,在有限的时间内也就只能学这么多了。除非楼主是超强人,那要除外。至于开发模式和structs,呵呵,上班后再搞吧。如果什么都想一口气搞定,那会什么都限于皮毛的哦。还不如一个一个扎实地来好。
   
其实主要的东西还得靠在工作中去学习。只要你坚持学习新知识新技术,楼主,明年的五一我就要恭喜你咯!

 

 

 

 

 

 

 

 

 

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。
 
问题一:我声明了什么!
 
String s = "Hello world!";
 
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
 
String string = s;
 
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
 
问题二:"=="和equals方法究竟有什么区别?
 
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
 
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
 
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
 
return this==o;
 
}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
 
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
 
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
 
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。
 
问题三:String到底变了没有?
 
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
 
String s = "Hello";
s = s + " world!";
 
s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。
问题四:final关键字到底修饰了什么?
 
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
 
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
 
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
 
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
 
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
 
问题五:到底要怎么样初始化!
 
本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数
 
对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
 
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
 
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
 
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
 
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。
 
问题六:instanceof是什么东东?
 
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
 
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
 
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
 
public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}
 
在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
 
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。
 
然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:
 
public double calculate(PhoneBill bill) {
//计算电话账单
}
 
public double calculate(GasBill bill) {
//计算燃气账单
}
 
所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值