经贸职业技术学院程序设计基础电商java_第1页
经贸职业技术学院程序设计基础电商java_第2页
经贸职业技术学院程序设计基础电商java_第3页
经贸职业技术学院程序设计基础电商java_第4页
经贸职业技术学院程序设计基础电商java_第5页
已阅读5页,还剩476页未读 继续免费阅读

下载本文档

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

文档简介

Java开发环境和程序设计初步

联系方式金浩侠

tel有问题一定要问主要内容1.1Java语言发展历史1.2Java语言的特点1.3Java的工作原理1.4Java运行环境JDK1.5构建Java程序1.6开发工具1.人物JamesGosling-Java之父-戴着眼睛的蜘蛛-Sun副总裁

BillJoy-Sun创始人之一

-软件业的爱迪生-2003年离开Sun2.关键词绿色计划Green与平台无关Java最初的名字:橡树Oak一杯飘香的咖啡Java网络与Java现在请观看java+youSun硅谷总部图片Sun硅谷总部图片Sun硅谷总部图片Sun硅谷总部图片Sun硅谷总部图片TheNetwork

istheComputerSun董事会主席:ScottMcNealy

SunCEO(任期1982-2006)ScottMcNealySun公司CEO:

JoanthanSchwartz

2006-2010任职JoanthanSchwartzSun和Oracle介绍Sun和Oracle

2009.4Oracle收购SunIBM、Sun、Oracle三家公司比较Oracle主页

Oracle目标Jonathan宣布辞职

Java应用:Google地图Java应用:小游戏3.Java开发平台J2SE(

Java

2

Standard

Edition),Java的标准版,针对普通PC应用。J2EE(

Java

2

Enterprise

Edition),Java的企业版,针对企业网应用。J2ME(Java2MicroEdition),针对嵌入式设备和消费类电器,如手机等。

1.2Java的特点Java是一种具有简单、面向对象、分布式、解释性、健壮性、安全、平台无关、可移植、高性能、多线程和动态执行等特性的语言。特点简单并面向对象鲁棒并安全结构中立并可以移植高性能解释执行、多线程并且是动态的解释性Java语言分两步执行1)由编译器将用户程序编译成字节码2)由Java虚拟机(JavaVirtualMachine)解释执行字节码可以在不同的硬件平台上实现不同的Java虚拟机,保证了Java语言的平台无关性和可移植性。1.3Java的工作原理JavaApplicationJavaAppletServlets(JSP)JavaAPIWebServer字节码BytecodesJavaVirtualMachine(JVM)HardwarePlatformJava虚拟机软件模拟的计算机执行字节码文件(*.class)不同的软硬件平台需要对Java虚拟机做专门的实现Java程序执行过程1Java程序执行过程2Java程序执行过程21.4Java运行环境JDKJDK:Java开发工具包Java

DevelopmentKit——面向开发人员JRE:Java运行时环境JavaRuntimeEnvironment——面向Java程序的使用者

JDK安装及环境设置对于WIN

2000\WIN

XP系统,具体步骤如下:

控制面板/系统/高级/环境变量,在系统变量中双击path选项,在对话框中“变量值”中插入C:\ProgramFiles\Java\jdk1.6.0_16\bin1.5

构建Java程序Java程序分成两大类:Java应用程序Application控制台程序:在DOS窗口运行,程序入口是main()方法窗口程序:有图形界面,程序入口是main()方法Java小应用程序Applet:嵌入在HTML文件中,在浏览器中运行,没有main()方法HelloWorld程序//Example1//ThisisasimpleinstanceofjavaapplicationpublicclassHelloWorld{publicstaticvoidmain(Stringargs[]){System.out.println(“HelloWorld!”);}}程序分析类定义

Java程序的基本组成部分是类(class),如本例中的HelloWorld类。main()方法

JavaApplication程序的入口是main()方法。它有固定的书写格式:

publicstaticvoidmain(Stringargs[]){ …… }程序分析程序内容

由方法体实现程序要完成的功能,方法的实现由一个个语句组成注释

