李兴华魔乐科技Java-笔记JAVA-SE基础知识_第1页
李兴华魔乐科技Java-笔记JAVA-SE基础知识_第2页
李兴华魔乐科技Java-笔记JAVA-SE基础知识_第3页
李兴华魔乐科技Java-笔记JAVA-SE基础知识_第4页
李兴华魔乐科技Java-笔记JAVA-SE基础知识_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程名称:JAVASE根底知识2、知识点2.1、上次课程的主要知识点1、 在Oracle的学习之中有以下几点必须重点掌握:·数据的查询和更新操作、事务处理;·表的建立、约束的使用、序列的使用;·表的设计范式应该是理解。2.2、本次预计讲解的知识点1、 JAVA学习层次;2、 Java简介及JDK的安装及配置;3、 JavaSE的根底程序设计;4、 数组及方法的使用。3、具体内容3.1、Java的学习层次 从程序的开发来讲,Java语言是整个JAVAEE体系的核心根底局部,在这一局部之中,只有将核心概念掌握透彻了,才有可能为以后的学习提供方便。知识点的学习:可以根据每一个关键字或者是知识点,联想到其所对应的程序及其概念,以及各个考前须知。 在整个JAVA根底局部之中,有以下三个主要局部组成:·JAVASE的根底局部:根本程序的一个恢复以及数组及方法的使用;·JavaSE的面向对象:此局部概念很多,而且必须全部记下;·JavaSE的应用局部:类集、IO、类库、JDBC等等。其他的有许多的了解局部:多线程、网络编程; 理解的局部:JavaSE1.5的提供的各种新特性。 在以上的所有知识之中按照重要性来讲,一共有如下几局部:·面向对象:所讲解的一切都是为了抽象类和接口效劳的;·类集局部:为数据结构实现;·IO:面向对象的完美表达;·JDBC:为以后的JAVAEE开发做准备呢。3.2、Java简介〔理解〕 Java:是一门编程语言,而且现在已经形成了一自己的一套完整的开发体系,被大多数的公司所支持,所以现在的Java已经不再纯粹的作为一门语言出现了,更多的是作为一个行业的开发标准出现了。从整个行业开展来讲,Java平台、.NET平台、AdobeFLEX等已经算是将编程霸占的已经足够多了,因为这些公司的实力较大。·.NET:微软支持;·FLEX:Adobe公司支持;·Java:Oracle/SUN支持、IBM、HP等公司支持。 Oracle要收购SUN公司,是为了形成:中间件+编程语言+开发工具+操作系统+数据库,完整商用体系; 从历史开展来看商用体系:·IBM:Websphere+Java+WSAD〔RAD〕+AIX+DB2;·BEA+Borland+Oracle:BEAWebLogic+JBuilder+Java+Linux+Oracle;·开源工程:Tomcat+JBoss+Eclipse+Linux+MySQL〔Oracle〕 一旦Oracle形成了这样的开发体系,那么直接针对于微软了。Oracle在收购SUN公司之前最早是由IBM提出收购的,因为IBM主要的软件产品线都在Java上,之所以现在的Java这么的火暴,主要的原因还在于IBM的推广。 IBM的典型标志:只搞理论研究从来不搞实践。 Java语言最早是在1991年的时候推出的,其前身是Oak语言,这门语言的主要目的是为了竞争一个GREEN的工程,这个工程就非常类似于今天的嵌入式开发,可以通过邮件控制家电的运行,原本SUN公司的设计人员打算使用C++进行开发的,但是后来考虑到C++的复杂性,所以使用了C++语言开发了一个新的平台——OAK〔橡树〕,但是遗憾的是此平台并没有竞争成功,被网景公司的SGL的平台所打败,从此之后Oak根本上就无家可归了。 网景公司是靠浏览器技术开展的,但是其浏览器的市场被微软抢走了,在90年代的时候网景公司的浏览器相当的流行,但是就当其到达顶峰的时候内部开始出现问题了,这个时候大局部的人不再去研究浏览器的技术了,而只是专注于市场的推广了,而就在这个时候微软一直注意着提升浏览器的技术,所以慢慢的开展势头就盖过了网景公司了。现在的网景公司的主要依靠的是FireFox浏览器来重新抢夺市场。 通过了学习浏览器技术之后,SUN公司的设计人员使用了OAK平台开发出了一套自己的浏览器技术——HotJava。开发平台,最早的Java是在浏览器中运行的一种技术——Applet。在1998年的时候推出了JDK1.2,同时将Java更名为Java2; 后来又到了2005年,Java十周年大会上,推出了JDK1.5,将Java更名为J2SE5.0; Java的主要开发公司是SUN公司,那么SUN公司的全名:斯坦伏大学网络,最早的时候是靠卖硬件赚钱的,AMAZON,主要是依靠小型机,其中AMAZON网上书店就是采用了SUN的小型机。 斯坦伏大学除了一个扬志远,其创办了YAHOO公司,Hewlet、Packed,1976年的时候HP的一个工程师:沃滋尼阿克创造了世界上第一台PC机,可是遗憾是HP公司没有采纳这个东西,但是后来此技术被一个独具慧眼的人看见了——乔布斯,所以在80年的时候Apple的电脑卖的相当的好。最早的Java有如下的几个技术的分支:·J2SE:为Java的核心的根底版本,JDK安装完成之后那么自动具备此环境; |-在2005年之后J2SE更名为JAVASE;·J2ME:是在J2SE的根底之上开展起来的,主要是完成的嵌入式开发; |-在2005年之后J2ME更名为JAVAME;·J2EE:是在J2SE根底之上开展的,主要完成企业的平台开发,也是现在Java的主要技术方向; |-在2005年之后J2EE更名为JAVAEE。 Java语言作为以上的所有开发平台的技术根本,有如下的几个特点: 1、 java语言足够简单; 2、 Java中存在多线程的处理机制,这也是Java的一大特点,而且也是为数不多的支持多线程的开发语言; 3、 自动的垃圾收集机制; 4、 可移植性; 5、 防止了指针等复杂问题的操作,而使用了更加简单的引用方式来解决同类问题。 在Java语言中有自己的运行机制,运行机制如下列图所示。C语言中每一个程序编译完成之后会自动生成一个*.exe的文件,从而可以直接执行,但是Java不一样,因为Java中的所有运行都依靠两种方式完成:·所有的Java程序的文件后缀都是*.java,但是这并不是真正要使用的程序而需要将其编译;·将编译成的*.class文件直接放在电脑上进行解释,但是此电脑可不是一台物理存在的电脑,而是一台虚拟的电脑,而此电脑就称为JVM——Java虚拟机。3.3、Java的可移植性实现〔重点〕 Java的可移植性完全表达在JVM上,通过JVM去使用不同的操作系统。 现在的程序只认JVM,而由JVM去适应不同的操作系统,这样一来,程序在各个操作系统之间就可以实现任意的移植操作,从而实现可移植性,但是这种执行的方式其性能上呢肯定不如直接在固定的操作系统上方便,可是这样做的好处是方便开发。3.4、Java开发环境搭建——JDK〔重点〕 要想进行java程序的开发,那么首先必须将JDK配置到位,JDK现在使用最广泛的版本是JDK1.5,以后的开发中记住了,只使用稳定版本,而不要使用最新版本。 本次使用的是JDK1.6版本,直接从上下载即可。 现在如果直接启动了JDK的安装程序,那么显示的语言是中文,因为JDK属于多国语言版,所以要想更准确的发现各种错误信息,建议将本机操作系统的语言环境设置为英文。 控制面板:区域和语言选项。 选择完成之后,直接选择确定,再重新启动安装程序界面。 安装完成之后下面要进入到JDK的配置,因为在JAVA中需要程序和解释,而编译和解释的命令:javac、java,但是这两个命令由于本身并不属于windows,所以默认情况下根本就无法找到,此时,就需要将JDK安装目录下的bin文件夹配置到path路径之中。 我的电脑 属性 高级选项 配置环境 配置完成之后必须重新启动命令行方式才可以将新的内容加载进来。3.5、编写第一个java程序〔重点〕 下面使用Java编写第一个应用程序,目的是在屏幕上输出“HelloWorld”。范例:publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println("HelloWorld!!!"); }} 程序编写完成之后,按照如下的步骤进行执行:,编译完成之后出现了一个*.class的文件; 2、 解释程序:javaHello,但是此时出现了如下的错误信息:Exceptioninthread"main"java.lang.UnsupportedClassVersionError:Hello(Unsupportedmajor.minorversion50.0)现在提示的错误信息是:错误的版本,查看现在使用JAVA的版本:java–version 显示信息:javaversion"_03"Java(TM)2RuntimeEnvironment,StandardEdition(build_03-b02)JavaHotSpot(TM)ClientVM(build_03-b02,mixedmode) 现在显示的信息是Java1.4版本,那么我们配置的JDK1.6呢? 实际上这个出现的错误信息完全是由Oracle,因为Oracle本身已经自带了JDK,因为许多Oracle的一些应用程序都是java开发的,所以运行,就必须有JDK的支持。 但是要想解决此问题,现在有两种方式:·在path属性之后,删除掉所有与oracle的JDK有关的配置;D:\oracle\product\\db_1\jre\1.4.2\bin\client;D:\oracle\product\10.1.0\db_1\jre\1.4.2\bin;·将所要使用新的配置放在path的最前面: 因为读取的时候采用的是顺序的方式。3.6、第一个程序的相关解释〔重点〕 第一个程序编写完成之后,下面来看一下程序的组成局部,所有的java程序都是定义在一个类之中的,而此出使用的类名称是Hello。publicclassHello{} 任何的程序都是从主方法开始运行的,在java中的主方法定义如下;publicstaticvoidmain(Stringargs[]){} 以上是程序运行的根本的结构,而要想在屏幕上进行输出的话,那么必须使用如下的语句:System.out.println("HelloWorld!!!"); 以上的输出的表示是输出之后加一个换行,如果现在没有使用println(),而使用的是print()的方法就表示不换行。 但是现在在使用的时候也有一个注意点,所有的程序都是由主方法开始执行,但是主方法要定义在一个类中,而且关于类的声明现在有两种形式:·publicclass声明:文件名称〔*.java〕必须与声明的类名称保持一致;·class声明:文件名称可以与类名称不一致,但是在执行的时候必须执行生成的类名称; 在一个*.java文件之中,可以同时定义多个class,但是只能有一个publicclass,但是编译之后文件夹中将生成多个*.class文件。 而且可以发现,现在在编写类名称的时候采用的格式是,每个单词的首字母大写,例如:HelloWorldDemo3.7、classpath环境属性〔重点〕 在默认的情况下,一个java程序编译完成之后,只能在其所在的目录中解释此程序。 如果现在在不同的路径下也想继续访问*.class文件的话,那么只能依靠classpath环境属性的支持了,设置方法:SETCLASSPATH=路径范例:将d:\testjava作为classpathSETCLASSPATH=d:\testjava 现在设置完成之后,即使当前的路径中不包含了*.class文件,但是也可以依照着classpath找到所指定路径中的*.class文件,也就是现在的程序运行:java解释找到classpath环境所设置的路径解释*.class文件。 但是这样一来也会出现一个问题,如果将classpath到处设置的话也很麻烦,所以一般情况下都会将classpath设置为当前所在的文件夹中查找所需要的*.class文件,也就是当前目录查找,设置为“.”即可。SETCLASSPATH=. 这种设置实际上也就是默认的设置,但是有些时候这种设置有可能出现问题,那么只能按照如上方式进行了,如果觉得每次这样设置过于麻烦的话,也可以直接通过环境属性完成。 这样的话,每次就不用重新设置了,以后有新的classpath也可以在此处直接完成配置,具体的这些操作将在以后的程序讲解中出现。3.8、标识符及关键字〔重点〕Java中的变量及类名称的组成也是有标识符的要求的,这些要求如下:只能由字母、数字、下划线、$所组成,其中不能以数字开头,不能是java中的关键字〔保存字〕。 这些保存字没有任何的必要去背,这些随着程序的深入而逐步都会接触到,但是这些关键字之中也有如下的几个注意点:·从版本的开展来讲: |-JDK1.4之后增加了一个assert关键字; |-JDK1.5之后增加了一个enum关键字;·以上的关键字之中,有两个未使用到的保存字:const、goto;·有特殊含义的标记〔严格讲不能算做关键字〕:true、false、null;3.9、数据类型〔重点〕 任何的编程语言都无法回避数据类型的问题,在Java之中数据类型一共分为两大类:·根本数据类型:传递是一个个具体的数值; |-数值型: |-整型:byte、int、short、long |-浮点型:float、double |-字符型:char |-布尔型:boolean·引用数据类型:就类似于C语言中的指针传递,传递的是内存地址; |-数组 |-类 |-接口、根本型数据 每种根本数据类型都有其自己的取值范围和默认值,下面通过如下的表来列出。No.根本数据类型取值范围默认值〔不可靠〕1byte-128~12702short-32768~3276703int-2147483648~214748364704long-9223372036854775808~922337203685477580705float~6double~7boolantrue、falsefalse8char-'\u0000' 从以上的取值范围来讲,double的范围是最大的,所以使用double几乎可以装下全宇宙最大的一个数字。 这些根本类型可以直接产生变量并进行计算。范例:定义整型数据publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=1; inty=2; System.out.println(x+y); }} 但是有一点必须注意的是,在java语言之中,一个数字的默认类型是int型的数据,但是在进行这种运算的时候也有一个问题,就是如果数据已经超过了int的范围,那么有可能出现数据的溢出问题。publicclassHello{ publicstaticvoidmain(Stringargs[]){ intmax=Integer.MAX_VALUE; //取得int的最大值 intmin=Integer.MIN_VALUE; //取得int的最小值 System.out.println(max+1); System.out.println(min-1); }} 如果已经是最大值了,那么继续进行相加操作会变为最小值,如果已经是最小值了,那么再相减就成为了最大值。 如果现在要想保持住一个比拟合理的做法,那么最好的方式是扩大数据的范畴,因为在java之中,所有范围小的数据可以自动向范围大的数据转换。publicclassHello{ publicstaticvoidmain(Stringargs[]){ intmax=Integer.MAX_VALUE; //取得int的最大值 intmin=Integer.MIN_VALUE; //取得int的最小值 System.out.println(max+1L); //longx=max,x+=1; System.out.println(min-1L); }}自动的数据类型转换是由位数低的向位数高的转换,但是如果现在要想将位数高的向位数低的转换,那么必须采用强制手段。publicclassHello{ publicstaticvoidmain(Stringargs[]){ longx=1L; inty=(int)x;//位数大的向位数小的转换,需要强制 inttemp=190; byteb=(byte)temp; System.out.println(b); //数据溢出 }}思考题:请说出以下的答案publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(11+1l); }} 一定要注意了,表示long的“L”和“l”是一个含义。 如果要想表示出小数的话,那么可以使用float和double,但是默认的一个小数其类型是double。publicclassHello{ publicstaticvoidmain(Stringargs[]){ doubled1=1902.3345; System.out.println(d1+10); }} 如果现在一个小数要使用float接收的话,那么必须加上一个字母“f”〔“F”〕,这样表示将double变为float。publicclassHello{ publicstaticvoidmain(Stringargs[]){ floatd1=; System.out.println(d1+10); }}但是有些时候在计算上也有一写注意点,例如:除法操作。范例:现在使用整型除法publicclassHello{ publicstaticvoidmain(Stringargs[]){ intline=10; intcp=3; System.out.println(line/cp); //因为int没有小数 System.out.println(line/(double)cp); //将一个类型变为double }} 除了这些操作之外,在定义变量的时候也有一个注意点,即:一个变量定义的时候必须声明默认值,但是这种做法要分不同的版本:范例:publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx; x=10; System.out.println(x); }}和以前这种做法都是错误的,而且根本就无法编译通过。 在以后定义变量的时候永远要给出默认值。 在根本类型之中,还有字符型的数据,可是字符型和int型是可以互相转换的,而且一个字符要使用“'”声明。范例:定义字符publicclassHello{ publicstaticvoidmain(Stringargs[]){ charc='A'; System.out.println(c); }}范例:和int型互相转换publicclassHello{ publicstaticvoidmain(Stringargs[]){ charc='A'; intx=c; //char-->int x++; c=(char)x; //int-->char System.out.println(c); System.out.println(x); }}在C语言之中,这种转换后的数字实际上就是ASCII码,但是在Java之中所有的编码是采用的UNICODE编码,而UNICODE编码中兼容了ASCII码。面试题:一个字符能否保存一个中文呢?publicclassHello{ publicstaticvoidmain(Stringargs[]){ charc='阳'; System.out.println(c); }} 以上程序在编译的时候出现了错误的信息,但是之所以会存在错误信息主要的原因是因为现在的语言环境是英文,而如果换到了中文的语言环境下,那么就可以了。 之所以可以保存主要的原因是java采用的十六进制编码,那么此编码可以包含世界上所有的文字。 在根本数据类型有一个表示真与假的功能,就是boolean型的内容,此类型只有两种取值:true、false,而且此类型大局部情况下都是用于程序逻辑的实现上的。publicclassHello{ publicstaticvoidmain(Stringargs[]){ booleanflag=true; if(flag){ //等价于:flag==true System.out.println("HelloWorld!!!"); } }}、初窥String 在数据库的学习之中曾经学习过,要是想表示出一个人的姓名肯定是字符串,所以字符串在java中就可以使用String来定义了,可是String是一个类,只是这个类使用起来即特殊也方便。publicclassHello{ publicstaticvoidmain(Stringargs[]){ Stringname="张三"; System.out.println(name); }} 而且字符串中也可以使用“+”进行字符串的连接。publicclassHello{ publicstaticvoidmain(Stringargs[]){ Stringname="张三"; name+=",你好"; //连接字符串 name=name+"!!!"; //连接字符串 System.out.println("信息:"+name); }}但是有一点也必须注意的是,如果任何的数据类型遇到了String,那么所有的数据类型都将变为字符串。publicclassHello{ publicstaticvoidmain(Stringargs[]){ Stringinfo="计算结果:"; intx=1; inty=2; System.out.println(info+x+y); System.out.println(info+(x+y)); }}3.10、运算符〔重点〕 数学运算符:+、-、*、/、%; 简便运算符:++、--、+=、-=、….; 逻辑运算符:&&、&、||、|、!; 关系运算符:>、>=、<、<=、!=; 位运算符:&、|、^、~;范例:以下代码不能在开发中使用publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=0; x++; x+=++x-x+++x-10; System.out.println(x); }} 但是对于逻辑运算符有与和或两个,但是却分为两组,这两组分别来看,再看之前,先来观察以下一道程序。publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(10/0==0); }} 这种代码一旦执行肯定要出现错误,但是下面就以上面的代码作为操作的一个点。范例:观察与的操作,与的操作指的是所有的条件必须都满足publicclassHello{ publicstaticvoidmain(Stringargs[]){ if(1==2&10/0==0){ System.out.println("HELLOWORLD!!!"); } }} 现在可以发现,两个条件都进行了判断,但是从实际来讲,第一个判断条件已经是false了,那么既然是false的话,那么以后再怎么验证,结果都只能是false,而这种&却将所有的条件都判断了,肯定不适宜,所以在java之中提供了短路与操作——&&。publicclassHello{ publicstaticvoidmain(Stringargs[]){ if(1==2&&10/0==0){ System.out.println("HELLOWORLD!!!"); } }} 因为现在第一个条件已经不满足了,所以后面的条件无论如何判断最终的结果都是false,所以,将其全部判断就没有意义了。范例:观察或的操作,有一个操作条件满足,那么一切都满足。publicclassHello{ publicstaticvoidmain(Stringargs[]){ if(1==1|10/0==0){ System.out.println("HELLOWORLD!!!"); } }} 现在的普通“|”会将所有的条件都进行判断,理论上如果第一是true的话,那么后面无论如何的判断最终结果都是true,那么有一个满足条件就完了,后面判断就没有意义了,现在就可以使用短路或完成。publicclassHello{ publicstaticvoidmain(Stringargs[]){ if(1==1||10/0==0){ System.out.println("HELLOWORLD!!!"); } }} 在实际的开发中就使用“&&”和“||”完成。范例:三目运算符publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=10; inty=20; intmax=x>y?x:y; System.out.println(max); }}位运算:在开发中出现较少,但是作为知识点需要先掌握一下 在进行位运算之前必须先把握一个概念:十进制变为二进制数据。除2取余,倒着取数据。 5 101÷ 2 2 … 1^÷ 2 | 1 … 0|÷ 2 | 0 … 1| 但是在java之中整型的数据长度是32位,所以以上的数据如果严格来讲,变为二进制是: 00000000000000000000000000000101 在java中提供的位运算符:&、|、^、~、>>、<<、>>>范例:观察与操作publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=13; inty=15; System.out.println(x&y); }} 下面使用二进制的方式分析以上的程序: 13的二进制: 000000000000000000000000000001101 15的二进制: 000000000000000000000000000001111 &操作: 000000000000000000000000000001101 13范例:或操作publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=9; inty=7; System.out.println(x|y); }} 继续使用二进制分析: 9的二进制: 000000000000000000000000000001001 7的二进制: 000000000000000000000000000000111 |操作: 000000000000000000000000000001111 15范例:观察移位操作,但是需要注意的是,移位之后的原数据内容不改变publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=9; System.out.println(x<<2); System.out.println(x); }} 分析以上的数据操作: 9的二进制: 000000000000000000000000000001001 向左移两位: 000000000000000000000000000100100 36面试题:要求以最快的方式计算出2的3次方——靠移位最快publicclassHello{ publicstaticvoidmain(Stringargs[]){ intx=2; System.out.println(x<<2); }}3.11、程序结构〔重点〕 程序的结构主要包括:顺序、分支、循环等操作。 分支:if..else、switch 循环:for、while、do…while范例:使用if….else判断publicclassHello{ publicstaticvoidmain(Stringargs[]){ intage=10; if(age>=0&&age<=12){ System.out.println("小P孩。"); }elseif(age>12&&age<=18){ System.out.println("小少年。"); }elseif(age>18&&age<=150){ System.out.println("成年了"); }else{ System.out.println("您不是人了。。。"); } }} 这种if..else的判断是可以直接使用boolean型的数据完成的,同样,对于多条件判断,也可以使用switch,但是switch可以判断的内容只能数字、字符、枚举。publicclassHello{ publicstaticvoidmain(Stringargs[]){ intch=1; switch(ch){ case0:{ System.out.println("***结果是0"); break; } case1:{ System.out.println("***结果是1"); break; } case2:{ System.out.println("***结果是2"); break; } default:{ System.out.println("没有满足条件的地方。"); break; } } }} 循环程序肯定是必须的,实际上任何语言的学习之中,循环是一大难关,循环有如下几点需要注意:·循环要注意循环体的操作;·循环的时候要考虑到死循环的问题;·考虑到循环条件的变更。范例:1~100累加——while循环publicclassHello{ publicstaticvoidmain(Stringargs[]){ intsum=0; intx=1; while(x<=100){ //判断条件 sum+=x; //累加 x++; //修改循环条件 } System.out.println(sum); }}范例:1~100累加——do…while循环publicclassHello{ publicstaticvoidmain(Stringargs[]){ intsum=0; intx=1; do{ //判断条件 sum+=x; //累加 x++; //修改循环条件 }while(x<=100); System.out.println(sum); }}范例:1~100累加——for循环publicclassHello{ publicstaticvoidmain(Stringargs[]){ intsum=0; for(intx=1;x<=100;x++){ sum+=x; } System.out.println(sum); }} 对于循环的使用:·在实际之中while循环要比do…while使用更多;·如果不知道循环次数的时候使用while,而知道循环次数的时候使用for循环。 对于循环的操作本身是允许嵌套的,比拟常见的功能。范例:打印乘法口诀publicclassHello{ publicstaticvoidmain(Stringargs[]){ for(intx=1;x<=9;x++){ for(inty=1;y<=x;y++){ System.out.print(x+"*"+y+"="+x*y+"\t"); } System.out.println(); } }}范例:打印三角形publicclassHello{ publicstaticvoidmain(Stringargs[]){ intline=10; //希望打印10行 for(intx=0;x<line;x++){ for(inty=0;y<line-x;y++){ System.out.print(""); } for(inty=0;y<=x;y++){ System.out.print("*"); } System.out.println(); //换行 } }} 这些都是一些根本程序的设计。3.12、方法〔重点〕、方法的根本概念方法就是一段可以被重复调用的代码段,在C语言之中将方法又称为函数,但是在java开发之中千万不能说函数,永远只能说方法。 但是现在的方法稍微有一些特殊,现在的方法是要求由主方法直接进行调用的,那么必须按照如下的格式定义:publicstatic返回值类型方法名称(参数列表){ [return返回值;]} 对于返回值就是java中的数据类型,这种类型就分为根本数据类型和引用数据类型两大类了,而如果现在一个方法不需要返回值,那么在方法中不需要编写return语句,返回值类型处声明为void。范例:定义一个没有返回值的方法publicclassHello{ publicstaticvoidmain(Stringargs[]){ printStar(); //由方法直接调用 printStar(); //由方法直接调用 printStar(); //由方法直接调用 } publicstaticvoidprintStar(){ System.out.println("******************"); System.out.println("*HELLOWORLD*"); System.out.println("******************"); }}范例:定义接收参数的方法publicclassHello{ publicstaticvoidmain(Stringargs[]){ printStar(3); printStar(16); } publicstaticvoidprintStar(intline){ //接收参数 for(intx=0;x<line;x++){ for(inty=0;y<line-x;y++){ System.out.print(""); } for(inty=0;y<=x;y++){ System.out.print("*"); } System.out.println(); //换行 } }} 方法依然可以返回内容,这个时候使用return即可。范例:定义一个返回数据计算的方法publicclassHello{ publicstaticvoidmain(Stringargs[]){ intresult=add(10,20); System.out.println(result); System.out.println(add(20,30)); } publicstaticintadd(intx,inty){ returnx+y; }}、使用return完结方法 之前使用return的时候都是在方法有返回值类型声明的时候操作的,如果现在返回的返回值类型声明为void的话,那么也可以使用return,一旦使用了return的话,那么表示将直接返回到方法的被调用处执行。publicclassHello{ publicstaticvoidmain(Stringargs[]){ printStar(-3); printStar(-16); } publicstaticvoidprintStar(intline){ //接收参数 if(line<=0){ //数据没有任何的意义 return; //返回方法的被调用处 } for(intx=0;x<line;x++){ for(inty=0;y<line-x;y++){ System.out.print(""); } for(inty=0;y<=x;y++){ System.out.print("*"); } System.out.println(); //换行 } }} 这种操作只能在返回值类型是void的情况下才可以使用。、方法的重载〔重点〕 在讲解此概念之前,先来观察如下的一段程序。publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(add1(20,30)); System.out.println(add2(20,30,10)); System.out.println(add3(190.1,182.2)); } publicstaticintadd1(intx,inty){ returnx+y; } publicstaticintadd2(intx,inty,intz){ returnx+y+z; } publicstaticdoubleadd3(doublex,doubley){ returnx+y; }} 这个时候的目的是想实现多个数据的相加操作,但是这种定义的形式在进行代码的管理上肯定不方便,因为在调用方法的时候还必须根据参数的类型或个数来找到方法的名称,在这种情况下,就可以使用方法重载的概念完成,所谓的方法重载就是指的方法名称相同,但是参数的类型或个数不同。publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(add(20,30)); System.out.println(add(20,30,10)); System.out.println(add(190.1,182.2)); } publicstaticintadd(intx,inty){ returnx+y; } publicstaticintadd(intx,inty,intz){ returnx+y+z; } publicstaticdoubleadd(doublex,doubley){ returnx+y; }} 在这种情况下,可以发现,程序会自动根据参数的类型或个数的不同,以调用不同的方法完成操作。思考题:以下的操作是否是重载?publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(add(20,30)); System.out.println(add(20,30)); } publicstaticintadd(intx,inty){ returnx+y; } publicstaticdoubleadd(intx,inty){ returnx+y; }} 方法的重载与返回值类型根本就没有任何的关系存在,只看方法名称、参数的类型或个数。范例:观察以下的代码publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(1); System.out.println(10.3); System.out.println('A'); System.out.println(true); System.out.println("HELLO"); }} 以上同一个“System.out.println()”方法可以输出不同的数据类型。所以此方法也是一个被重载的方法。、递归调用〔理解〕 递归调用:指的是一个方法自己调用自己的情况,但是如果要想完成递归调用的话,那么必须满足如下的几个条件: 1、 一定会有一个递归的结束条件; 2、 而且每次调用的时候都要改变这个结束条件。范例:完成1~100的累加操作——最早的做法,使用while完成publicclassHello{ publicstaticvoidmain(Stringargs[]){ intsum=0; intx=1; while(x<=100){ sum+=x; x++; } System.out.println(sum); }} 这种代码之中结束条件是:x>100,那么现在将程序换到递归完成。publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(fun(100)); } publicstaticintfun(intnum){ if(num==1){ return1; } returnnum+fun(num-1); }} 这个时候的fun()方法的调用就相当于:fun(100)+fun(99)+fun(98)+…+fun(1); 可是,递归本身操作的时候会存在内存的溢出问题,所以开发中使用并不多见,除非万不得已的时候。、思考题1、 现在要求通过方法完成以下的计算操作:1!+2!+…+100!,输出结果。 提示:如果可以最好试着使用递归完成。 这个数据太大了,而且已经超过了long的范畴,那么只能扩大,使用double。实现方式一:按照普通的循环方法完成publicclassHello{ publicstaticvoidmain(Stringargs[]){ doublesum=0.0; //定义一个保存结果的变量 for(intx=1;x<=100;x++){ doubletemp=1.0;//阶乘必须从1开始 for(inty=1;y<=x;y++){ temp*=y; } sum+=temp; } System.out.println(sum); }}实现方式二:通过递归完成操作publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(mul(100)); } publicstaticdoublemul(intnum){ if(num==1){ return1; } returnfun(num)+mul(num-1); } //fun(100)+fun(99)+...+fun(1) publicstaticdoublefun(intnum){ if(num==1){ return1; } returnnum*fun(num-1); }}2、 有5个人坐在一起,问第5个人多少岁?答,比第4个人大2岁。第4个人说他比第3个人大2岁,第3个人比第2个人大2岁,第2个人比第1个人大2岁,问第1个人时答复是10岁。第5个人到底多大? 直接通过递归调用完成。publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(age(5)); } publicstaticintage(intcount){ if(count==1){ return10; } return2+age(count-1); }}3、 编写一个方法,此方法可以将一个整数变为二进制输出。 二进制的求法:数字除以2取模,等数字计算到0了,也就不取了,现在根本就不知道要除以多少次,那么就要改变做法,继续使用递归完成。publicclassHello{ publicstaticvoidmain(Stringargs[]){ binary(2389); } publicstaticvoidbinary(intnum){ if(num/2!=0){ binary(num/2); //改变递归的条件System.out.print(num%2); } }} 重点是训练递归的调用操作,如果不理解的话,只有一个方法,多写几遍,根据自己的思路修改。3.13、数组〔重点〕语言中数组肯定是要使用的,而且之前学习过数组属于引用数据类型,那么此处就要进行内存关系的初步分析。、数组的根本概念 数组是一组相关变量的集合,例如,现在如果要求定义100个整型数据,如果不使用数组的话,那么定义如下:inti1,i2,i3,..i100,这样的代码肯定在维护的时候相当的不方便,因为这么多的变量,写起来就很长,代码就看的不舒服,而且访问的时候也没有任何的规律可言,那么使用数组就可以完全解决此类问题。 在Java之中,如果要想定义数组,有以下几种语法形式:语法一:声明并开辟空间数据类型[]数组名称=new数据类型[长度];数据类型数组名称[]=new数据类型[长度]; 这种方式属于紧凑型的,也可以采用分布完成。语法二:分步完成操作声明数组:数据类型数组名称[]=null;为数组开辟空间:数组名称=new数据类型[长度]; 数组是引用数据类型,所以引用数据类型声明的时候就必须定义成“null”。 数组定义完成,要想访问的话,可以直接通过“数组[下标]”的形式完成,但是必须注意的是,如果数组的长度是3的话,那么下标的范围是:0~2表示3个元素。 而且在Java之中也可以通过“”的形式取得一个数组的长度。 数组在开辟空间之后,里面的每一个内容都是默认值,现在如果是int型的数组,那么默认都是0。范例:定义一个整型数组publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]=newint[3]; //定义一个包含3个元素的数组 System.out.println(data.length); //求出长度 System.out.println(data[0]); //访问第一个元素 }}范例:循环操作publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]=newint[3]; //定义一个包含3个元素的数组 for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } for(intx=0;x<data.length;x++){ data[x]=x*2; //为数组中的每个元素赋值 } System.out.println(); for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } }} 使用数组之中,虽然变量很多,但是很好管理,可是以上的做法是一次性完成的数组的分配,那么下面分两步完成:publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]=null; //定义数组 data=newint[3]; //开辟空间 for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } for(intx=0;x<data.length;x++){ data[x]=x*2; //为数组中的每个元素赋值 } System.out.println(); for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } }} 这样的两种方式操作的效果是完全一样的,那么下面就要分析数组的内存操作了。、数组的内存操作〔核心重点〕 从数组上现在可以发现如下的特点:·数组是一个引用数据类型,引用数据类型必然要有内存空间的分配问题;·数组在开辟空间的时候使用了关键字new,此关键字的主要功能是开辟新的内存空间; 内存空间现在可以先暂时将其划分成两个局部〔前提:实际上对于java来讲内存没有以下的这种划分,但是为了理解的方便,所以采用了C++的方式进行内存的理解。〕:·堆内存:堆内存的主要功能是用于保存具体内容的;·栈内存:保存着对一块堆内存的地址值,而现在为了简单的理解,将其简单理解为,保存的是数组名称; 那么,按照此划分的方式,那么可以将以上的程序画成以下的内存关系图。 而如果现在采用的是直接开辟空间的形式,可以将以上图形的第一个和第二个合在一起。 如果说以上表示的是一个人一个名字的话,那么从实际的生活来讲,一个人就可能有多个名字。publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]=newint[3]; //开辟空间 for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } for(intx=0;x<data.length;x++){ data[x]=x*2; //为数组中的每个元素赋值 } intres[]=data; //data表示一块空间,而res表示得到这块空间 res[0]=10; //修改res的内容 System.out.println(); for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } }} 此题目的内存关系如下:这种操作就称为引用传递,所谓的引用传递就是为一个堆内存空间起多个名字,之后多个名字一起操作同一个空间。、数组的静态初始化 数组的初始化实际上是有两种形式的;·动态初始化:之前所使用的代码形式就属于动态初始化,因为开辟数组的时候没有为数组声明内容,而全部都是采用的默认值完成的;·静态初始化:指的是在数组声明的时候直接定义出具体的内容来,但是,静态初始化有两种语法形式。方式一:简便做法数据类型数组名称[]={值,值,..};方式二:完整做法数据类型数组名称[]=new数据类型[]{值,值,..};范例:测试代码publicclassHello{ publicstaticvoidmain(Stringargs[]){ //intdata[]={1,3,5,7,9}; intdata[]=newint[]{1,3,5,7,9}; for(intx=0;x<data.length;x++){ System.out.print(data[x]+"、"); //通过下标访问 } }}、数组与方法 数组的引用传递掌握之后,实际上最方便的就在于方法与数组的操作上了,一个方法可以接收或者是返回一个数组。范例:使用方法接收数组publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]={89,12,10,19,18,78,90,18,281,8}; printArray(data); //int[]arr=data; } publicstaticvoidprintArray(int[]arr){ //表示接收的是整型数组 for(intx=0;x<arr.length;x++){ System.out.print(arr[x]+"、"); //通过下标访问 } }} 那么,如果现在在一个方法之中,将数组的内容修改的话,是否影响原始的数据呢?publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]={89,12,10,19,18,78,90,18,281,8}; sort(data); printArray(data); //int[]arr=data; } publicstaticvoidsort(intnum[]){ //在此方法中可以修改数组内容 for(intx=0;x<num.length;x++){ for(inty=0;y<num.length-1;y++){ if(num[y]>num[y+1]){ inttemp=num[y]; num[y]=num[y+1]; num[y+1]=temp; } } } } publicstaticvoidprintArray(int[]arr){ //表示接收的是整型数组 for(intx=0;x<arr.length;x++){ System.out.print(arr[x]+"、"); //通过下标访问 } }} 既然是引用数据类型了,那么传递到方法之中,一定可以在方法中修改原始的数据内容。 以上都是演示了接收数组的操作,那么下面还可以将代码进一步的修改,将其变为返回数组的操作,如果一个方法要想返回数组,那么直接在返回的数据类型上写上要返回的数组类型即可。publicclassHello{ publicstaticvoidmain(Stringargs[]){ intdata[]=init(); sort(data); printArray(data); //int[]arr=data; } publicstaticint[]init(){ //返回数组内容 inttemp[]={89,12,10,19,18,78,90,18,281,8}; returntemp; } publicstaticvoidsort(intnum[]){ //在此方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论