尚学堂课件j2se上半部分_第1页
尚学堂课件j2se上半部分_第2页
尚学堂课件j2se上半部分_第3页
尚学堂课件j2se上半部分_第4页
尚学堂课件j2se上半部分_第5页
已阅读5页,还剩191页未读 继续免费阅读

下载本文档

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

文档简介

内容第一章:JAVA概述第二章:JAVA语言基础第三章:面向对象编程第四章:JAVA异常处理机制第五章:数组第六章:JAVA常用类第七章:JAVA容器类第八章:JAVA流技术第九章:JAVA多线程机制第十章:JAVA网络编程第十一章:GUI编程第一章:J2SE

之JAVA概述想学习J2ME、JSP/Servlet、J2EE吗?请打好基础—J2SE内容1.

计算机语言的历史以及Java语言的历史地位Java自身的发展史Java体系Java的特点Java的运行机制Java运行环境的安装与配置第一个程序HelloWorld计算机语言发展史及Java的历史地位

第一代语言

第一代语言或机器语言是一种低级的面向计算机的程序设计语言,使用0和1表示各种命令。

第二代语言

汇编

第三代语言

C、Pascal、Fortran面向过程的语言

C++面向过程/面向对象

Java跨平台的纯面向对象的语言

.NET跨语言的平台Java发展史与java体系j2eej2me移动增值

95年,Sun发布JDK1.0

98年,JDK1.2,更名为Java2

后续JDK1.3、1.4

目前JDK1.5,更名为Java

5.0

(最新为JDK

6

Update

3)

我们使用5.0j2seJAVA能开发那些类型的程序?java

webJava语言的特点

一种面向对象的语言。

一种平台无关的语言,提供程序运行的解释环境。

一种健壮的语言,吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序运行机制及运行过程字节码(*.class文件)源程序(*.java文件)Java编译器类装载器Class

Loader字节码校验器byteverifier解释器interpretor系统平台核心机制之Java虚拟机

Java虚拟机可以理解成一个以字节码为机器指令的CPU。

对于不同的运行平台,有不同的虚拟机。

Java

虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。JVM

for

UNIXUNIXJVM

for

WindowsWindowsJVM

for

OtherOther

Platform*.java*.class编译执行核心机制之垃圾收集garbage

collector不再使用的内存空间应回收-垃圾收集。在C/C++等语言中,由程序员负责回收无用内存。Java语言消除了程序员回收无用内存空间的责任;它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间。垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预。J2SDK

&

JRESoftwareDevleopmentKit(软件开发包)Java

RuntimeEnvironment(Java运行环境)开发需要JDK用户只需JRE开发JDK的不止一家

最主流的是Sun公司发布的JDK

除了Sun之外,还有很多公司和组织都开发了自己的JDK

IBM公司开发的JDK,IBM的JDK包含的JVM(Java

VirtualMachine)运行效率要比Sun

JDK包含的JVM高出许多

BEA公司的Jrocket,专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多

GNU组织开发的JDKJava开发环境的下载安装配置配置Java开发环境步骤(WindowsXP)下载并安装最新版本的J2SDK。设置Windows环境变量。PATH/CLASSPATH选择合适的文本编辑器或使用集成开发环境。

下载

安装

配置path

&classpath

验证

java

运行java程序

javac

编译java程序HelloWorld.javaJava

Application初步

Java源文件以“java”为扩展名。源文件的基本组成部分是类(class),如本例中的HelloWorld

类。

一个源文件中最多只能有一个public类。其它类的个数不限,如果源文件包含一个public

类,它必需按该类名命名。

Java

应用程序的执行入口是main()

方法。它有固定的书写格式:

public

static

void

main(String

args[])

{…}

Java

语言中严格区分大小写。

Java

方法由一条条语句构成,每个语句以分号结束。

Java语言有三种注释方式://

用于单行注释/*用于多行注释*//***

用于多行注释,且可以被doc

工具解析*/常见Java

开发环境

编辑器

UltraEdit

EditPlus

集成开发环境(IDE

Integrated

Development

Environment):

JBuilder

Eclipse

Sun

One

Studio

Net

