??xml version="1.0" encoding="utf-8" standalone="yes"?> 现在我们已经抽象Z个类——汽车类Q汽车有不同的牌子,有不同的颜色Q不同的形状Q我们称每一辆具体的汽R为汽车类的一个实例,从汽车类到具体汽车的q程被称为实例化的过E,又称为类Q汽车类Q的实例化。在Java中一个类的实例化是通过关键?#8220;new”来进行的?/p>
比如说我们现在声明一个汽车类Q?/p>
public class Car { …… } q着q行一个类的实例化Q?/p>
new Car(); 一个类的实例是针对一个具体的对象的,它是一些具体属性的集合Q?/p>
设计自己的类 下面设计一个自qc,我们的目的是做一个小型的学生理pȝQ既然是学生理pȝQ我们必要拥有学生c,下面我们开始设计一个学生类?/p>
需求分析:(x) 1?nbsp;对于一个学生类Qclass StudentQ,作ؓ(f)整个pȝ最核心(j)的类Q我们希望它能包括学生公有的基本信息Q学生姓名、学受性别、出生年月、专业、籍贯等?/p>
2?nbsp;做ؓ(f)学生cȝ实例Q我们希望能通过讄或访问来修改q些学生的不同信息?/p>
public class StudentTest { public static void main(String[] args) { Student tom=new Student("Tom","20020410"); tom.setStudentSex("man"); tom.setStudentAddress(" System.out.println(tom.toString()); } } class Student { private String strName=""; //学生姓名 private String strNumber=""; //学号 private String strSex=""; //性别 private String strBirthday=""; //出生q月 private String strSpeciality=""; //专业 private String strAddress=""; public Student(String name,String number) { strName=name; strNumber=number; } public String getStudentName() { return strName; } public String getStudentNumber() { return strNumber; } public void setStudentSex(String sex) { strSex=sex; } public String getStudentSex() { return strSex; } public String getStudentBirthday() { return strBirthday; } public void setStudentBirthday(String birthday) { strBirthday=birthday; } public String getStudentSpeciality() { return strSpeciality; } public void setStudentSpeciality(String speciality) { strSpeciality=speciality; } public String getStudentAddress() { return strAddress; } public void setStudentAddress(String address) { strAddress=address; } public String toString() { String information="学生姓名="+strName+",学号="+strNumber; if(!strSex.equals("")) information+=",性别="+strSex; if(!strBirthday.equals("")) information+=",出生q月="+strBirthday; if(!strSpeciality.equals("")) information+=",专业="+strSpeciality; if(!strAddress.equals("")) information+=",c诏="+strAddress; return information; } } 分析Q?/p>
在程序中我们构徏?jin)一个学生类的实例:(x) Student tom=new Student("Tom","20020410"); q样的过E就是类的实例化的过E。tom是Studentcd例的句柄Q也是我们所说的对象句柄Q在后面对对象所q行的Q何操作,都是通过操作对象句柄q行的。我们通过关键字new生成Studentcȝ一个实例,一个实例代表的是一个特定属性的对象Q我们生成的特定对象是学生:(x)姓名是tom,学号?0020410的一个学生?/p>
构造器Q构造方法)(j) 能过关键字new来生成对象的实例Q是通过构造器QconstructorQ来实现的。简单的_(d)(x)构造器是同cd相同的特D方法?/p>
public Student(Student name,String number) { strName=name; strNumber=number; } 当构造一个学生类的实例时Q学生类的构造器p启动Q它l实例字D赋倹{?/p>
构造器与方法的不同之处是:(x)构造器只能与关键字new一起用,构徏新的对象。构造器不能应用于一个已l存在的对象来重新设|实例字D늚倹{?/p>
构造器的特点:(x) 1?nbsp;构造器与类名相同(包括大小写)(j) 2?nbsp;一个类可有多个构造器?/p>
3?nbsp;构造器可以?个?个或多个参数?/p>
4?nbsp;构造器没的q回|但不能用void修饰?/p>
构造器L和newq算W一赯调用?
对象的三个特征:(x) 对象的行为:(x)q个对象能做什么,也就是能完成什么样的功能。比如自行R可以载我们想ȝ地方Q节省体力?/span> 对象的状态:(x)当通过一个操U对象的Ҏ(gu)Ӟ对象所保持的一U包含特定的属性的状态。比如我们可以通过扭{车头Q自行车拐弯;刹RӞ可以让自行R减速或停下来?/span> 对象的标识符Q可以通过标识W,区别h相同行ؓ(f)或类似状态的对象。说到自行RQ可以有很多U样子的Q很多生产厂家的Q都可以说是自行车,可以Ҏ(gu)颜色Q生产厂家等{与其它的自行R区分?/span> 对象的句?/span> 对象的句柄:(x)操纵对象的标识符Q它是指向一个对象的句柄。根据前面对变量的定义,变量名是内存地址Q栈Q的一个别名,对于基本cd来讲Q它的值就是存攑֜q个内存地址的空间内Q对于对象类型来Ԍ它的值是一个指向实际对象的一个地址Q堆Q,而真正的对象是存放于堆中Q我们就可以理解为:(x)q就是一个对象的句柄?/span> 例如Q?/span>String str; q里只拥有了(jin)一个对象句柄,句柄Q?/span>strQƈ没有与Q何对象内容相兌。操U句?/span>strӞq向它发送一条消息,q时pȝ?x)提C错误。所以在创徏对象句柄Ӟ一定不要忘记将句柄与实际的对象内容相关联(也就是对象变量的初始化)(j)?/span> 对象变量的初始化 对象变量的初始化是通过new关键字来完成对象的创E。它是向内存堆中甌一个空_(d)这个对象内Ҏ(gu)到这里,然后内容与对象句柄Q存在于栈中Q关联v来?/span> 例如Q?/span>String str = new String( “ Hello ” ); 语法Q?/p>
switch(表达? { case帔R1: 语句1 [break;] case帔R2: 语句2 [break;] … case帔Rn: 语句n [break;] [default:] 默认处理语句 注意Q?o:p> 1Qswitch(表达?q回的值必L1Qbyte型?Qchar型?Qshort型?Qint型?/p>
2Q常量的值必d表达式的值的cd怸致?/p>
3Q常量的g允许出理重复的?/p>
4Qbreak作用是结束switch开兌句?/p>
5Q在一些特D的情况下,可以写成Q?/p>
… case 帔Rn: case 帔Rn+1: 语句 [break;] … 例:(x)命o(h)行传1个参敎ͼ要求??00之间的数Q不是整数的话就退出JVMQ传的参数大于等?0Ӟ输出“优秀”Q如果小?0大于{于70之间的数Q输?#8220;良好”Q小?0大于{于60Ӟ输出“?qing)?#8221;Q如果小?0输出“不及(qing)|L(fng)l努?#8221;?/p>
class Switch { public static void main(String[] args) { System.out.println("误入成l!"); int shu=Integer.parseInt(args[0]); if((args.length!=1)||(shu<0||shu>100)) { System.err.println("输入错误Q请重新执行Q?); System.exit(-1); } String chengji; switch(shu/10) { case 10: case 9: chengji="优秀"; break; case 8: case 7: chengji="良好"; break; case 6: chengji="?qing)?; break; case 5: case 4: case 3: case 2: case 1: case 0: chengji="不及(qing)|L(fng)l努?; break; default: chengji="误入一??00之间的数"; } System.out.println("成WQ?+chengji); } } 一、不定循环 所谓不定循环Q也是我们不能定循环所要执行的ơ数Q执行的ơ数是根据程序中参数的变化自动控制的?/p>
它主要有两种表现形式Q第一UŞ式是while形式Q第二种形式是do/while形式?/p>
1Q?nbsp;while 它的p意思就?#8220;?#8221;Q它在@环控制中也可以这L(fng)解,它的语法格式是:(x) while(条g) { 目的一; 目的? …… } 换成中文的含义就?#8220;当条件ؓ(f)真时Q就执行循环体,当条件ؓ(f)假时Q就不执行@环体?#8221; 下面我们~写一个比较有意思的E序来说明这个结构:(x) 我的同事李自从参加工作以后Q每个月都要交纳一定的住房基金Q以准备买房子。现在他每个月工资是2000元,以后每年?0%的比例增加,其中工资?%是用来交U住房基金的Q他想知道多年后,他可以有20万元住房基金?/p>
/*while循环控制l构的测?/ public class BuyHouse { public static void main(String[] args) { final double HOUSEFUND = 200000; double salary = 2000; double fund = 0; int years = 1; while(fund < HOUSEFUND) { fund += salary * 0.05 * 12; years++ salary = salary * 1.1; } System.out.println(“the total years is :” + years); System.out.println(“the total fund is :” + fund); } } 输出l果Qthe total years is :32 The total fund is :218332.10994930082 E序分析Q?/p>
在开始的时候,我们q不知道需要多年Q但我们知道它的l束条gQ那是基金需要达?0万元。我们以它作为程序结束的条gQ进行@环。通过q个E序我们可以ȝZ下几点:(x) 1、@环开始执行的条g是ؓ(f)真; 2、必要有ɽE序l束的自变量在变化; 3、@环判断条件ؓ(f)假时Q程序中止@环?/p>
2Qdo/while 我们先把前面的程序做一个改造,来比较一下两个程序的区别Q?/p>
/*while循环控制l构的测?/ public class BuyHouse2 { public static void main(String[] args) { final double HOUSEFUND = 200000; double salary = 2000; double fund = 0; int years = 1; do { fund += salary * 0.05 *12; years++; salary = salary * 1.1; } while(fund < HOUSEFUND); System.out.println(“the total years is :” + years); System.out.println(“the total fund is:” + fund); } } 输出l果Qthe total years is :32 the total fund is :218332.10994930082 我们再看两个程序,q对比一下他们的输出Q?/p>
/*试不确定@环的两种表现形式的区?/ public class DifferTest { public static void main(String[] args) { int i = 2; do { i++; System.out.println(“the value I is:” + i); } while(I < 2); } } 输出l果Qthe value i is:3 /*试不确定@环的两种表现形式的区?/ public class DifferTest2 { public static void main(String[] args) { Int i = 2; while (i < 2) { i++; System.out.println(“the value I is:” + i); } } } q个没有M输出l果Q这两种形式是有一定差别的Qwhile语句是先q行条g判断Q再q行循环体的处理Qdo/while语句是先q行循环体的处理再判断条件语句,也就是在执行判断之前已经@环体内的逻辑处理?jin)一遍?/p>
二、确定@?/span> for()循环是最单的循环语句Q它可以通过计数器或在每ơ@环后修改某个cM于计数器变量的值来控制它。它的格式如下:(x) for(初始化表辑ּQ判断表辑ּQ递增Q或递减Q表辑ּ) { 执行语句Q?/span> } 初始化表辑ּQ?/em>它是用来讑֮循环控制变量的初始|也就是@环的L(fng)?/p>
判断表达?/em>Q用来判断@环是否结束的表达式,也就是@环的l点。程序@环是否持l进行由判断表达式决定;通常判断表达式是关系表达式,当关p表辑ּ的gؓ(f)真是Q程序l进行@环,当关p表辑ּ的gؓ(f)假时Q@环结束?/p>
递增Q递减Q表辑ּQ?/em>是@环控制变量的递增Q也可以是递减。它又称为@环控制的步长Q也是每次循环Q@环变量增长(或减)(j)的速度?/p>
for()语句的最后不能有MW号Q需要特别注意?/p>
例如Q我们向控制台输??0之间的数字?/p>
/*输出数字到控制台*/ Public class Circle { Public static void main(String[] args) { For(int I = 1; I < 10; i++) { System.out.println(“ ” + i); } } } 输出l果Q? 2 3 4 5 6 7 8 9 10 针对于for()循环控制l构Q有以下问题误者注意:(x) 1、如果在初始化表辑ּ定义?jin)一个初始化变量Q那么该变量的作用域范围是从循环开始到循环l束Q?/p>
2、如果想在@环体外部使用循环计数器的最l结果,应该在@环开始外声明?/p>
3、在同别的不同for()循环中,可以定义相同名字的变量?/p>
4、在被包含的for()循环块内不可以定义相同名字的变量?/p>
5、for()循环与while循环是完全等L(fng)?/p>
三、逗号q算W?/span> 在Java中逗号q算W的惟一使用场所是for循环Q在初始化@环变量表辑ּ或递增Q递减Q表辑ּ中,我们用一pd逗号分隔不同的语句,q些语句均参与到循环控制中?/p>
下面用一个程序说明这个问?/p>
/*逗号q算W?/ public class CommaOperator { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 3) { System.out.println(“i =” + i + “; j =” + j); } } } 输出l果Q?/p>
i = 1; j = 11 i = 2; j = 6 i = 3; j = 9 i = 4; j = 12 通过q个CZQ读者可以发现初始化变量在开始的时候都是按照初始化表达式进行的Q在q算的过E中Q都按照步长控制表达式进行?/p>
四、无限@?/span> 提到无限循环Q也是指没有判断表辑ּ的for循环Q当E序q入到@环体内的时候,׃没有判断表达式来l束正常的@环,使得E序q入到无限@环中Q也是我们q_说的d@环?/p>
我们通过一个小例子来了(jin)解一下无限@环的表现形式Q?/p>
/*无限循环控制*/ public class Unlimited { public static void main(String[] args) { for(int i = 1;; i++) { System.out.println(“i =” + i); } } } 如果E序q入到无限@环中Q程序就不能正常l束?jin),我们只有手动l束E序的进E。手动结束进E的快捷键是Ctrl+C?/p>
]]>
{
if(num>0)
{
return -1;
}
else if(num<=0)
{
return 0;
}
return 1;
}
分析Q?br> 在这个方法中我们专用蝗了(jin)q回语句的类型ؓ(f)int型,当主E序调用q个Ҏ(gu)Ӟ׃(x)得到一个intcd的返回|值的内容分别Ҏ(gu)不同的情况返??、或-1。主E序得到子程序的q回|׃当前Ҏ(gu)中退出,q回到调用该Ҏ(gu)的语句处Ql程序的执行?br>… …
public int getValue()
{
return a*b/12;
}
… …
分析Q?br> 在这D代码中q回的是一个int型的表达式,在主E序调用Ӟ子程序会(x)这个表辑ּ的D行计,计算机的l果作ؓ(f)int型的D回给ȝ序,ȝ序得以l进行。如果返回值的cd或返回值滑得到正确的结果,E序׃(x)出现错误?br>注意Q返回值的数据cd必须与方法声明中的数据类型一致?br>
returnW二个用处:(x)
如果在程序运行过E中Q我们只希望调用子程序,q完成子E序的功能,而不需要子E序q回M数|那么我们只需要在子程序的l束处加上一条语?br> return;
当然用没有返回值的q回语句Ӟ在方法的声明中必L声明返回值类型ؓ(f)void?br>… …
public void setValue()
{
value=a*b/12;
return;
}
… …
分析Q?br> 当主E序调用该方法时Q会(x)valueq行赋|赋值结束后?x)返回到ȝ序,在这U情况下Q我们一般不写return语句Q方法调用完成后Q系l也?x)自动回到方法调用处Q接着q行E序的执行?/span>
]]>
[break;]
}
]]>
{
public static void main(String[] args)
{
outer:
for(int i=0;i<5;i++)
{
System.out.println("i="+i);
inner:
for(int j=0;j<3;j++)
{
System.out.println("j="+j);
if(j%2==0)
{
System.out.println("countinue inner");
continue inner;
}
if(i%2==1)
{
System.out.println("continue outer");
continue outer;
}
if(i==3)
{
System.out.println("break outer");
break outer;
}
}
}
System.out.println("this is all over!");
}
}
输出l果Q?br> i=0
j=0
continue inner
j=1
j=2
continue inner
i=1
j=0
continue inner
j=1
continue outer
i=2
j=0
continue inner
j=1
j=2
continue inner
i=3
j=0
continue inner
j=1
continue outer
i=4
j=0
continue inner
j=1
j=2
continue inner
this is all over!
分析Q?br> continue?x)结束inner的当ơ@环,q到达inner标签的开始位|,重新q入紧接在那个标{面的循环?br> continue?x)结束o(w)uter的当ơ@环,q到达outer标签的开始位|,重新q入紧接在那个标{面的循环?br> break?x)中断当前的outer循环Qƈ到达标签outer指示循环的末?
]]>
{
public static void main(String[] args)
{
for(int i=1;i<20;i++)
{
if(i%2==0)
continue;
System.out.print(" "+i);
}
System.out.println("\n the Reptation is over!");
}
}
输出l果Q?br> 1 3 5 7 9 11 13 15 17 19
the Reptation is over!
l论Q?br> l箋(hu)语句l束的是当前的@环,不蟩出@环体Q接着开始下一ơ的循环?
]]>
public class BreakTest
{
public static void main(String[] args)
{
for(int i=1;i<20;i++)
{
if(i==10)
break;
System.out.print(" "+i);
}
System.out.println("\n the Reptation is over!");
}
}
输出l果Q?br>1 2 3 4 5 6 7 8 9
the Reptation is over!
分析Q?br> 当i=10Ӟ循环l束Q输出结束语句?br> l论Q中断@环是中断整个循环体,直接跛_循环体,执行下面的语句?br>
]]>
]]>
{
目的1
}
else
{
目的2
}
q就是条件语句的标准句法Q根据不同的形式我们可以它改变?sh)ZUŞ式:(x)
1Qif (…) 其表辑ּ为:(x)
if (条g)
目的;
如果目的不止一个,那就加上一对花括号Q就变成下面的这个样子?br> if Q目的不止一个)(j)
{
目的1;
目的2;
目的3;
}
下面我们~写一个程序来q行一下,问题是:(x)假如q个月我的工资超q?000元,我就h友大一ơ,再去游泳Q再打一ơ电(sh)?jin)游戏?br>
/*条g语句W一UŞ式的试*/
public class Suppose
{
public static void main(String[] args)
{
double mySales = 6000;
if (mySales > 5000)
{
System.out.println("h友大一?);
System.out.println("再去游泳");
System.out.println("打电(sh)子游?);
}
}
}
输出l果Q?br> h友大一?br> 再去游泳
打电(sh)子游?br> 有些人可能要问:(x)如果工资过?000元,p?x),游泳Q如果没有的话,只能吃方侉K。该怎么表达呢,现在我们p一下第二种形式?br>
2Qif (…){…}else{…}
q种表现形式可能是最熟?zhn)Q也是最常用的,它所表达的意思就是:(x)如果条g满Q就执行if (…)后面的{…}Q如果条件不满Q就执行else后面的{…}内容。例如:(x)假如q个月我的工资超q?000元,我就h友大一ơ,再去游泳Q再打一ơ电(sh)子游戏。如果不?000元,我只有吃方便面了(jin)?br>
/*条g语句W二UŞ式测?/
public class Suppose2
{
public static void main(String[] args)
{
double mySales = 4000;
if ( mySales > 5000)
{
System.out.println("h友大一?);
System.out.println("再去游泳");
System.out.println("打电(sh)子游?);
}
else
{
System.out.println("只有吃方侉K?);
}
}
}
输出l果Q只有吃方便面了(jin)
现在我们处理的两UŞ式都是一个条Ӟ那么能不能处理多个条件呢Q下面就开始学?fn)第三种形式?br>
3Qif …else if … 其表辑ּ为:(x)
if (条g一)
{
目的一;
……
}
else if (条g?
{
目的一;
……
}
else if (条g?
{
目的一;
……
}
……
else
{
不满Q何条件的l果;
}
现在我们把上面的表现形式更改一下:(x)
if (条g一)
{
目的一;
……
}
else
{
if (条g?
{
目的一;
……
}
else
{
if(条g?
{
目的一;
……
}
……
else
{
不满Q何条件的l果;
}
}
}
我们可以看出Q这两段的逻辑完全是一致的。有的家长ؓ(f)?jin)鼓励孩子学习(fn),特别制定了(jin)如下的奖励措施Q如果这学期考试每门?00。你想上哪玩都行Q另外再奖励500元零用钱Q如果能辑ֈ90分以上,只奖?00元钱Q?0分以上,只有300元,低于80分,对不起了(jin)Q你暑假p老实实在家学?fn),哪也不能厅R我们用一D늨序来实现q个q程吧:(x)
if (每门成W = 100)
{
可以上Q何地方玩;
500元奖?
}
else if (成W >= 90)
{
只奖?00?
}