与C++相同,一行中‘//’后的内容为注释,‘/*’和‘*/’中的内容也是注释Java程序的编译运行javacHelloWorld.java

源文件名为HelloWorld.java,注意:文件名必须与公共类名相同;由javac编译器编译源程序,产生字节码文件(HelloWorld.class)javaHelloWorld

由java解释器解释执行1.6开发工具

EclipseMyEclipseEclipse——一个集成开发环境IDE(IntegratedDevelopingEnvironment),IBM公司,开源。

目前主要用作JavaIDE。MyEclipse——Genuitec公司,Eclipse的插件,不免费。第2章Java程序设计基础

2.1标识符与关键字Java的符号集采用Unicode字符集——一个字符占两个字节,不论中文、英文还是其他字符标识符为变量、类或方法起的一个名称以字母、下划线或$符号开头由字母、下划线、$符号和数字组成区分大小写,没有最大长度限制,不能使用关键字示例:identifier、userName、user_name、_sys_varl、$change2.2.1数据类型Java编程语言定义了8种基本数据类型布尔——boolean字符——char整数——byte、short、int和long浮点——double和float布尔类型——booleanboolean数据类型有两个值:true和false例如:语句booleantruth=true;

声明变量truth为boolean类型,并将其赋值为true。字符类型——char与Stringchar代表16位的Unicode字符字符必须在单引号(‘’)内使用:

‘a’

字母a

‘\t’

制表符

‘\u????’

特定的Unicode字符,????用4个确切的16位数字代替字符类型——char与Stringcharch=‘A’;//声明并初始化一个char变量charch1,ch2;//声明两个char变量字符类型——char与StringString不是基本数据类型,而是一个类字符在双引号(“”)内

“Hello,World!”使用如下:Stringstr1,str2;//声明两个String变量Stringgreeting=“GoodMorning!!\n”;StringerrorMessage=“RecordNotFound!”;//声明两个String变量并且初始化它们整数类型——byte(8位)、short(16位)、int(32位)和long(64位)三种形式使用——十进制、八进制或十六进制2十进制整数2077以0开头表示八进制值0xBAAC以0x开头表示十六进制值默认是int类型使用字母L或l定义long类型浮点类型

——float(32位)和double(64位)浮点数包括十进制浮点或者下列所示之一:E或e(加指数值)F或f(float)D或d(double)3.14一个简单的浮点值(一个double类型)6.02E23一个大浮点值2.718F一个简单的float值123.4E+306D一个带有D(多余)的大的double值默认类型是double例子publicclassAssign{publicstaticvoidmain(Stringargs[]){intx,y;floatz=3.414f;doublew=3.1415;booleantruth=true;charc;Stringstr;Stringstr1=“bye”;c=‘A’;str=“Hioutthere!”;x=6;y=1000;}}y=3.1415926;w=175,000;truth=1;z=3.14156;为什么不合法2.2.2变量变量:声明变量必须在类的定义内,可以在方法内或者方法外在方法内定义的变量称为局部变量,需要显式的对其初始化成员变量和类变量自动初始化数字型初始值为0对象型初始值为null2.2.3常量常量:在程序运行中其值保持不变的量。文字常量:在程序中直接写出量值的常量,

如:37,2.1,true等。符号常量:用标识符代表的常量,

如:finalintx=100;2.2.4基本数据类型间的转换一般形式:(类型)(表达式)作用:将表达式的结果强制转换为另一种类型低存储位可以自动转换为高存储位数据类型高存储位则必须通过强制类型转换才能转换为低存储位数据类型2.2.5封装类(Wrapper类)基本数据类型Wrapper类booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDoubleWrapper类通过将值传递给相应的构造器,可以构建Wrapper类对象例如:intpInt=500;IntegerwInt=newInteger(pInt);intp2=wIValue();Wrapper类当转换基本数据类型时Wrapper类很有用,因为可以使用很多Wrapper类方法。例如:Stringstr=“365”;intx=Integer.parseInt(str);

