null内容内容第一章:JAVA概述
第二章:JAVA语言基础
第三章:面向对象编程
第四章:JAVA异常处理机制
第五章:数组
第六章:JAVA常用类
第七章:JAVA容器类
第八章:JAVA流技术
第九章:JAVA多线程机制
第十章:JAVA网络编程
第十一章:GUI编程第一章:J2SE 之 JAVA概述第一章:J2SE 之 JAVA概述想学习J2ME、JSP/Servlet、J2EE吗?
请打好基础—J2SE内容内容计算机语言的历史以及Java语言的历史地位
Java自身的发展史
Java体系
Java的特点
Java的运行机制
Java运行环境的安装与配置
第一个程序HelloWorld计算机语言发展史及Java的历史地位计算机语言发展史及Java的历史地位第一代语言
第一代语言或机器语言是一种低级的面向计算机的程序设计语言,使用0和1表示各种命令。
第二代语言
汇编
第三代语言
C、Pascal、Fortran面向过程的语言
C++面向过程/面向对象
Java跨平台的纯面向对象的语言
.NET跨语言的平台Java发展史与java体系Java发展史与java体系95年,Sun发布JDK1.0
98年,JDK1.2,更名为Java2
后续JDK1.3、1.4
目前JDK1.5,更名为Java 5.0 (最新为JDK 6 Update 3)
我们使用5.0j2sejava webj2eej2me移动增值JAVA能开发那些类型的程序?Java语言的特点Java语言的特点一种面向对象的语言。
一种平台无关的语言,提供程序运行的解释环境。
一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序运行机制及运行过程Java程序运行机制及运行过程核心机制之Java虚拟机核心机制之Java虚拟机Java虚拟机可以理解成一个以字节码为机器指令的 CPU。
对于不同的运行平台,有不同的虚拟机。
Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。核心机制之垃圾收集核心机制之垃圾收集garbage collector
不再使用的内存空间应回收-垃圾收集。
在C/C++ 等语言中,由程序员负责回收无用内存。
Java语言消除了程序员回收无用内存空间的责任;它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间。
垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预。
J2SDK & JREJ2SDK & JRESoftware Devleopment Kit (软件开发包)
Java Runtime Environment (Java运行环境)
开发需要JDK
用户只需JRE开发JDK的不止一家开发JDK的不止一家最主流的是Sun公司发布的JDK
除了Sun之外,还有很多公司和组织都开发了自己的JDK
IBM公司开发的JDK, IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多
BEA公司的Jrocket,专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多
GNU组织开发的JDK
Java开发环境的下载 安装 配置Java开发环境的下载 安装 配置 配置Java开发环境步骤(WindowsXP)
下载并安装最新版本的J2SDK。
设置 Windows 环境变量。PATH/CLASSPATH
选择合适的文本编辑器或使用集成开发环境。下载 http://java.sun.com
安装
配置 path & classpath
验证
java 运行java程序
javac 编译java程序HelloWorld.javaJava Application初步Java Application初步Java源文件以“java”为扩展名。源文件的基本组成部分是类(class),如本例中的 HelloWorld 类。
一个源文件中最多只能有一个public 类。其它类的个数不限,如果源文件包含一个public 类,它必需按该类名命名。
Java 应用程序的执行入口是 main()
。它有固定的
写格式:
public static void main(String args[]) {…}
Java 语言中严格区分大小写。
Java 方法由一条条语句构成,每个语句以分号结束。
Java语言有三种注释方式:
// 用于单行注释/*
用于多行注释
*//**
* 用于多行注释,且可以被 doc 工具解析
*/常见Java 开发环境常见Java 开发环境编辑器
UltraEdit
EditPlus
集成开发环境(IDE Integrated Development Environment):
JBuilder (http://www.borland.com)
Eclipse (http://www.eclipse.org)
Sun One Studio Net Beans(http://java.sun.com)
WSADRAD (http://www.ibm.com)
WebSphere Application Developer
Rational Application Developer
IntelliJ IDEA 常见错误常见错误出现如下错误的原因:‘java’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
编译javac Test.java,明明看到该文件,为何找不到?HelloWorld.java.txt
显示扩展名!
程序员的桌面设置 (详细列表 / 显示所有文件 / 标题栏地址栏全路径)java命令运行的是那个版本?java命令运行的是那个版本?如果安装了多个版本jdk,那么java命令运行的是那个版本的呢?
java –version
java –verbose
java -verbose HelloWorld
有时候,修改了一个jdk下面的配置,但始终无法生效。就是这个道理。第二章:J2SE 之 基础语法第二章:J2SE 之 基础语法内容内容标识符
关键字
Java 基本数据类型
运算符
表达式和语句
分支
循环
方法
变量的作用域
递归调用
标识符标识符Java 语言中,对各种变量、方法和类等要素命名时使用的字符序列称为标识符。
Java 标识符有如下命名规则:
标识符由字母、下划线“_” 、美元符“$”或数字组成。
标识符应以字母、下划线 、美元符开头。
Java 标识符大小写敏感,长度无限制。
约定俗成:Java 标识符选取因注意“见名知意”且不能与 Java 语言的关键字重名。
关键字关键字Java 中一些赋以特定的含义,用做专门用途的字符串称为关键字(keyword)。
所有Java关键字都是小写英文字符串。
goto 和 const 虽然从未使用,但也作被为 Java 关键字保留。
Java常量Java常量Java 的常量值用字符串表示,区分不同的数据类型。
如整型常量 123
实型常量 3.14
字符常量 ‘a’
逻辑常量 true、false
字符串常量 “helloworld”
null
注意:
区分字符常量和字符串常量
区分 null 和 “”
Java变量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到内存区2:找到main方法开始执行heapstackdata segmentcode segment3:执行过程中的内存管理存放代码静态变量
字符串常量局部变量new出来的东西Java变量的分类Java变量的分类按被声明的位置划分:
局部变量:方法或语句块内部定义的变量
成员变量:方法外部、类的内部定义的变量
注意:类外面(与类对应的大括号外面)不能有变量的声明
按所属的数据类型划分:
基本数据类型变量
引用数据类型变量
Java局部变量与成员变量Java局部变量与成员变量方法体内部声明的变量(包括形参)称为局部变量:
方法体内部是指与方法对应的大括号内部
在方法体外,类体内声明的变量成为成员变量
public void method() {
int i;
int j = i+5 ; // 编译出错,变量i还未被初始化
double d = 3.14;
}
注:以上程序目前还不能编译TestVar.javaJava数据类型的划分Java数据类型的划分数据类型基本数据类型引用数据类型数值型字符型(char)布尔型(boolean)整数类型(byte,short,int,long)浮点类型(float, double)类(class)接口(interface)数组Java基本数据类型Java基本数据类型Java中定义了4类8种基本数据类型。
逻辑型-boolean
字符型- char
数值型
整数型- byte, short, int, long
浮点数型- float, double
逻辑型Boolean逻辑型Booleanboolean 类型适于逻辑运算,一般用于程序
控制 。
boolean 类型数据只允许取值 true 或 false ,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
用法举例:
boolean flag;
flag = true;
if(flag) {
//do something
}
字符型char字符型charchar 型数据用来表示通常意义上的“字符”
字符常量为用单引号括起来的单个字符,例如:
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整数类型整数类型Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。
Java 语言整型常量的三种表示形式:
十进制整数,如:12, -314, 0。
八进制整数,要求以 0 开头,如:012。
十六进制数,要求 0x 或 0X 开头,如:0x12 。
Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
int i1 = 600; //正确 long l1 = 88888888888L; //必须加l否则会出错浮点类型浮点类型与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。
Java 浮点类型常量有两种表示形式
十进制数形式,例如: 3.14 314.0 .314
科学记数法形式,如 3.14e2 3.14E2 100E-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类型的。
课堂练习课堂练习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=21
i=22 i2=22
i=9 i1=9
i=9 i1=8 注意:
++(--)
在前时先运算再取值。
在后时先取值再运算。逻辑运算符逻辑运算符逻辑运算符: !-逻辑非 &- 逻辑与 | - 逻辑或 ^ - 逻辑异或 &&- 短路与 || - 短路或
&&, ||,! 逻辑运算符只能用于boolean身上。public 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;字符串连接符字符串连接符“+” 除用于算术加法运算外,还可用于对字符串进行连接操作
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
表达式的类型和值
对表达式中操作数进行运算得到的结果 称为表达式的值。
表达式值的数据类型即为表达式的类型 。
表达式的运算顺序
应按照运算符的优先级从高到低的顺序进行。
优先级相同的运算符按照事先约定的结合方向进行。
计算细节计算细节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语句if语句if
if .. else ..
if .. else if ..
if .. else if .. else if ..
if .. else if .. else if .. else
只有一句需要执行的语句时,可以省略 { },但是不推荐省略
小心不要在if后面加 ; TestIF.javafor 循环语句for 循环语句for 语句为如下形式: for(表达式1; 表达式2; 表达式3){ 语句; … ; }
执行过程 首先计算表达式1,接着执行表达式2,若表达式2的值 = ture,则执行语句,接着计算表达式3,再判断表达式2的值;依此重复下去,直到表达式2的值=false for语句中三个表达式都可以省略 JDK1.5新补充的for语法(后面课程中补充,数组) public 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 & do while 语句while 语句为如下形式:
while(逻辑表达式){ 语句; … ; }
执行过程
先判断逻辑表达式的值。若=true.则执行其后面的语句,然后再次判断条件并反复执行,直到条件不成立为止while 语句为如下形式:
do { 语句; … ; } while(逻辑表达式);
执行过程
先执行语句,再判断逻辑表达式的值,若为true,再执行语句,否则结束循环。
TestWhile.java变量的作用域变量的作用域{
}内部
Scope.javabreak & Continue 语句break & Continue 语句break 语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出循环;例如:
public class Test {
public static void main(String args[]) {
int stop = 4;
for (int i = 1; i <= 10; i++) {
//当i等于stop时,退出循环
if (i == stop) break;
System.out.println(" i= " + i);
}
}
}i = 1
i = 2
i = 3continue 语句用在循环语句体中,用于终止某次循环过程,跳过循环体中 continue 语句下面未执行的循环,开始下一次循环过程;例如:
public class Test {
public static void main(String args[]) {
int skip = 4;
for (int i = 1; i <= 5; i++) {
//当i等于skip时,跳过当次循环
if (i == skip) continue;
System.out.println("i = " + i);
}
}
}i = 1
i = 2
i = 3
i = 5循环语句举例循环语句举例// 输出1~100内前5个可以被3整除的数。
public class Test {
public static void main(String args[]){
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(String
args[]) {
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语句(条件语句补充)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递 归 调 用 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;
else
return n*method(n-1);
}
}递 归 调 用递 归 调 用递归调用指在方法执行过程中出现该方法本身的调用例如: 求Fibonacci数列: 1, 1, 2, 3, 5, 8, …第40个数的值。 数列满足递推公式:
F1 = 1, F2 = 1 Fn = Fn – 1 + Fn – 2 ( 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.javanullmainf5f4f3f2f1f2f3f2f1 public static int f(int n) { if (n == 1 || n == 2) { return 1; } else { return f(n - 1) + f(n - 2); } } null123n1n2resultEx5汉诺塔(编程思想训练)Ex5汉诺塔(编程思想训练)游戏的目标
把 A杆上的金盘全部移到C杆上,并仍按原有顺序叠好。
条件
每次只能移动一个盘,
并且在每次移动都不允许大盘移到小盘之上。
编程要求
利用递归调用技术给出N个盘从A杆移到C杆的移动过程。Ex5汉诺塔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)汉诺塔参考代码汉诺塔参考代码1.以C盘为临时杆,从A杆将1 至N-1 号盘移至B 杆。
2.将A杆中剩下的第N 号盘移至C杆。
3.以A杆为临时杆,从B杆将1 至N-1 号盘移至C 杆。public class Test{
public static void main(String args[]){
Test t = 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);
}
}nullhanoi(3,a,b,c)hanoi(2,a,c,b)
move 3 from a to c
hanoi(2,b,a,c)hanoi(1,a,c,b)
move 2 from a to c
hanoi(1,b,a,c)hanoi(1,a,c,b)
move 2 from a to c
hanoi(1,b,a,c)hanoi(0,a,c,b)
move 1 from a to c
hanoi(0,b,a,c)hanoi(0,a,c,b)
move 1 from a to c
hanoi(0,b,a,c)hanoi(0,a,c,b)
move 1 from a to c
hanoi(0,b,a,c)hanoi(0,a,c,b)
move 1 from a to c
hanoi(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;nullClasspath
程序格式的视频是否看了
别使用UtralEdit运行java
递归,想象成又拷贝了一份方法,当前方法由于没有确定的值,尚没有返回
UltraEdit有没有高亮显示?第三章:J2SE 之 面向对象编程第三章:J2SE 之 面向对象编程本章内容本章内容编程语言的发展
面向过程的设计思想
面向对象的设计思想
对象和类的概念
类之间的关系
对象和引用
Java 类的定义
构造函数
对象的创建和使用
this 关键字
static 关键字
package 和 import 语句
访问控制
类的继承
方法的重写
Object类
对象转型
多态
抽象类
接口编程语言的发展编程语言的发展机器语言-直接由计算机的指令组成,指令、数据、地址都以“0”和“1”的符合串组成;可以被计算机直接执行。
汇编语言-用容易理解和记忆的符号表示指令、数据以及寄存器等,抽象层次很低,程序员需要考虑大量的机器细节。
高级语言-屏蔽了机器细节,提高了语言的抽象层次接近于人的自然语言,60年代出现的结构化编程语言提出了结构化数据和语句,数据和过程抽象等概念。
面向对象的语言-与已往的各种语言的根本不同是,它的设计出发点就是为了更能直接的描述问题域中客观存在的事物。语言的发展是朝着人类更容易理解的方向前进面向对象编程语言三大特征 面向对象编程语言三大特征 隐藏/封装
继承
多态面向过程的设计思想和面向对象的设计思想面向过程的设计思想和面向对象的设计思想我要去新疆
面向过程
我开车,我挂档,我踩油门,我过河北,我过陕西…
面向对象
我命令车去新疆
车怎么去不关我事
信息封装在车这个类的内部
我不用去了解车整个开动的过程对象和类的概念对象和类的概念对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性。
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。类(对象)之间的关系 之 关联关系类(对象)之间的关系 之 关联关系继承关系(一般和特殊)继承关系(一般和特殊)XX是一种XX聚合关系(整体和部分)聚合关系(整体和部分)聚集组合实现关系实现关系多 态多 态Java与面向对象Java与面向对象对象是Java程序的核心,在Java程序中“万事万物皆对象”。
类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法。
类可以看成是静态属性(成员变量)和动态属性(方法)的封装体。
J2SDK提供了很多类供编程人员使用,编程人员也可定义自己的类。
我们的语言:成员变量=属性 方法=函数为什么用对象?为什么用对象?面向对象的编程—一组对象互相配合通过沟通完成特定功能
所有的paradigm都是对现实问题的抽象
汇编是对机器语言的抽象
面向过程的语言是对汇编的抽象
对象更加符合对于现实问题的抽象
对象都有对外服务的接口
通过继承可以复用
对象隐藏内部服务的实现
通过聚合可以复用
面向对象更加容易使我们达到这些年来苦苦追求的境界
Reusability、Extensibility、Maintainablity维护和替换更加方便、...
组件—比对象更高的层次上的抽象(二进制级别)
EJB、Web Service、CORBA、COM、...
Java 类的定义,成员变量的声明,方法的声明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>
([< argu_list>]) {
[< statements>]
} 例如: public int getAge() {return age;}成员变量成员变量成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。(右图)
成员变量的作用范围为整个类体。Java面向对象基本概念 - 引用Java面向对象基本概念 - 引用Java 语言中除基本类型之外的变量类型都称之为引用类型。
Java中的对象是通过引用对其操作的。例如:
/*
* 声明了一个String类型的引用变量,
* 但并没有使它指向一个对象
*/
String s;
/*
* 使用new语句创建了一个String
* 类型的对象并用s指向它
* 以后可以通过s完成对其的操作
*/
s = new String("hello world!");如何在内存中区分类和对象?
类是静态的概念,代码区
对象是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 = new C();
C c2 = new C();
}
}xxxxxxxxc1c2c1.ic1.jc2.ic2.j对象的创建和使用对象的创建和使用 必须使用 new 关键字创建对象。
Person person= new Person ();
使用对象(引用) . 成员变量来引用对象的成员变量。
person.age
使用对象(引用) . 方法(参数列表)来调用对象的方法。
person. setAge(23)
同一类的每个对象有不同的成员变量存储空间。
同一类的每个对象共享该类的方法。构造方法构造方法使用 new + 构造方法 创建一个新的对象。
构造方法是定义在 Java 类中的一个用来初始化对象的方法。
构造方法与类同名且没有返回值。
例如: Person 类的构造函数: public class Person {
int id;
int age;
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);
}
}创建对象时,使用构造方法初始化对象的成员变量。堆内存***###tomjohn内存分析 (1)内存分析 (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++);
}
}堆内存******p1p2栈内存TestPerson1/TestPerson.java内存分析 (2)内存分析 (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++);
}
}堆内存******25p1p2age栈内存nullcode segjava TestTest.classJava.exe JVM
1:load the Test.class
classpath
2:verify the class code
3:execute
main()nullexecute mainargsallocate spaces for argsnullPerson p1 = new Person(1, 25)Person.class1:find the Person.class
classpath
2:load it
3: …..lazy loadnullp1125age:25int age = 25;
p1.setAge(age);内存分析 (2)内存分析 (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++);
}
}堆内存******25p1p2age栈内存25i内存分析 (3)内存分析 (3)25public 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++);
}
}堆内存******p1p2栈内存age内存分析 (4)内存分析 (4)26public 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++);
}
}堆内存******p1p2栈内存age内存分析 (4)内存分析 (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++);
}
}堆内存p1p2栈内存age构造方法构造方法 当没有指定构造方法时,编译器为类自动添加形如
类名( ) { } 的构造方法。如果已有,编译器就不再添加了。
例如: class Point {
public int x;
public int y;
}
… … …
Point p = new Point();
… … …
堆内存###p调用过程演示(1)调用过程演示(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