Beans(

WSAD RAD

WebSphere

Application

Developer

Rational

Application

Developer

IntelliJ

IDEA常见错误

出现如下错误的原因:‘java’不是内部或外部命令,也不是可运行的程序或批处理文件。

编译javac

Test.java,明明看到该文件,为何找不到?HelloWorld.java.txt

显示扩展名!

程序员的桌面设置(详细列表/显示所有文件/标题栏地址栏全路径)java命令运行的是那个版本?

如果安装了多个版本jdk,那么java命令运行的是那个版本的呢?

java

–version

java

–verbose

java

-verbose

HelloWorld

有时候,修改了一个jdk下面的配置,但始终无法生效。就是这个道理。第二章:J2SE

之基础语法内容1.

标识符关键字Java

基本数据类型运算符表达式和语句分支循环方法变量的作用域递归调用标识符

Java

语言中,对各种变量、方法和类等要素命名时使用的字符序列称为标识符。

Java

标识符有如下命名规则:

标识符由字母、下划线“_”、美元符“$”或数字组成。

标识符应以字母、下划线、美元符开头。

Java

标识符大小写敏感,长度无限制。

约定俗成:Java标识符选取因注意“见名知意”且不能与Java语言的关键字重名。合法的标识符不合法的标识符HelloWorldclassDataClassDataClass#_98398.3$bS5_c7Hell

World关键字

Java

中一些赋以特定的含义,用做专门用途的字符串称为关键字(keyword)。

所有Java关键字都是小写英文字符串。

goto

const

虽然从未使用,但也作被为

Java

关键字保留。abstractdefaultifprivatethisbooleandoimplementsprotectedthrowbreakdoubleimportpublicthrowsbyteelseinstanceofreturntransientcaseextendsintshorttrycatchfinalinterfacestaticvoidcharfinallylongstrictfpvolatileclassfloatnativesuperwhileconstfornewswitchnullcontinuegotopackagesynchronizedJava常量

Java

的常量值用字符串表示,区分不同的数据类型。

如整型常量123

实型常量3.14

字符常量‘a’

逻辑常量true、false

字符串常量“helloworld”

null

注意:

区分字符常量和字符串常量

区分null

和“”Java变量

Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。

Java程序中每一个变量都属于特定的数据类型,在使用前必须对其声明,声明格式为:

type

varName

[=value][{,varName[=value]}]

例如:int

i

=100;float

f

=

12.3f;double

d1,

d2,

d3

=0.123;String

s

=

“hello”;

从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因

此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用值名字提示:程序执行过程硬盘程序内存代码操作系统代码1:Load到内存区heapstackdata

segmentcode

segment3:执行过程中的内存管理存放代码静态变量字符串常量局部变量2:找到main方法开始执行new出来的东西Java变量的分类

按被声明的位置划分:

局部变量:方法或语句块内部定义的变量

成员变量:方法外部、类的内部定义的变量

注意:类外面(与类对应的大括号外面)不能有变量的声明

按所属的数据类型划分:

基本数据类型变量

引用数据类型变量Java局部变量与成员变量

方法体内部声明的变量(包括形参)称为局部变量:

方法体内部是指与方法对应的大括号内部

在方法体外,类体内声明的变量成为成员变量public

void

method(){int

i;int

j=i+5;//编译出错,变量i还未被初始化double

d

=3.14;}注:以上程序目前还不能编译TestVar.javaJava数据类型的划分数据类型基本数据类型引用数据类型数值型字符型(char)布尔型(boolean)整数类型(byte,short,int,long)浮点类型(float,double)类(class)接口(interface)数组Java基本数据类型

Java中定义了4类8种基本数据类型。

逻辑型-boolean

字符型-char

数值型

整数型-

byte,

short,

int,

long

浮点数型-

float,

double逻辑型Boolean

boolean

类型适于逻辑运算,一般用于程序流程控制。

boolean

类型数据只允许取值true

或false

,不可以0

或非0

的整数替代true和false

,这点和C语言不同。

用法举例:boolean

flag;flag

=

true;if(flag)

{//do

something}字符型char

char

型数据用来表示通常意义上的“字符”

字符常量为用单引号括起来的单个字符,例如:

char

eChar='a';char

cChar='中';

Java

字符采用Unicode

编码,每个字符占两个字节,因而可用十六进制编码形式表示,例如:

char c1

=

'\u0061';

注:Unicode是全球语言统一编码

Java

语言中还允许使用转义字符‘\’来将其后的字符转变为其它的含义,例如:

char

c2

=

'\n';

//‘\n’代表换行符

补充:2进制、10进制、16进制之间的转换

1101

1×1

0

×

2

1

×

4

1

×

8

13

1

4

8

1101

1101

D类

型占用存储空间表数范围byte1字节-128

127short2字节-215~

215-1int4字节-231~

231-1long8字节-263~

263-1整数类型

Java各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。

Java

语言整型常量的三种表示形式:

十进制整数,如:12,-314,0。

八进制整数,要求以0

开头,如:012。

十六进制数,要求0x

或0X

开头,如:0x12

Java语言的整型常量默认为int型,声明long型常量可以后加‘l’或‘L’,如:

int

i1

=

600;

//正确

long

l1

=

88888888888L;

//必须加l否则会出错类

型占用存储空间表数范围float4字节-3.403E38~3.403E38double8字节-1.798E308~1.798E308浮点类型

与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。

Java

浮点类型常量有两种表示形式

十进制数形式,例如:3.14

科学记数法形式,如3.14e2314.03.14E2.314100E-2

Java

浮点型常量默认为double

型,如要声明一个常量为float

型,则需在数字后面加f

或F

,如:

double

d

=

12345.6;

//正确

float

f

=

12.3f;

//必须加f否则会出错

下面列出Java

的各种浮点类型TestVar2.java基本数据类型转换

java中可以从任意基本类型转型到另外的基本类型

例外

boolean

类型不可以转换为其他的数据类型。

转换分为默认转换和强制转换

整形,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:

byte,short,char->int->long->float->double

byte,short,char之间不会互相转换,他们三者在计算时首先回转换为int类型

容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。

有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。(看下页)

实数常量(如:1.2)默认为double。整数常量(如:123)默认为int

。TestConvert.java多种类型的数据混合运算

有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

如果其中一个运算对象是double类型的

另一个也会被转换成double类型。

否则,如果其中一个运算对象是float类型的,

另一个也会被转换成float类型的。

否则,如果其中一个运算对象是long类型的,

另一个也会被转换成long类型的。

否则,如果其中一个运算对象是int类型的,

另一个也会被转换成int类型的。

否则,如果其中一个运算对象是short类型的,

另一个也会被转换成short类型的。void

public

method(){int

i=1,j;float

f1=0.1; float

f2=123;long

l1

=

12345678,l2=

;double

d1

=

2e20,d2=124;byte

b1

=

1,b2

=

2,b3

=

129;j

=

j+10;i

=

i/10;i

=

i*0.1;char

c1='a',c2=125;byte

b

=

b1-b2;char

c

=

c1+c2-1;float

f3

=

f1+f2;float

f4

=

f1+f2*0.1;double

d

=

d1*i+j;float

f

=

(float)(d1*5+d2);}课堂练习说出下面程序片断中编译错误或可能产生计算溢出的部分课堂练习TestConvert2.java程序格式大括号对齐遇到{缩进,Tab/Shift+Tab程序块之间加空行并排语句之间加空格运算符两侧加空格——有特定条件{前面有空格成对编程运算符

Java

语言支持如下运算符:

算术运算符:+,-,*,/,%,++,--

关系运算符:>,<,>=,<=,==,!=

逻辑运算符:!,&,|,^,&&,||

位运算符:&,|,^,~

,>>,<<,>>>

赋值运算符:=

扩展赋值运算符:+=,-=,*=,/=

字符串连接运算符:+public

class

Test

{public

static

void

main(String

arg[])

{int

i1

=

10,

i2

=

20;int

i

=

i2++;System.out.print("i="

+

i);System.out.println("

i2="

+

i2);i

=

++i2;System.out.print("i="

+

i);System.out.println("

i2="

+

i2);i

=--i1;System.out.print("i="

+

i);System.out.println("

i1="

+

i1);i

=

i1--;System.out.print("i="

+

i);System.out.println("

i1="

+

i1);}}自加和自减运算符输出:i=20

i2=21i=22

i2=22i=9

i1=9i=9

i1=8※注意:++(--)在前时先运算再取值。在后时先取值再运算。逻辑运算符逻辑运算符: !-逻辑非

&-

逻辑与

|

逻辑或^

逻辑异或

&&-

短路与

||

短路或&&,

||,!

逻辑运算符只能用于boolean身上。ab!aa&ba|ba^ba&&ba||btruetruefalsetruetruefalsetruetruetruefalsefalsefalsetruetruefalsetruefalsetruetruefalsetruetruefalsetruefalsefalsetruefalsefalsefalsefalsefalsepublic

class

Test{public

static

void

main(String

args[]){boolean

a,b,c;a=

true;

b

=

false;c=

a

&

b;

System.out.println(c);c

=

a|

b;

System.out.println(c);c

=

a

^

b;

System.out.println(c);c

=!a;

System.out.println(c);c

=

a

&&

b;System.out.println(c);c

=

a

||

b;

System.out.println(c);}}public

class

Test{public

static

void

main(String

args[])

{int

i=1,j=2;boolean

flag1

=

(i>3)&&((i+j)>5);//第二个操作数将不再计算boolean

flag2

=

(i<2)||((i+j)<6);//第二个操作数将不再计算}}赋值运算符(=)当“=”两侧数据类型不一致时,可以适用默认类型转换或使用强制类型转换原则进行处理long

l

=

100; int

i

=

(int)l;注意:可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围byte

b

=

12;

char

c

=

100;X

byte

bb

=

256;

X

short

s

=

-32769;赋值运算符与扩展赋值运算符运算符用法举例等效的表达式+=a

+=

ba

=

a+b-=a-=

ba

=

a-b*=a

*=

ba

=

a*b/=a

/=

ba

=

a/b%=a

%=

ba

=

a%b字符串连接符

“+”除用于算术加法运算外,还可用于对字符串进行连接操作int

id

=

800

+

90;String

s

=

"hello"+

"world";

“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。int

c

=

12;System.out.println("c="

+

c);表达式

表达式是符合一定语法规则的运算符和操作数的序列

a

5.0

+

a

(a-b)*c-4

i<30

&&

i%10!=0

表达式的类型和值

对表达式中操作数进行运算得到的结果称为表达式的值。

表达式值的数据类型即为表达式的类型。

表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行。

优先级相同的运算符按照事先约定的结合方向进行。. (

) {

}

;

,++-- ~

!

(data

type)*

/

%+

-<<

>>

>>><

>

<=

>=

instanceof==

!=&^|&&||?

:R

to

LL

to

RL

to

RL

to

RL

to

RL

to

RL

to

RL

to

RL

to

RL

to

RL

to

RR

to

LR

to

L=

*=

/=

%=+=

-=

<<=

>>=>>>=

&=

^=

|=低高计算细节

char

c

=

(char)(Math.random()*26+’a’);

Math.random()返回一个double值

所以26被转成double进行乘法运算,乘积是个double

为了完成加法,a必须被转成double

最后获得的double再转成char

如果从29.7转成char,是30还是29?

Math.random()输出0-1之间的数。[0,1)“三目条件运算符,语法格式:

x?y:z其中x为boolean

类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y

的值,否则整个运算结果为表达式z

的值。举例:int

score

=

80;

int

x

=

-100;String

type=score<60?"不及格":"及格";int

flag=x>0?1:(x==0?0:-1);System.out.println("type="+type);System.out.println("flag="+flag);type=及格flag=

-1三目条件运算符语句

条件语句-根据不同条件,执行不同语句。

if

if

..else

if

..

else

if

if

..

else

if

..

else

if

..

else

switch

循环语句–重复执行某些动作

for

(JDK1.5语法)

while

do

..

while;if语句ifif

..

else

..if

..

else

if

..if

..

else

if

..

else

if

..if

..

else

if

..

else

if

..

else只有一句需要执行的语句时,可以省略{},但是不推荐省略小心不要在if后面加;TestIF.javafor循环语句for

语句为如下形式:for(表达式1;

表达式2;

表达式3){

语句;…;}执行过程首先计算表达式1,接着执行表达式2,若表达式2的值=ture,则执行语句,接着计算表达式3,再判断表达式2的值;依此重复下去,直到表达式2的值=falsefor语句中三个表达式都可以省略JDK1.5新补充的for语法(后面课程中补充,数组)计算表达式3结束for语句表达式2值=true语

句计算表达式1=falsepublic

class

Test

{public

static

void

main(String

args[])

{long

result

=

0;long

f

=

1;for

(int

i

=

1;

i

<=

10;

i++)

{f

=

f

*

i;result

+=

f;}System.out.println("result="

+

result);}}计算result=1!+2!+…+10!课堂练习编写程序,用一个for

循环计算

1+3+5+7+……+99的值,并输出计算结果。(OddSum.java)while

&

do

while语句

while

语句为如下形式:while(逻辑表达式){语句;…;}

执行过程先判断逻辑表达式的值。若=true.则执行其后面的语句,然后再次判断条件并反复执行,直到条件不成立为止表达式值语

句结束

while

语句为如下形式:do{语句;…;}while(逻辑表达式);

执行过程先执行语句,再判断逻辑表达式的值,若为true,再执行语句,否则结束循环。语

句表达式值结束While

语句TestWhile.javado-While

语句变量的作用域

{

}内部Scope.javabreak

&

Continue

语句break语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出循环;例如:public

class

Test

{public

static

void

main(Stringargs[])

{int

stop

=

4;for

(int

i

=

1;

i

<=

10;

i++)

{//当i等于stop时,退出循环

if

(i==stop)

break;System.out.println("

i=

"

+

i);}}}i=1i=2i=3continue

语句用在循环语句体中,用于终止某次循环过程,跳过循环体中continue语句下面未执行的循环,开始下一次循环过程;例如:public

class

Test

{public

static

void

main(Stringargs[])

{int

skip

=

4;for

(int

i

=

1;

i

<=

5;

i++)

{//当i等于skip时,跳过当次循环

if

(i==skip)

continue;System.out.println("i

=

"

+

i);}}}i=1i=2i=3i=5循环语句举例//输出1~100内前5个可以被3整除的数。public

class

Test

{public

static

void

main(Stringargs[]){int

num

=

0,

i

=

1;while

(i

<=

100)

{if

(i

%

3

==

0)

{System.out.print(i

+

"

");num++;}if

(num

==

5)

{break;}i++;}}}//输出101~200内的质数,

public

class

Test{public

static

void

main(Stringargs[])

{for

(int

i=101;

i<200;

i+=2)

{boolean

f

=

true;for

(int

j

=

2;

j

<

i;

j++)

{if

(i

%

j

==

0)

{f

=

false;break;}}if

(!f)

{continue;}System.out.print("

"

+

i);}}}switch语句(条件语句补充)

switch()

{case

xx

:….case

xx

:….default:….

}

小心case穿透,推荐使用break语句

多个case可以合并到一起

default可以省略,但不推荐省略

Switch的值必须是int类型TestSwitch.java方法Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,声明格式:[修饰符1

修饰符2 …]

返回值类型

方法名(形式参数列表){Java语句;…

…}形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据。返回值:方法在执行完毕后返还给调用它的环境的数据。返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回值类型void。Java语言中使用下述形式调用方法:对象名.方法名(实参列表)实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配,return语句终止方法的运行并指定要返回的数据。Java中进行函数调用中传递参数时,遵循值传递的原则:基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身。TestMethod.java递

调 用

recursion

recursive//分析下面程序的运行结果。

public

class

Test{public

static

void

main(String

arg[]){System.out.println(method(5));}public

static

int

method(int

n){if(n

==

1)return

1;elsereturn

n*method(n-1);}}if(n

==

1)return

1;elsereturnn*method(n-1)n=3if(n

==

1)return

1;elsereturnn*method(n-1)n=2if(n

==

1)return

1;elsereturnn*method(n-1)n=1return

1n=2return

1*2=2n=1…

…method(3)…

…n=3return

1*2*3=6递

用递归调用指在方法执行过程中出现该方法本身的调用例如:求Fibonacci数列:1,

1,

2,

3,

5,8,…第40个数的值。数列满足递推公式:Fn

=

Fn

1

+

Fn

2F1

=

1,

F2

=

1 (

n

>

2

)public

class

Test

{public

static

void

main(String

arg[])

{System.out.println(f(5));}public

static

int

f(int

n)

{if

(n

==

1

||

n

==

2)

{return

1;}

else

{return

f(n

-

1)

+

f(n

-

2);}}}课堂练习试用非递归调用的方法解决上面Fibonacci

数列问题Fab.javaf4f5mainf3f2f1f2f3f2f1public

static

int

f(int

n)

{if

(n

==

1

||

n

==

2)

{return

1;}

else

{return

f(n

-

1)

+

f(n

-

2);}}123n1n2resultEx5汉诺塔(编程思想训练)游戏的目标把A杆上的金盘全部移到C杆上,并仍按原有顺序叠好。条件每次只能移动一个盘,并且在每次移动都不允许大盘移到小盘之上。编程要求利用递归调用技术给出N个盘从A杆移到C杆的移动过程。Ex5汉诺塔HANOI(N,A,B,C)•1.以C盘为临时杆,从A杆将1至N-1号盘移至B杆。•HANOI(N-1,A,C,B)•2.将A杆中剩下的第N号盘移至C杆。•3.以A杆为临时杆,从B杆将1至N-1号盘移至C杆。•HANOI(N-1,B,A,C)汉诺塔参考代码以C盘为临时杆,从A杆将1

至N-1

号盘移至B

杆。将A杆中剩下的第N

号盘移至C杆。以A杆为临时杆,从B杆将1

至N-1号盘移至C

杆。public

classTest{public

static

void

main(String

args[]){Testt=new

Test();t.hanoi(3,'A','B','C');}public

void

hanoi(int

num,char

a,char

b,char

c){if(num

==

0)

return;this.hanoi(num-1,a,c,b);System.out.println("move

plate

p"

+

num

+

"

from

"

+

a

+

"

to

"

+

c);this.hanoi(num-1,b,a,c);}}hanoi(3,a,b,c)hanoi(1,a,c,b)move

2

from

a

to

chanoi(1,b,a,c)hanoi(2,a,c,b)move

3

from

a

to

chanoi(2,b,a,c)hanoi(1,a,c,b)move

2

from

a

to

chanoi(1,b,a,c)hanoi(0,a,c,b)move

1

from

a

to

chanoi(0,b,a,c)hanoi(0,a,c,b)move

1

from

a

to

chanoi(0,b,a,c)hanoi(0,a,c,b)move

1

from

a

to

chanoi(0,b,a,c)hanoi(0,a,c,b)move

1

from

a

to

chanoi(0,b,a,c)if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;if

(num

==

0)return;

Classpath

程序格式的视频是否看了

别使用UtralEdit运行java

递归,想象成又拷贝了一份方法,当前方法由于没有确定的值,尚没有返回

UltraEdit有没有高亮显示?第三章:J2SE

之面向对象编程本章内容编程语言的发展类的继承面向过程的设计思想面向对象的设计思想方法的重写Object类对象和类的概念对象转型类之间的关系多态对象和引用Java

类的定义抽象类接口构造函数对象的创建和使用this

关键字static

关键字package

和import

语句访问控制编程语言的发展机器语言-直接由计算机的指令组成,指令、数据、地址都以“0”和“1”的符合串组成;可以被计算机直接执行。汇编语言-用容易理解和记忆的符号表示指令、数据以及寄存器等,抽象层次很低,程序员需要考虑大量的机器细节。高级语言-屏蔽了机器细节,提高了语言的抽象层次接近于人的自然语言,60年代出现的结构化编程语言提出了结构化数据和语句,数据和过程抽象等概念。面向对象的语言-与已往的各种语言的根本不同是,它的设计出发点就是为了更能直接的描述问题域中客观存在的事物。语言的发展是朝着人类更容易理解的方向前进面向对象编程语言三大特征

隐藏/封装

继承

多态面向过程的设计思想和面向对象的设计思想

我要去新疆

面向过程

我开车,我挂档,我踩油门,我过河北,我过陕西…

面向对象

我命令车去新疆

车怎么去不关我事

信息封装在车这个类的内部

我不用去了解车整个开动的过程对象和类的概念职员A实例化

对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。

类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性。

类可以看成一类对象的模板,对象可以看成该类的一个具体实例。类 对象抽象类(对象)之间的关系之关联关系继承关系(一般和特殊)XX是一种XX聚合关系(整体和部分)聚集组合实现关系多

态Java与面向对象

对象是Java程序的核心,在Java程序中“万事万物皆对象”。

类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法。

类可以看成是静态属性(成员变量)和动态属性(方法)的封装体。

J2SDK提供了很多类供编程人员使用,编程人员也可定义自己的类。我们的语言:成员变量=属性方法=函数为什么用对象?

面向对象的编程—一组对象互相配合通过沟通完成特定功能

所有的paradigm都是对现实问题的抽象

汇编是对机器语言的抽象

面向过程的语言是对汇编的抽象

对象更加符合对于现实问题的抽象

对象都有对外服务的接口

通过继承可以复用

对象隐藏内部服务的实现

通过聚合可以复用

面向对象更加容易使我们达到这些年来苦苦追求的境界

Reusability、Extensibility、Maintainablity维护和替换更加方便、...

组件—比对象更高的层次上的抽象(二进制级别)

EJB、Web

Service、CORBA、COM、...Java类的定义,成员变量的声明,方法的声明//用class

关键字定义一个类,例如:class

Person

{//成员变量定义

private

int

id;private

int

age

=

20;//方法定义public

int

getAge()

{return

age;}public

void

setAge(int

i)

{age

=

i;}public

int

getId()

{return

id;}}类的定义主要由两方面组成

成员变量和方法。声明成员变量的格式为:[<modifiers>]

type<attr_name>[=defaultValue];例如:

private

int

id; private

int

age

=

20;声明方法的格式为:[<

modifiers>]

<

modifiers>

<return_type>

<name>([<

argu_list>])

{[<

statements>]}

例如:public

int

getAge()

{return

age;}成员变量成员变量可以使用Java语言中任何一种成员变量类型取值数据类型(包括基本类型和引用类型)。byte0在定义成员变量时可以对其初始化,如short0果不对其初始化,Java使用默认的值对int0其初始化。(右图)long0L成员变量的作用范围为整个类体。char'\u0000'float0.0Fdouble0.0Dbooleanfalse所有引用类型nullJava面向对象基本概念-引用Java语言中除基本类型之外的变量类型都称之为引用类型。Java中的对象是通过引用对其操作的。例如:/*声明了一个String类型的引用变量,但并没有使它指向一个对象*/String

s;/*使用new语句创建了一个String类型的对象并用s指向它以后可以通过s完成对其的操作*/s

=

new

String("hello

world!");String

s;nulls

=

new

String("hello

world!");0x3a123b…

……

……

…0x3a123b堆内存如何在内存中区分类和对象?

类是静态的概念,代码区

对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量)而方法只有一份,执行的时候才占用内存。方法(复习)Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,声明格式:[修饰符1

修饰符2 …]

返回值类型

方法名(形式参数列表){Java语句;…

…}形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据。返回值:方法在执行完毕后返还给调用它的环境的数据。返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回值类型void。Java语言中使用下述形式调用方法:对象名.方法名(实参列表)实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配,return语句终止方法的运行并指定要返回的数据。Java中进行函数调用中传递参数时,遵循值传递的原则:基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身。TestMethod.java类和对象的关系类C的代码(code

seg)(heap

seg)class

C

{int

i;int

j;..main..

{C

c1

=

newC();C

c2

=

newC();}}xxxxxxxxc1c2c1.ic1.jc2.ic2.j对象的创建和使用必须使用new

关键字创建对象。

Person

person=

new

Person();使用对象(引用)

.成员变量来引用对象的成员变量。

person.age使用对象(引用)

.方法(参数列表)来调用对象的方法。

person.

setAge(23)同一类的每个对象有不同的成员变量存储空间。同一类的每个对象共享该类的方法。构造方法使用new+构造方法创建一个新的对象。构造方法是定义在Java

类中的一个用来初始化对象的方法。构造方法与类同名且没有返回值。例如:Person

类的构造函数:publicclassPerson{intid;intage;Person(int

n,int

i){id

=

n;age

=

i;}}构造方法的调用public

class

Test

{public

static

void

main(String

args[])

{Person

tom

=

new

Person(1,25);Person

john

=

new

Person(2,27);}}创建对象时,使用构造方法初始化对象的成员变量。堆内存***125227###tomjohn内存分析

(1)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存******221232p2p1栈内存TestPerson1/TestPerson.java内存分析

(2)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存25******221232agep2p1栈内存code

segjava

TestTest.classJava.exe

JVM1:load

the

Test.classclasspath2:verify

the

classcode3:executemain()execute

mainargsallocate

spaces

for

argsPerson.classPerson

p1

=

new

Person(1,

25)1:find

the

Person.classclasspath2:load

it3:

…..lazy

loadp1125age:25int

age

=

25;p1.setAge(age);内存分析

(2)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存221232p2p1age栈内存2525******i内存分析

(3)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存25******251232栈内存agep2p1内存分析

(4)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存26******251252栈内存agep2p1内存分析

(4)public

class

Test

{public

static

void

main(String

args[])

{Person

p1

=

new

Person(1,

22);Person

p2

=

new

Person(2,

23);int

age

=

25;p1.setAge(age);p2.setAge(age++);}}堆内存251252栈内存agep2p1构造方法当没有指定构造方法时,编译器为类自动添加形如类名(){}的构造方法。如果已有,编译器就不再添加了。例如:class

Point

{public

int

x;public

int

y;}…

…Point

p

=

new

Point();…

…堆内存00###p调用过程演示(1)Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.change1(date);test.change2(d1);test.change3(d2);…

…public

void

change1(int

i){i

=

1234;}public

void

change2(BirthDate

b){b

=

new

BirthDate(22,2,2004);}public

void

change3(BirthDate

b){b.setDay(22);}堆内存3547525879349110925112000771970datetestd2d1main栈内存TestBirthdate/Test.java调用过程演示(2)堆内存datetest93547525879349110925112000771970Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.change1(date);test.change2(d1);test.change3(d2);…

…public

void

change1(int

i){ i

=

1234;}public

void

change2(BirthDate

b){b

=

new

BirthDate(22,2,2004);}public

void

change3(BirthDate

b){b.setDay(22);}mainid2d1栈内存change1调用过程演示(3)堆内存12343547525879349110925112000771970Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.change1(date);test.change2(d1);test.change3(d2);…

…public

void

change1(int

i){i

=

1234;

}public

void

change2(BirthDate

b){b

=

new

BirthDate(22,2,2004);}public

void

change3(BirthDate

b){b.setDay(22);}mainid2d1datetest栈内存change1调用过程演示(4)堆内存3547525879349110925112000771970Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.change1(date);test.change2(d1);test.change3(d2);…

…public

void

change1(int

i){i

=

1234;}public

void

change2(BirthDate

b){b

=

new

BirthDate(22,2,2004);}public

void

change3(BirthDate

b){b.setDay(22);}d2d1datetestmain栈内存调用过程演示(5)堆内存5879343547525879349110925112000771970Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.change1(date);test.change2(d1);test.change3(d2);…

…public

void

change1(int

i){i

=

1234;}public

void

change2(BirthDate

b){b

=

new

BirthDate(22,2,2004);}public

void

change3(BirthDate

b){b.setDay(22);}mainchange2bd2d1datetest栈内存调用过程演示(6)堆内存5879763547525879349110925112000771970Test

test

=

new

Test();int

date

=

9;BirthDate

d1=new

BirthDate(7,7,1970);BirthDate

d2=new

BirthDate(1,1,2000);test.chang

温馨提示

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

评论

0/150

提交评论