或intx=Integer.valueOf(str).intValue();2.3操作运算符与表达式1.逻辑运算符逻辑运算符是(在C语言里用的很多,JAVA里少)!一元逻辑非&二元逻辑与^二元逻辑异或|二元逻辑或短路逻辑运算符是&&二元条件逻辑与||二元条件逻辑或逻辑运算符0值不能自动解释为false,

非0值不能自动解释为true。如:inti=1;if(i)//generatesacompileerrorif(i!=0)//correct逻辑运算符短路逻辑操作符MyDated;if((d!=null)&&(d.day>31)){//dosomethingwithd}

当第一个子表达式(d!=null)为假时,第二个子表达式就被跳过,全部表达式总是假的。

同样,使用||操作符,如果第一个表达式返回为真,则不必计算第二个表达式,因为整个表达式必定为真。2.引用操作符“点”符号:<对象>.<成员>用于访问对象成员,包括属性和方法。说明点的操作可使您访问类的非私有属性和方法在方法的定义内,访问本地成员不需要使用点符号3.对象运算符AinstanceofB用来判定对象A是否为类B的对象4.字符串运算符+操作符执行String连接产生新的String一个参数必须是String对象非字符串对象会自动转换为String对象,如要转换为等价的字符串时,使用toString()成员方法字符串运算符Stringfirst=“James”,last=“Gosling”;Stringname=first+last;结果:name的值是JamesGosling条件分支与循环控制语句顺序结构分支结构

if、switch循环结构

for、while、do-while练习:输入小写字符串,转换成小写字符串书面作业将给定的数字转换为大写,如12345.67转换为壹万贰仟叁佰肆拾伍圆陆角柒分班级-学号-姓名-作业2.rar发送至第4章Java面向对象编程

——类和对象4.2.2类的定义Java类的基本语法:<修饰符>class<类名>{[<属性声明>][<构造器声明>][<方法声明>]}<类名>可以是任何合法的标识符,并且是所声明类的名字。有几种可使用的<修饰符>,但现在只使用public,声明类可被任意访问。类的正文声明了与类相关的数据属性、构造器和方法的集合。示例例4.1定义一个类来描述圆的特征和行为。类名:Circle成员变量:nCenterXnCenterYnRadius成员方法:setRadius(int):voidgetRadius():intgetArea():float4.2.3成员变量变量声明的一般格式:<修饰符><类型><名称>;例如:privateintx;<名称>可以是任何合法的标识符,它是所声明属性的名字。有几种可用的<修饰符>,但现在只使用public或private。private声明该属性只能由该类的方法访问。属性的<类型>可以是任何基本类型(int,boolean等)或任何类。修饰符final:声明常量,如:finalintCONSTANT=50;

常量的值不能被修改。static:声明静态变量(类变量),如:staticintnCounter;4.3声明方法方法的基本语法:<修饰符><返回类型><名称>([<参数表>]){[<语句>]}<名称>可以是任何合法的标识符,但限制使用那些已经在使用的名称。<修饰符>是可选项,并可有很多不同的修饰符,包括public、protected和private等。public访问修饰符表明可从其他代码调用该方法。private表明方法只能在由该类中其他方法调用。示例例4-3定义一个人类,描述人类的姓名、年龄、身高、体重,定义一个方法用来检验人的体重是否在正常范围之内,定义一个方法用于输出个人资料。

4.3.3方法参数的传递方式形参:方法的声明中的参数

声明形参的类型和名称实参:调用方法语句中的参数

有具体值例4-5

按值传递swap_value(intn1,intn2){intn0;n0=n1;n1=n2;n2=n0;System.out.println(n1);System.out.println(n2);}例4-5

