Java面向对象教程.docx
《Java面向对象教程.docx》由会员分享,可在线阅读,更多相关《Java面向对象教程.docx(18页珍藏版)》请在冰豆网上搜索。
Java面向对象教程
Java面向对象教程
第1章变量的生命周期、作用域和参数传递
1.1静态变量、静态方法与实例变量
通过static修饰符来修饰类的静态变量、静态方法、实例变量和代码块。
用static修饰的成员变量表示静态变量,可以直接通过类名来访问。
用static修饰的成员方法表示静态方法,可以直接通过类名来访问。
用static修饰的程序代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。
被static所修饰的成员变量和成员方法表明归某个类所有,它不依赖于类的特定实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时的方法区内定位到它们。
1.1.1静态变量
类的成员变量有两种:
一种是被static修饰的变量,叫类变量或静态变量;另一种是没有被static修饰的变量,叫实例变量。
静态变量和实例变量的区别如下:
静态变量在内存中只有一个拷贝,运行时Java虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。
可以直接通过类名访问静态变量。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
Java语言不支持不属于任何类的全局变量,静态变量提供了这一功能,它有如下两个作用:
能被类的所有实例共享,可作为实例之间进行交流的共享数据。
如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间。
1.1.2静态方法
1.1.3静态方法main
1.1.4静态代码块
1.1.5静态变量和实例变量的生命周期
静态变量和实例变量。
两者的区别在于:
类的静态变量在内存中只有一个,Java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。
静态变量可以直接通过类名被访问。
静态变量的生命周期取决于类的生命周期,当加载类的时候,静态变量被创建并分配内存,当卸载类的时候,静态变量被销毁并撤销所占用的内存。
类的每个实例都有相应的实例变量。
每创建一个类的实例,Java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中。
实例变量的生命周期取决于实例的生命周期,当创建实例的时候,实例变量被创建并分配内存,当销毁实例的时候,实例变量被销毁所占内存。
1.2局部变量的生命周期及作用域
当Java虚拟机调用一个方法时,会为这个方法中的局部变量分配内存。
当Java虚拟机结束调用一个方法时,会结束这个方法中局部变量的生命周期。
1.2.1将局部变量的作用域最小化
为了将局部变量的作用域最小化,应该遵守以下规则:
在需要用到某局部变量的时候,才定义它。
对于以上的例子,只需要在if代码块中定义var变量即可。
使方法小而集中。
如果一个方法包含多种操作,尽可能把这个方法分解为多个小方法,每个方法负责一项操作。
这些小方法在Java源文件中可集中放在一起。
方法变小了,局部变量的作用域也就自然变小了。
1.3成员变量和局部变量同名
1.3.1this引用
1.3.2再谈变量的命名规则
很多所编写的程序会很长,为了降低程序出错的可能性,大家在定义变量的时候,尽可能不要使用同名的变量名。
而且一定要遵守变量的命名规则:
变量若只有一个单词,全部用小写字母。
变量若由多个单词组成,第一个单词全部用小写字母,其余单词的首字母大写。
变量名不能与Java中的关键字同名。
变量名尽可能做到“见名知意”。
1.4参数传递
参数的传递主要有两种方式:
一个是传值,另一个是传递地址。
1.4.1对象的参数传递过程
如果方法A调用方法B,那么称方法A是方法B的调用者。
如果方法B的参数是基本数据类型,那么方法A向方法B传递参数的值(传值)。
如果方法B的参数是对象或数组,那么方法A向方法B传递对象或数组的引用(传递地址)。
1.5final变量
1.5.1基本数据类型的final特性
final变量具有以下特征:
final修饰符可以修饰静态变量、实例变量、局部变量,分别表示静态常量、实例常量、局部常量。
在前面曾经提到类的成员变量可以不必显示初使化,但是这不适用于fianl类型的成员变量。
final类型变量都必须显式初使化,否则会导致编译错误。
final变量只能赋值一次。
1.5.2final对象
第2章常用系统类、包和访问控制符
2.1常用系统类
2.1.1Object类
Object类是所有Java类的最终祖先,如果一个类在声明时没有包含extends(继承)关键字,那么这个类直接继承Object类。
所有Java类都继承了Object类的方法,包括wait()、notify()、equals()和toString()等。
Object类有以下主要成员方法:
equals(Objectobj):
比较两个对象是否相等。
仅当被比较的两个引用变量指向同一对象时,equals()方法才返回true。
许多Java类都覆盖了这个方法。
toString():
返回当前对象的字符串表示,许多类,如String、StringBuffer和包装类都覆盖了toString()方法,返回具有实际意义的内容。
具体用法见String一章。
finalize():
对于一个已经不被任何引用变量引用的对象,当垃圾回收器准备回收该对象所占用的内存时,将自动调用该对象的finalize()方法。
2.1.2Random类
Java.util.Random类提供了一系列用于生成随机数的方法。
nextInt():
返回下一个int类型的随机数,随机数的值大于或等于0。
nextInt(intn):
返回下一个int类型的随机数,随机数的值大于或等于0,并且小于参数n。
nextLong():
返回下一个long类型的随机数,随机数的值位于long类型的取值范围内。
nextFloat():
返回下一个flaot类型的随机数,随机数的值大于或等于0,并且小于1.0。
newxtDouble():
返回下一个double类型的随机数,随机数的值大于或等于0,并且小于1.0。
nextBoolean():
返回下一个boolean类型的随机数,随机数的值为true或false。
/**
*Random类生成随机数
*/
//引入Random类库
importjava.util.Random;
publicclassTestRandom{
publicstaticvoidmain(String[]args){
Randomr=newRandom();
//生成10个int类型的随机数,取值在0--100之间
System.out.println("0--100之间的10个int类型的随机数:
");
for(inti=0;i<10;i++){
System.out.print(r.nextInt(100)+"");
}
System.out.println("\n");
//生成3个long类型的随机数
System.out.println("3个long类型的随机数:
");
for(inti=0;i<3;i++){
System.out.print(r.nextLong()+"\t");
}
System.out.println("\n");
//生成3个double类型的随机数,取值在0.0--100.0之间
System.out.println("0.0--100.0之间的3个double类型的随机数:
");
for(inti=0;i<3;i++){
System.out.print(r.nextDouble()*100+"\t");
}
System.out.println("\n");
}
}
效果预览0--100之间的10个int类型的随机数:
29698649711099963864
3个long类型的随机数:
-70568270860716178865904022970794544264492954971891037614
0.0--100.0之间的3个double类型的随机数:
95.0190010975435454.7927775541951516.40881203308323
2.1.3Math类
Java.lang.Math类提供了许多用于数学运算的静态方法,包括指数运算、对数运算、平方根运算和三角运算等。
Math类还有两个静态常量:
E(自然对数)和PI(圆周率)。
Math类是final类型的,因此不能有子类。
另外,Math类的构造方法是private类型的,因此Math类不能够被实例化。
Math类的主要方法包括以下几种:
abs():
返回绝对值。
ceil():
返回大于或等于参数的最小整数。
floor():
返回小于或等于参数的最大整数。
max():
返回两个参数的较大值。
Min():
返回两个参数的较小值。
random():
返回0.0和1.0之间的double类型的随机数,包括0.0,但不包括1.0。
round():
返回四舍五入的整数值。
sin():
正弦函数。
cos():
余弦函数。
tan():
正切函数。
exp():
返回自然对数的幂。
sqrt():
平方根函数。
pow():
幂运算。
Java源代码(example14.2)
/**
*Math类中的数学运算方法
*/
publicclassTestMath{
publicstaticvoidmain(String[]args){
//返回绝对值
System.out.println("-12的绝对值:
"+Math.abs(-12));
//返回大于或等于参数的最小整数
System.out.println("大于或等于3.3的最小整数:
"+Math.ceil(3.3));
System.out.println("大于或等于-3.3的最小整数:
"+Math.ceil(-3.3));
//返回小于或等于参数的最小整数
System.out.println("小于或等于3.3的最小整数:
"+Math.floor(3.3));
System.out.println("小于或等于-3.3的最小整数:
"+Math.floor(-3.3));
//返回四舍五入的整数值
System.out.println("3.3四舍五入的整数值"+Math.round(3.3));
System.out.println("-3.3四舍五入的整数值"+Math.round(-3.3));
//返回两个参数的较大或较小值
System.out.println("5和9的较大值:
"+Math.max(5,9));
System.out.println("5和9的较小值:
"+Math.min(5,9));
//返回自然对数E和圆周率PI的值
System.out.println("自然对数E的值:
"+Math.E);
System.out.println("圆周率PI的值:
"+Math.PI);
}
}
效果预览-12的绝对值:
12
大于或等于3.3的最小整数:
4.0
大于或等于-3.3的最小整数:
-3.0
小于或等于3.3的最小整数:
3.0
小于或等于-3.3的最小整数:
-4.0
3.3四舍五入的整数值3
-3.3四舍五入的整数值-3
5和9的较大值:
9
5和9的较小值:
5
自然对数E的值:
2.718281828459045
圆周率PI的值:
3.141592653589793
=--=--对于Math类的round()方法,若参数为double类型,则返回long类型,若参数为float类型,则返回int类型,而ceil()和floor()方法的参数和返回类型都是double。
2.1.4日期时间类
Java语言提供了以下3个类来处理日期时间:
Java.util.Date:
包装了一个long类型数据,表示与GMT(格林尼治标准时间)的1970年1月1日00:
00:
00这一刻所相距的毫秒数。
Java.text.DateFormat:
对日期进行格式化。
Java.util.Calendar:
可以灵活地设置或读取日期中的年、月、日、时、分和秒等信息。
Java源代码(example14.3)
/**
*Date类的使用
*/
//引入Date类库
importjava.util.Date;
publicclassTestDate{
publicstaticvoidmain(String[]args){
//创建一个代表当前日期和时间的Date对象
Datedate=newDate();
//getTime()方法返回Date对象包含的毫秒数
System.out.println(date.getTime());
System.out.println(date);
}
}
效果预览1225697482000
MonNov0315:
31:
22CST2008
DataFormat类
Java源代码(example14.4)
/**
*DateFromat类的使用
*/
//引入Date和DateFormat类库
importjava.util.*;
importjava.text.*;
publicclassTestDateFormat{
publicstaticvoidmain(String[]args){
Datedate=newDate();
//设定日期格式
SimpleDateFormatf=newSimpleDateFormat("yyyy-MMMM-dd-EEEE");
System.out.println(f.format(date));
//设定日期格式
f=newSimpleDateFormat("yy/MM/ddhh:
mm:
ss");
System.out.println(f.format(date));
}
}
效果预览2008-十一月-03-星期一
08/11/0303:
32:
06
解释字符串“yyyy-MMMM-dd-EEEE”决定了日期的格式。
Yyyy表示4位长度的年,MMMM表示月,dd表示日,EEEE表示星期。
“yy/MM/ddhh:
mm:
ss”表示另一种日期格式,yy表示2位长度的年,MM表示2位长度的月,hh、mm和ss分别表示时、分和秒。
说明下例中的TestDateParser类有一个parseDate()方法,它利用DateFormat类把字符串解析为Date对象。
Java源代码(example14.5)
/**
*DateFormat类的parse(Stringtest)方法的使用
*/
importjava.util.*;
importjava.text.*;
publicclassTestDateParser{
publicstaticDateparseDate(Stringtext,Stringformat){
//抛出异常
try{
//解析字符串
returnnewSimpleDateFormat(format).parse(text);
}catch(ParseExceptione){
thrownewRuntimeException(e.getMessage());
}
}
publicstaticvoidmain(String[]args){
//定义日期显示格式
Datedate=parseDate("10-30-2008","MM-dd-yyyy");
System.out.println(date);
date=parseDate("2008/10/3011:
49:
50","yyyy/MM/ddhh:
mm:
ss");
System.out.println(date);
}
}
效果预览ThuOct3000:
00:
00CST2008
ThuOct3011:
49:
50CST2008
解释程序中的try{}catch(){}为异常处理语句。
异常处理将在后面的章节中详解。
DateFormat有一个静态方法:
getDateTimeInstance(intdateStyle,inttimeStyle)。
该方法能返回表示标准格式的DateFormat对象,参数dateStyle设定日期风格,参数timeStyle设定时间风格,这两个参数的可选值都包括:
DateFromat.SHORT、DateFormat.MEDIUM、DateFormat.LONG和DateFormat.FULL。
说明下例中TestGetDateTimeInstance类演示了getDateTimeInstance()的用法。
Java源代码(example14.6)
/**
*DateFormat类中方法getDateTimeInstance()的使用
*/
importjava.util.*;
importjava.text.*;
publicclassTestGetDateTimeInstance{
publicstaticvoidmain(String[]args){
Datedate=newDate();
//设定不同的日期、时间风格
DateFormatshortDateFormat=
DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);
DateFormatmidiumDateFormat=
DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);
DateFormatlongDateFormat=
DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
DateFormatfullDateFormat=
DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
System.out.println(shortDateFormat.format(date));
System.out.println(midiumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
效果预览08-11-3下午3:
34
2008-11-315:
34:
18
2008年11月3日下午03时34分18秒
2008年11月3日星期一下午03时34分18秒CST
Calendar类
Java.util.Calendar类的set()和get()方法可用来设置和读取日期的特定部分,比如年、月、日、时、分和秒等。
Calendar类是抽象类,不能实例化,它有一个具体的子类,即java.util.GregorianCalendar。
GregorianCalendar采用梅林尼治标准时间。
GregorianCalendar类的add()方法可用来在日期的特定部分加上一些值。
2.1.5System类
System系统类是一个独特的类,它是一个final类,所有的方法都是用类变量调用的,换句话说,没有人可以实例化一个System类。
System类主要提供了标准输入、输出以及一些系统环境信息
标准输入、输出
publicstaticfinalInputStreamin-----标准输入。
这个属性是InputStream类的一个对象,关于InputStream类和下面的PrintStream类我们在java.io包中一并介绍,这些类都是关于输入、输出方面的,它们都有各自的属性和方法,我们用过的println()和print()就是printStream类的方法。
publicstaticfinalPrintStreamout------标准输出。
publicstaticfinalPrintStreamerr------标准错误输出。
这些输入、输出属性可以根据其所使用的参数来自动地转换输出格式。
系统环境信息
System类提供了一个方法用来返回系统环境信息:
publicstaticPropertiesgetProperties(argument);
Java虚拟机维护了一系列环境信息,它们都是以“键名/值”对的形式出现的,一旦java虚拟机启动之后,系统就自动将这些变量初始化,其中包含了与运行环境相关的很多信息,具体内容见表14.1。
键名含义
file.separator文件目录分隔符(通常是/)
java.class.pathClasspath
java.class.version类版本
java.homeJava的安装主目录
java.vendor厂商定义信息
java.vendor.url厂商url
java.version厂商版本
os.arch操作系统结构
os.name操作系统名称
os.version操作系统版本
path.separator路径分隔符
user.dir用户当前工作目录
user.home用户主目录
user.name用户名称
表14.1虚拟机的环境变量
另外,System类提供的与系统环境信息相关的方法还有:
publicstaticStringsetProperty(Stringkey,Stringvalue):
设置系统变量的值,key为键名,value为键值。
publicstaticPropertiesgetProperites():
返回所有的系统环境信息。
其它有用用方法
publicstaticlongcurrentTimeMillis():
返回系统时间,单位毫秒。
publicstaticvoidexit(intstatus):
在用户和程序还未执行完之前,强制关闭Java虚拟机,并把状态信息status传递给操作系统,status非零时,表示非正常退出。