Java.docx
《Java.docx》由会员分享,可在线阅读,更多相关《Java.docx(40页珍藏版)》请在冰豆网上搜索。
Java
第2节课上机作业
1.猜数字游戏(练习条件、选择结构使用)
游戏随机给出[1,100]之间的一个数字,然后让你猜是什么数字。
你可以随便猜一个数字,游戏会提示太大还是太小,从而逐渐缩小结果范围。
经过几次猜测与提示后,最终推出答案。
统计游戏中玩家猜的次数,根据所猜次数的多少打印出相应的不同的信息。
一次游戏结束后,程序应该提示玩家是否还想继续猜,若是则继续下一轮的猜数游戏,否则的话退出游戏。
随机数产生方法:
●importjava.util.Random;//导入Random类
●Randomrandom=newRandom();//创建Random对象
●intrandomNumber=random.nextInt(100)+1;//产生[1,100]之间整数
2.输入班级中5位同学的Java成绩,存放到数组中。
(练习数组使用)
●求5位同学的平均成绩。
●求5位同学中的最高分和最低分。
●对5位同学的成绩进行排序,并按成绩从高到低输出
3.作业提交系统(练习String使用)
●作业提交系统注册功能:
输入两次密码(密码长度要求大于6),如果相同,提示注册成功,如果不相同,提示重新输入密码。
●作业提交系统登录功能:
验证密码是否正确,正确提示登录成功,不正确提示输入剩余次数,如果小于等于三次,继续输入,否则提示“输入超过3次,今天不能登录了,明天再来吧!
”。
●使用作业提交系统提交Java作业,输入Java源代码文件名,并输入自己的邮箱,提交前对Java文件名以及邮箱有效性进行检查。
(选做)
提示:
查阅JDKAPI文档中String类的相关方法:
equals()、length()、substring()、indexOf()
第3讲控制结构和循环结构♥
3.1Java中接收键盘输入的方式
3.1.1使用Scanner类
importjava.util.*;//程序开始导入java.util.*包中Scanner类:
Scannerinput=newScanner(System.in);//创建Scanner对象
Stringname=input.next();//接收字符串输入
intage=input.nextInt();//接收整型数据输入
doublescore=input.nextDouble();//接收双精度数据输入
3.1.2使用JOptionPane
Importjavax.swing.*;//导入JOptionPane类
Strings=JOptionPane.showInputDialog("请输入数字:
");//弹出输入框,接收的数据为字符串型
intnum=Integer.parseInt(s);//数字型字符串转换为整型
3.2分支结构
分支结构:
语句在满足条件下执行
3.2.1if条件结构语法
if(条件){//语句}
注意:
条件后面不要带;号,若条件成立时,只有一条语句,可以省略{},建议不要省略
3.2.2if-else条件结构语法
if(条件){//语句1
}else{//语句2}
注意:
else总是和if配对使用,else不能单独使用
3.2.3多重if-else结构语法
if(条件){//语句}
elseif(条件){//语句}
else{
//语句
}
练习:
基础:
输入赵本山的考试成绩,显示所获奖励
成绩==100分,爸爸给他买辆车
成绩>=90分,妈妈给他买MP4
90分>成绩>=60分,妈妈给他买本参考书
成绩<60分,什么都不买
3.2.4switch开关语句
switch(表达式或变量)
{
case常量1:
语句;
break;
case常量2:
语句;
break;
[default]:
语句;
}
注意:
表达式的结果或变量必须是与整型兼容的类型
练习:
基础:
0~6数字,分别输出星期几英文单词:
0代表Sunday;1代表Monday……..
进阶:
星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
3.3循环结构:
语句在满足条件下循环执行多次
3.3.1while循环的语法
while(循环条件){
循环操作
}
3.3.2dowhile循环的语法
do{
循环操作
}while(循环条件);
(注意末尾的;号)
注:
while循环和dowhile循环区别:
dowhile循环至少执行一次,while循环可能一次也不执行。
练习:
基础:
猜数字游戏(必做)
游戏随机给出一个数字,然后让你猜是什么数字。
你可以随便猜一个数字,游戏会提示太大还是太小,从而逐渐缩小结果范围。
经过几次猜测与提示后,最终推出答案。
统计游戏中玩家猜的次数,根据所猜次数的多少打印出相应的不同的信息。
一次游戏结束后,程序应该提示玩家是否还想继续猜,若是则继续下一轮的猜数游戏,否则的话退出游戏。
随机数产生方法:
importjava.util.Random;//导入Random类
Randomrandom=newRandom();//创建Random对象
intrandomNumber=random.nextInt(101);//产生0~100之间整数
3.3.for循环的语法
for(表达式1;表达式2;表达式3){
循环操作
}
3.4跳转语句
✓break:
可以在分支结构switch中使用,功能跳出分支
可以在循环中使用,一般结合条件结构使用,功能结束整个循环。
(不能单独在if语句中使用)
✓Continue:
只能在循环中使用,一般结合条件结构使用功能结束本次循环,加速循环。
练习:
基础:
打印出所有的"水仙花数"。
(必做)
所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
进阶1:
菲波拉契数列问题
古典问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
进阶2:
用for循环的嵌套输出菱形打印出如下图案(菱形)
*
***
*****
*******
*****
***
*
第3节上机作业
1.编写学生类(Student),具有以下属性和行为:
属性:
姓名,性别,学号,身高;
行为:
上课,睡觉,显示信息(toString)
2.编写学生类(Teacher),具有以下属性和行为:
属性:
姓名,性别,身高,课程;
行为:
讲课,睡觉,显示信息(toString)
编写测试类(Test),分别对以上类进行测试。
3.编写手机类,有以下属性和行为:
属性:
品牌,型号,价格,操作系统,内存……
功能:
查看手机信息,打电话,发短信,播放音乐,玩游戏(玩猜数字游戏)……
编写测试类,测试手机功能。
第4讲数组和字符串
4.1数组使用♥
⏹int[]a;
⏹a=newint[5];
⏹a[0]=8;
⏹a[0]=a[0]*10;
数组是一个变量,属于引用类型。
数组里面必须存储相同数据类型的一组数据,这些数据可以是任何数据类型,包括基本类型和引用类型。
使用数组四步走:
⏹数组的声明:
告诉计算机数据类型是什么。
⏹为数组分配空间:
告诉计算机分配几个格子
⏹数组的赋值:
把数据放到格子里
⏹数组的使用:
拿出格子里面的数据使用
注:
声明数组的时候不能指定其长度(数组元素的个数)例如:
inta[5]是非法的
4.1.1声明数组:
语法格式:
⏹int[]scoreJava;//Java成绩
⏹intscoreCSharp[];//C#成绩
⏹String[]name;//学生姓名
⏹scoreJava=newint[30];
⏹scoreCSharp=newint[6];
⏹String[]name=newString[30];
4.1.2分配空间:
语法格式:
数组名=new数据类型[大小];
注:
声明和分配空间可一步完成
4.1.3赋值:
score[0]=89;
score[1]=79;
score[2]=76;
依次赋值太繁琐了,有好的解决办法吗?
方法1:
边声明边赋值
int[]score={89,79,76};
int[]score=newint[]{89,79,76};
方法2:
动态地从键盘录入信息并赋值
Scannerinput=newScanner(System.in);
for(inti=0;i<30;i++){
score[i]=input.nextInt();
}
4.1.4使用数组解决问题
1.求数组元素平均值
班里有5位学生,使用边声明边赋值方式计算平均分。
(思考:
动态录入并赋值)
2.求数组中元素的最大、最小值(打擂台)
从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分
3.对数组元素排序(扩展:
思考冒泡排序)
循环录入5位学员成绩,进行升序排列后输出结果。
4.在数组中查找指定元素(扩展:
思考二分查找)
查找是否存在成绩为90分的同学
4.2String和StringBuffer♣
4.2.1使用String对象存储字符串
注:
参考java.lang.String的构造方法
Strings1="有志者事竟成";
Strings2=newString("有志者事竟成");
4.2.2字符串的常用方法
String类位于java.lang包中,具有丰富的方法:
结合类的结构,参考JavaAPI学习
1较字符串(比较字符串内容):
方法原型:
publicbooleanequals(Strings)
Strings1="Java";
Strings2="Java";
booleanb=s1.equals(s2);//b值为true
补充:
方法原型:
booleanequalsIgnoreCase(StringanotherString)//忽略大小写比较
方法原型:
StringtoLowerCase()//转换为小写
方法原型:
StringtoUpperCase()//转换为大写
2算字符串的长度:
方法原型:
publicintlength(),Strings=newString();
intn=s.length();
3连接字符串
使用“+”连接
使用concat()方法连接
方法原型:
Stringconcat(Stringstr)//将指定字符串连接到此字符串的结尾
3.StringBuffer:
String增强版
①StringBuffer声明,StringBuffersb=newStringBuffer();
StringBuffersb=newStringBuffer("aaa");
②StringBuffer的使用,sb.toString();//转化为String类型
sb.append("**");//追加字符串
练习1:
猜数游戏数组版:
从键盘中任意输入一个数据,判断数组中是否包含此数.
练习2:
将一个数组中的元素逆序,即第一个元素和最后一个元素交换,第二个元素与倒数第二个元素交换。
练习3:
将数组元素逆序输出
第5节类和对象
4.1OOP(ObjectOritentedProgram)面向对象概述
面向对象的编程思想力图使对计算机语言中对事物的的描述与现实世界中该事物的本来面目尽可能的一致。
类(class)和对象(object)是面向对象方法的核心概念。
类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
4.2OOP类和对象
万物皆对象;
对象一般都有两个特征:
属性和行为;
在软件开发中,对象定义为相关数据和方法的集合;对象是现实世界对象的抽象模型;
类是抽象的,对象是具体的;
Java中,每段源代码就是一个类文件,类包括成员变量和成员方法两部分.对象是类的实例;
4.2.1声明类
类描述的是一类事物共有属性和功能,描述过程由类体来实现。
类体只包括两个部分,成员属性和成员方法;
例如我们要创建人类,可以归纳出人类共有的特性,把它定义为属性,比如年龄姓名等;
比如,以创建人类为目标,我们来看如何定义Java中的类Person.java:
publicclassPerson{
intage;
intgetAge(){
returnage;
}
voidsetAge(intage){
this.age=age;
}
}
成员变量的定义格式为:
[修饰符]数据类型变量名[=默认值];
成员方法的定义格式为:
[修饰符]返回类型方法名(形参列表){
方法体
}
4.2.2成员变量和局部变量
成员变量:
●类的内部、方法的外部定义的变量;
●作用域:
依附于对象存在,具有与对象相同的生存期和作用域;
●创建后由系统自动对其进行初始化;
局部变量:
●方法或语句块中定义的变量;
●作用域:
所在的方法内;在程序调用方法时才被创建,随方法的退出而销毁;
●使用前必须初始化值;
4.2.3构造方法(ConstructorMethod)
构造方法:
提供创建对象的不同方式;
●构造方法的名称须与类名一致;
●没有返回类型,也不能定义为void;
●主要作用是完成对象的初始化工作,为成员变量赋值;
●一个类中可以定义多个构造方法,如果没有显示定义构造方法,系统默认提供一个无参的构造方法;
●构造方法的可以重载overload,满足重载的条件:
方法名相同,参数列表要不同(以参数的个数、顺序或类型划分);
4.3对象的创建及使用
4.3.1对象创建和使用
1.对象创建
✍标准格式如下类名对象名=new类名();
✍创建对象也可写成两行代码的形式:
Personp1;//声明一个对象p1
//p1=newPerson();//此时创建对象,在内存中分配地址给p1
2.对象的使用
1)访问属性:
对象名.属性名=值;
2)访问方法:
对象名.方法()
4.3.2对象的产生过程即对象的内存模型(一定要理解引用和实体两个概念)
对象的产生实际上分两步:
1.
声明对象:
类名对象名=null;
2.用new创建对象时的内存模型
属性未赋值前:
属性赋值后:
3.
创建多个对象时内存划分
4.3.3参数传值
1.基本数据类型参数的传值
对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。
2.引用类型参数的传值
Java的引用型数据包括对象、数组和接口。
当参数是引用类型时,“传值”传递的是变量的引用而不是变量所引用的实体。
如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化。
但是,改变参数的引用不会影响向其传值的变量的引用。
4.4总结
第6节接口和异常处理
6.1abstract类和abstract方法
6.1.1抽象类(AbstractClass):
抽象类提供一个类型的部分实现,可以有实例变量,构造方法,抽象方法(AbstractMethod即不能有方法的实现哪怕是{})和具体方法。
一个抽象类不会有实例;
一句话,它是用来继承的。
它反映了一种一般/特殊化的关系。
用关键字abstract修饰的类称为abstract类(抽象类)。
abstractclassA
{…
}
6.1.2abstract类有特点
⏹和普通的类相比,abstract类可以有abstract方法。
对于abstract方法,只允许声明,不允许实现,而且不允许使用final修饰abstract方法。
abstractclassA
{abstractintmin(intx,inty);
intmax(intx,inty)
{returnx>y?
x:
y;
}
}
⏹abstract类不能用new运算创建对象
对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象,如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。
一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,抽象类中的抽象方法可以强制子类必须给出这些方法的具体实现。
设计抽象类的原则:
1抽象类应尽可能多地拥有具体类公共的代码,这样做可以提高代码的重用性。
2抽象类应尽可能少地拥有数据,数据应尽量放在具体类中。
6.2接口声明和使用(重点)
6.2.1接口声明
接口与类属于同一层次,实际上,接口是一种特殊的抽象类。
在Java中接口定义同类的定义很相似,分为接口声明和接口体两部分。
接口通过interface关键字声明,接口体中只能包含全局常量和抽象方法,接口的变量自动是publicstaticfinal属性,接口中的方法自动是publicabstract属性,并没有方法体,以分号结尾。
格式:
[public]interface接口名[extends父接口名表]{接口体;}
接口体包含常量定义和方法定义,
例如:
interfaceIA{
publicstaticfinalintMAX=100;//全局常量
publicvoidprint();//抽象方法
publicabstractintsum();//抽象方法
}
注:
1)publicinterface:
公开接口,与类相似,一个文件只能有一个public接口,且与文件名相同。
2)在一个文件中不可同时定义一个public接口和一个public类。
3)接口和接口之间可以定义继承关系,并且接口之间允许实现多重继承。
例:
interfaceICextendsIA,IB{};
6.2.2接口使用
✍一个类通过关键字implements实现接口:
格式:
[修饰符]class类名[extends父类][implements接口]{
//非抽象类,必须实现接口的所有方法;
//抽象类的非抽象子类中对其父类所实现的接口中的所有抽象方法都必须实现。
}
例如:
classIAImpleimplementsIA{
//必须实现接口IA中的所有方法
}
✍一个类除继承另外一个类,还可以实现接口:
classIAImplextendsjava.util.ArrylistimplementIA{}
✍一个类只能继承另外一个类,但是它可以实现多个接口,中间用“,”隔开,这样可以实现变相的多重继承。
(Java中不支持多重继承)
classIAImpleimplementsIA,IB{
……
};
注:
1)一个类实现了某个接口,则必须实现接口中的所有方法,如果没有实现接口中的所有方法,则此类一定是抽象类。
因为一个类实现接口,相当于它继承一个抽象类。
2)接口中方法可不写public,但在子类中实现接口的过程中public不可省。
(如果省去public则在编译的时候提示出错:
对象无法从接口中实现方法,相当于降低了重写方法的权限。
)
3)如果父类实现了某个接口,子类不需要使用implements关键字声明就可以使用此接口。
4)接口也可以用于定义对象
IAiA=newIAImpl();//类似于我们的上转型对象
类实现的接口方法和常量可以被类创建的对象调用,常量可以用类名或接口名直接调用,因为常量前有static修饰。
6.2.3应用案例
观察案例:
classTeacher{
privateStringname;
privateintage;
privateStringtype;
publicTeacher(Stringname,intage,Stringtype){
this.name=name;
this.age=age;
this.type=type;
}
//返回教师详细信息
publicStringdetail(){
return"姓名:
"+name+",年龄:
"+age+",教师类型:
"+type;
}
}
classPrinter{
publicvoidprint(Strings){
System.out.println(s);
}
}
classMedicalInspection{
Printerprinter=newPrinter();
//返回体检中心信息
publicStringdetail(){
return"这里是滨州市体检中心,欢迎您的到来!
";
}
//打印教师信息
publicvoidprint(Teachert){
printer.print(t.detail());
}
//打印中心信息
publicvoidprint(MedicalInspectionmi){
printer.print(mi.detail());
}
}
publicclassExDemon02{
publicstaticvoidmain(String[]args){
Teachert=newTeacher("李四",33,"Java");
MedicalInspectionmi=newMedicalInspection();
mi.print(t);//打印教师信息
mi.print(mi);//打印中心信息
}
}
✍分析:
存在弊端,如果每增加一类需要打印的信息,则就要在MedicalInspection类中增加相应的打印方法。
本案例符合多态条件,可以用我们的继承吗?
不可以,因为我们的Teacher类和MedicalInspection类之间并没有明显继承关系,无法抽出合适的父类。
✍解决:
可以用我们的接口来解决,因为接口也可以用于定义对象。
IAI=newIAImpl();//类似于我们的上转型对象
把Teacher类和MedicalInsp