按引用传递swap(MethodExample1n){intn0;n0=n.n1;n.n1=n.n2;n.n2=n0;System.out.println(n.n1);System.out.println(n.n2);}例4-5publicstaticvoidmain(Stringargs[]){intn1=1,n2=10;MethodExample1numbers=newMethodExample1();numbers.swap_value(1,10);System.out.println(“main()方法中n1=”+n1+”n2=”+n2);numbers.n1=2;numbers.n2=20;numbers.swap(numbers);System.out.println(“main()方法中numbers.n1=”+numbers.n1+”numbers.n2=”+numbers.n2);}4.4构造函数声明构造函数构造函数的基本语法:<修饰符><类名>([<参数表>]){[<语句>]}构造函数特点构造函数作用:完成类对象的初始化工作构造函数的名称必须与类名相同构造器没有返回值并且不可被继承一般将构造函数的修饰符声明为public构造函数中不能有return语句构造函数参数参数表与方法声明中的一样。可以象方法一样向构造函数传递参数。构造函数可以有0个、1个或者多个参数。4.4.1无参数的构造函数没有构造函数——使用默认的构造函数(没有参数,没有方法体)如果使用没有参数的构造函数,则创建的对象具有相同的初始值例4-7classSameCircle{publicintnOrignX=3;publicintnOrignY=3;publicintnRadius=1;publicSameCircle(){}}显式初始化在执行构造函数方法体之前执行例4-7classSameCircle{publicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(){nOrignX=3;nOrignY=3;nRadius=1;}}4.4.2带参数的构造函数classSameCircle{publicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(intnOrignX,intnOrignY,intnRadius){this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=nRadius;}}this:代表当前对象构造函数的重载一个类可以有多个构造函数,叫做构造函数的重载。条件(满足其一)参数的个数不同参数的类型不同例1classSameCircle{publicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(intnOrignX,intnOrignY,intnRadius){this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=nRadius;}publicSameCircle(intnOrignX,intnOrignY){this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=5;}publicSameCircle(intnRadius){this.nOrignX=3;this.nOrignY=4;this.nRadius=nRadius;}}例1的另一种写法classSameCircle{publicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(intnOrignX,intnOrignY,intnRadius){this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=nRadius;}publicSameCircle(intnOrignX,intnOrignY){this(nOrignX,nOrignY,5);}publicSameCircle(intnRadius){this(3,4,nRadius);}}构造函数的使用不能由编程人员显式调用。在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。构造函数只能和new运算符一起使用。格式类名

对象名=new

构造函数名称(成员变量的初始值)默认构造函数每个类至少有一个构造函数。如果不编写构造函数,则自动添加默认构造函数:默认构造函数不带参数默认构造函数函数体为空不必编写构造函数就能使用newXxx()创建

对象实例示例classSameCircle{publicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(intnOrignX,intnOrignY,intnRadius){this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=nRadius;}publicstaticvoidmain(Stringargs[]){SameCirclec1=newSameCircle();SameCirclec2=newSameCircle(3,4,5);}}哪个语句有错?为什么?4.5对象(类的实例化)4.5.1对象的生成

(1)对象的声明格式:<类名><对象名>;如:SameCirclec1,c2;c1和c2是两个空对象。c1c2(2)创建对象格式:<对象名>=new<类名>(实参);如:c1=newSameCircle(3,4,5);c2=newSameCircle(6,7,8);345…678…c1c2对象c1的首地址对象c2的首地址4.5.2对象的引用SameCirclec1=newSameCircle(3,4,5);SameCirclec2=c1;345…c1对象c1的首地址c2对象c1的首地址c2是c1的引用,是c1的首地址作业书面作业:400页

第1章

二、2、3上机作业:1.403页

三、22.编写一个类模拟银行账户基本属性和操作(存款、取款、查询信息等)。4.5.3对象的清除对象为null时,由Java的自动垃圾收集机制清除对象,释放对象占用内存手动编写finalize()方法撤销对象——不提倡使用4.5.4对象的内存模型栈内存:在方法中定义的变量(基本类型和引用类型)。超过变量的作用域时,自动释放变量的内存堆内存:new创建的对象(包括数组),由Java的自动垃圾收集机制来清除示例(1)声明对象Personp;未初始化地址p栈内存堆内存示例(2)创建对象p=newPerson();未初始化地址p栈内存堆内存null00.0…0.0nameageweightheight0x30000x3000注意二者的区别栈stack——连续的内存区域,大小固定,编译时确定所需空间大小,效率高堆heap——不连续的内存区域,运行时确定所需空间大小(支持面向对象的多态性,如:运行时才能确定是哪个类的对象),效率低,但灵活4.6实例成员和类成员例4-10publicclassClerk{privateintC_ClerkNo;publicstaticintC_NextClerkNo=1000;publicClerk(){C_ClerkNo=++C_NextClerkNo;}}例4-10classTest{publicstaticvoidmain(Stringargs[]){Clerkc1=newClerk();Clerkc2=newClerk();}}例4-10publicclassClerk{privateintC_ClerkNo;publicstaticintC_NextClerkNo=1000;publicClerk(){C_ClerkNo=++C_NextClerkNo;}publicintgetClerkNo(){returnC_ClerkNo;}}例4-10classTest{publicstaticvoidmain(Stringargs[]){Clerkc1=newClerk();Clerkc2=newClerk();System.out.println(“c1:nextClerkNo”);System.out.println(c1.C_NextClerkNo);System.out.println(“c1:clerkNO”);System.out.println(c1.getClerkNo());…}}Clerk+C_NextClerkNo:int=1000-C_ClerkNo:intc1:ClerkC_ClerkNo=1001c2:ClerkC_ClerkNo=1002《实例》《实例》在这个示例中,为创建的每个对象分配了一个唯一的序列号,从1000开始向上递增。变量C_NextClerkNo在所有实例间共享,因此当一个对象的构造器增加C_NextClerkNo的值时,下一个创建的对象就可接收到这个增加的值。类属性说明使用static来标记的变量是共享于类的所有实例的变量。例如:可以使用该变量作为实例间通信的基础,或者跟踪已创建的实例数。如果static变量未被标记为private,那么可从类外访问它。这样,不需要类的实例,就可通过类名引用它。publicclassOtherClass{publicvoidincrementNumber(){Count.counter++;}}类属性的使用API中:如Math.PI(不用创建Math类的对象就可以使用PI这个类属性)作为全局变量,即只想用一个存储区域来保存特定的数据。无论创建多少个对象,甚至不创建对象都可以使用。思考题:1.银行卡的年费2.例4-11银行卡举例publicclassBankCard{privateStringCardNO;//卡号…

publicstaticdoubleannual_fee;//年费}例4-11publicclassClerk{privateintC_ClerkNo;privatedoubleC_ClerkSalary;publicstaticintC_NextClerkNo=1000;publicstaticdoubleC_LowSalary=280;//最低工资publicClerk(doublesalary){C_ClerkNo=++C_NextClerkNo;C_ClerkSalary=C_LowSalary+salary;}}static方法类方法示例publicclassClerk{privateintC_ClerkNo;publicstaticintC_NextClerkNo=1000;publicstaticintgetNextNo(){returnC_NextClerkNo;}publicClerk(){C_ClerkNo=++C_NextClerkNo;}}使用类名访问静态方法publicclassTest{publicstaticvoidmain(Stringargs[]){System.out.println(“Numberofclerkis”+Clerk.getNextNo());Clerkc1=newClerk();System.out.println(“Numberofclerkis”+Clerk.getNextNo());}}static方法说明main()方法是static方法,因为执行main方法时,JVM并不创建类的实例。因此如果有成员数据,必须创建对象来访问它。如:Math类的运算方法都定义为static,可以直接通过Math.方法名()来访问。static方法说明除了局部变量、static属性及其参数外,static方法不能访问任何变量。如果试图访问非static属性会引起编译器错误。非static属性绑定到一个实例上并且只有通过实例引用才能访问。错误的例子publicclassClerk{privateintC_ClerkNo;publicstaticintC_NextClerkNo=1000;publicClerk(){C_ClerkNo=++C_NextClerkNo;}publicstaticintgetNextNo(){returnC_ClerkNo;//编译错误}}判断哪些语句错误?classTest{staticintnum;intc;publicstaticvoidmain(Stringargs[]){num=100;c=100;}staticvoidss(){num=100;c=100;}voidtt(){num=100;c=100;}}正确的写法classTest{staticintnum;intc;publicstaticvoidmain(Stringargs[]){num=100;Testt=newTest();t.c=100;}}分析书上的例子

错在哪儿?classInstanceTest{intVariable;staticpublicintmethod(){returnVariable;}staticpublicvoidmethod2(intvariable){this.Variable=variable;}}静态初始化器静态初始化一个类可以在“静态块”中(而非方法体内)包含代码静态块代码仅在加载类时执行一次如果类中包含多个静态块,它们将被按照在类中出现的顺序执行示例1classCount{publicstaticintcounter;static{counter=10;}}publicclassTest{publicstaticvoidmain(Stringargs[]){System.out.println(“counter=”+Count.counter);}}

示例2classss{static{System.out.println(“hi”);}}publicclassTest{publicstaticvoidmain(Stringargs[]){sst1=newss();sst2=newss();sst3=newss();}}初始化实例变量的初始化——构造函数类变量(static变量)的初始化——静态初始化器4.7应用程序的命令行参数格式一:java类名

参数1参数2参数3…要求:1.参数之间以空格分隔2.参数中不能包含空格例4-12if(args.length>0){for(inti=0;i<args.length;i++)System.out.println(args[i]);}应用程序的命令行参数格式二:java类名

“参数1”

“参数2”

“参数3”…要求:参数中可以包含空格注意:参数一和参数二可以混合使用,即带空格的参数用双引号,不带空格的参数不必用双引号例4-15任意输入五个数,求它们的平均值。注意:接收到的参数需要进行类型转换,将字符串转换为数值型。例4-15floatsum=0;if(args.length==5){for(inti=0;i<5;i++)sum+=Float.parseFloat(args[i]);}System.out.println(sum);System.out.println((float)sum/args.length);书面作业403页

三、4接收键盘输入的方法importjava.io.*;classtest{publicstaticvoidmain(Stringargs[])throwsIOException{Strings;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));s=in.readLine();System.out.print(s);}}5.1类的继承Employee类Employee+name:String+salary:double+birthDate:Date+getDetails():StringpublicclassEmployee{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringgetDetails(){...}}Manager类Manager+name:String+salary:double+birthDate:Date+department:String+getDetails():StringpublicclassManager{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringdepartment;publicStringgetDetails(){...}}子类化Employee+name:String+salary:double+birthDate:Date+getDetails():StringManager+department:StringpublicclassEmployee{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringgetDetails(){...}}publicclassManagerextendsEmployee{publicStringdepartment;}单继承

(Java只支持单继承)当类只从一个类继承时,称为单继承语法:<修饰符>class<名称>[extends<父类>]{<声明>*}实例importjava.util.Date;classEmployee{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringgetDetails(){

returnname+salary;

}}classManagerextendsEmployee{publicStringdepartment;}publicclassTest1{publicstaticvoidmain(Stringargs[]){Managerx=newManager();="Jack";x.salary=5000;System.out.println(x.getDetails());}}Date类举例:

以03-25-2010的形式输出日期importjava.text.SimpleDateFormat;importjava.util.Date;publicclasstest{publicstaticvoidmain(String[]args){SimpleDateFormatSDF=newSimpleDateFormat("MM-dd-yyyy");Datedate=newDate();System.out.println(SDF.format(date));}}Date类举例:输出星期几importjava.text.SimpleDateFormat;importjava.util.Date;publicclasstest{publicstaticvoidmain(String[]args){SimpleDateFormatSDF1=newSimpleDateFormat("E");Datedate=newDate();System.out.println(SDF1.format(date));}}说明子类可以继承超类中非private的方法和属性——不必重新定义子类中可以增加新的属性和方法继承的目的:程序代码重用,减少冗余96页的例子Vehicle+speed:int+maintanceRecord:String+getSpeed():int+getMaintanceRecord():StringAutomobile-strModel:String-dateOfMade:String+getModel():String+getDateOfMade():String分析子类中有哪些属性和方法?5.1.2方法的重载(overload)一个类中有多个同名的方法

如:Math类中的min()方法条件(满足其一):参数的个数不同参数的类型不同如果两个方法仅返回值不同,不是重载,会报错思考——错在哪儿?classtest{publicvoidprinttest(){System.out.println("ss");}publicintprinttest(){return1;}}例5-1:对矩形进行初始化

方法1:左上角和右下角坐标MyRectbuildRect(intx1,inty1,intx2,inty2){this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;returnthis;}例5-1:对矩形进行初始化

方法2:左上角和右下角的点MyRectbuildRect(PointtopLeft,PointbottomRight){x1=topLeft.x;y1=topLeft.y;x2=bottomRight.x;y2=bottomRight.y;returnthis;}例5-1:对矩形进行初始化

方法3:左上角的点和矩形的宽和高MyRectbuildRect(PointtopLeft,intw,inth){x1=topLeft.x;y1=topLeft.y;x2=x1+w;y2=y1-h;returnthis;}5.1.3方法的覆盖(override)覆盖方法子类可以修改从父类继承的行为子类可以创建与父类的方法不同功能的方法,但下面是相同的:方法名返回类型参数列表实例importjava.util.Date;classEmployee{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringgetDetails(){

return“name:”+name+“\n”+“salary:”+salary;

}}classManagerextendsEmployee{publicStringdepartment;publicStringgetDetails(){

return"name:"+name+"\n"+"salary:"+salary+"\n"+"Managerof:"+department;}}实例publicclassTest1{publicstaticvoidmain(Stringargs[]){Employeee=newEmployee();="Mary";e.salary=3000;System.out.println(e.getDetails());Managerx=newManager();="Jack";x.salary=5000;x.department="Infor";System.out.println(x.getDetails());}}例5-2classCitizen{publicStringpersonID=“000000000000000000”;publicStringname=“无名氏”;publicStringsex=“男”;publicStringbirthday=“1900.1.1”;publicvoiddisplay(){…}}例5-2classStudentextendsCitizen{publicStringstudentID;publicStringregisterTime;publicintinit_result;publicvoiddisplay(){super.display();//执行父类的display()方法…//子类中需要显示的更多的内容}}super关键字super关键字往往在覆盖方法时,真正的目标不是代替现有的行为,而是在某些方面扩展那个行为类中使用super来指向父类的成员,包括数据和方法super的三种使用方式super.方法名([参数表]);——调用父类的方法super.成员变量名——访问父类的成员变量super([参数表]);——调用父类的构造函数实例importjava.util.Date;classEmployee{privateStringname;privatedoublesalary;privateDatebirthDate;

publicStringgetDetails(){

return“name:”+name+“\n”+“salary:”+salary;

}}classManagerextendsEmployee{privateStringdepartment;publicStringgetDetails(){

returnsuper.getDetails()+"\n"+"Managerof:"+department;}}构造函数不能继承子类从父类继承所有的方法和变量子类不能继承父类的构造函数有两种方法获得构造函数使用默认构造函数编写一个或多个构造函数调用父类构造函数要调用父类构造函数,必须在子类构造函数的第一行使用super关键字要调用特定的父类构造函数,必须为super提供参数如果没有this或super调用,编译器会插入一个对父类无参数构造函数的隐含调用:super()classEmployee{privateStringname;privatedoublesalary;publicEmployee(Stringn,doubles){name=n;salary=s;}publicEmployee(Stringn){name=n;}}classManagerextendsEmployee{privateStringdepartment;publicManager(Stringname,doublesalary,Stringdept){super(name,salary);department=dept;}publicManager(Stringname,Stringdept){super(name);department=dept;}

publicManager(Stringdept){department=dept;}}哪儿有问题?实例publicclassTest1{publicstaticvoidmain(Stringargs[]){Managerx=newManager("ss",4000,"rr");}}上机作业定义一个形状类CShape,在此基础上派生出矩形类CRectangle和圆类CCircle,两者都有GetArea()函数计算对象的面积。试编写一个完整的程序。上机发现的问题

有则改之,无则加勉环境变量如何设置?文件保存为*.java编译:javac*.java,编译通过后显示什么?运行:javamain方法所在类名main方法写在哪儿?importjava.io.*是什么?类图CShape+GetArea():double+GetArea():doubleCRectangle+x:double+y:double+GetArea():doubleCCircle+r:double课时六

2009-9-21变量多态类型为X的参考变量,其指向的对象类型既可以是X,也可以是X的子类如:Employeex=newManager();Employeey=newEmployee();例1——实例方法能够被覆盖classSuper{Stringname(){return“mother";}}classSubextendsSuper{Stringname(){return“baby";}}

例1——实例方法能够被覆盖classTest{publicstaticvoidmain(String[]args){Supers=newSub();System.out.println(());}}例2——静态方法不能被覆盖classSuper{staticStringname(){return“mother";}}classSubextendsSuper{staticStringname(){return“baby";}}例2——静态方法不能被覆盖classTest{publicstaticvoidmain(String[]args){Supers=newSub();System.out.println(());}}原因静态方法在编译时根据调用该方法的类或对象所属的类决定实例方法在运行时根据对象所属的类决定例如:Supers=newSub();编译时s是Super类的对象,而运行时s指向Sub类的对象例3——属性的隐藏classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;}例3——属性的隐藏publicclassTest{publicstaticvoidmain(String[]args){Subclasss=newSubclass();System.out.println(s.x+""+s.y);}}输出什么?修改例3:例3’publicclassTest{publicstaticvoidmain(String[]args){Bases=newSubclass();System.out.println(s.x+""+s.y);}}输出什么?原因:编译时根据类或对象类型决定总结父类的实例方法被子类的同名实例方法覆盖父类的静态方法被子类的同名静态方法隐藏父类的实例变量和类变量可以被子类的实例变量和类变量隐藏例4classBase{intx=1;staticinty=2;Stringname(){return"mother";}staticStringstaticname(){return"staticmother";}}classSubclassextendsBase{intx=4;inty=5;Stringname(){return"baby";}staticStringstaticname(){return"staticbaby";}}例4publicclassTest{publicstaticvoidmain(String[]args){Subclasss=newSubclass();System.out.println(s.x+""+s.y);System.out.println(());System.out.println(s.staticname());Basess=s;System.out.println(ss.x+""+ss.y);System.out.println(());System.out.println(ss.staticname());}}隐藏和覆盖的区别将子类对象转换为父类对象(直接赋值)后,可以访问被隐藏的变量和方法(编译时根据类型决定),但是不能访问被覆盖的变量和方法(运行时根据类型决定)。instanceof操作符

修改例4可以根据对象所属的类进行不同的处理:

publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.x+""+ss.z);System.out.print(());System.out.print(ss.staticname());}}还存在问题?classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;intz=9;}编译出错publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.z);}}解决方法——对象类型转换publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(((Subclass)ss).z);}}对象类型转换

——对例2的修改classSuper{staticStringname(){return"mother";}}classSubextendsSuper{staticStringname(){return"baby";}}对象类型转换

——对例2的修改classTest{publicstaticvoidmain(String[]args){Supers=newSub();System.out.println(((Sub)s).name());}}对象类型转换

——对例3’的修改classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;}对象类型转换

——对例3’的修改publicclassTest{publicstaticvoidmain(String[]args){Bases=newSubclass();System.out.println(((Subclass)s).x+""+((Subclass)s).y);}}多态的应用举例——例5classAnimal{publicvoideat(){}}classDogextendsAnimal{publicvoideat(){System.out.println("狗吃骨头");}}classCatextendsAnimal{publicvoideat(){System.out.println("猫吃老鼠");}}classWolfextendsAnimal{publicvoideat(){System.out.println("吃喜羊羊");}}多态的应用举例——例5classTest{publicstaticvoidmain(Stringargs[]){Animalaa[]=newAnimal[3];aa[0]=newDog();aa[1]=newCat();aa[2]=newWolf();for(inti=0;i<3;i++){aa[i].eat();}}}抽象类抽象类抽象类:只能被继承,不能实例化的类。定义格式:abstractclass类名{abstract返回值类型

方法名([参数表]);…}说明:抽象类中可以包含抽象和非抽象方法,也可以不

温馨提示

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

评论

0/150

提交评论