欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    java教程--类与对象.ppt

    • 资源ID:2124777       资源大小:1.75MB        全文页数:105页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    java教程--类与对象.ppt

    4.类与对象,主讲:王华彬,知识点,变量作用域 构造方法 方法重载 参数传递 实例成员和类成员 package import 访问权限 可变参数,Java技术及其应用,面向对象的三个特性: 封装、继承和多态 本章学习封装性,类的封装性体现在,把一类事物所具有的相同的属性和方法封装在一起。 然后通过定义该类的一个对象,进而对该对象的属性赋值,调用类的方法,从而完成一定的功能,封装性,汽车类: CLASS car 属性: 颜色, 灰色、红色、黄色 品牌, 法拉利、现代、马自达 类型, 赛车、轿跑车、SUV 方法: 启动 前进 倒车 熄火 car 罗院长的车 =new car(); 罗院长的车.carColor=gray;罗院长的车.carBrand=现代; 罗院长的车.carStart();罗院长的车.carStop();,封装性,手机类: CLASS phone 属性: 颜色, 灰色、红色、黄色 品牌, 苹果、谷歌、三星 类型, 触屏、直板、翻盖 方法: 开机 拨号 挂断 关机 phone 王玮的手机 =new phone(); 王玮的手机.phoneColor=gray;王玮的手机.phoneBrand=诺基亚*; 王玮的手机.phonePoweron();王玮的手机.phonePoweroff();,类定义的一般要求,class Rect double width; double height; double getArea() double area=width*height; return area; 要求:类名是合法标示符,且容易理解 定义一个类包括三步: 取类名 定义属性 定义方法,类定义的一般要求,class car int carBrand; char carColor; int carKind; /属性一般写在方法前习惯先定义属性,再定义方法; /一行只定义一个属性,不提倡int carBrand , carKind; /变量首字母小写,第2个单词开始字母大写 int startCar(); int forward(); int reversing(); int stopCar(); ; /方法 函数 ,类的属性 或称为成员变量,类的属性初始值,class Rect double width; double height; double getArea() double area=width*height; return area; ,Java技术及其应用,class 类名 成员变量; 成员方法; ,width=0.0; height=0.0;,类成员变量可以不赋初值,默认0,false; 局部变量需要赋初值。,类的属性初始值,class Rect double width=1; double height; double getArea() double area=width*height; return area; class test public static void main(String args) Rect r=new Rect(); System.out.println(r.width); System.out.println(r.height); 思考:程序的输出?,Java技术及其应用,double width; width=1;,变量作用域,class Rect double width; double height; double area; double getArea() double area=width*height; return area; void setHeight (double height) this.height=height; ,Java技术及其应用,成员变量,方法体内局部变量,方法的参数变量,成员变量,即属性的有效区是整个类; 方法中的局部变量的有效区是该方法; 方法的参数的有效区在该方法中; 当成员变量和方法的局部变量或方法的参数变量相同时,成员变量被隐藏, 即:成员变量在方法中暂时失效,Java技术及其应用,this关键字,当成员变量被同名的局部变量或方法的参数变量隐藏时(即成员变量在方法中暂时失效), 为了表示成员变量,可以用this.成员变量为指代 this指向调用该成员方法的对象。 Rect r=new Rect (); this可以理解是r的引用,变量作用域例题,class Variable int x=10;/成员变量 int y; void init() int x=5; y=x; System.out.println(y); 思考:程序输出?,/此时y=x=5,变量作用域例题,class Variable int x=10;/成员变量 int y; void init() int x=5; y=this.x; System.out.println(y); ,/此时y=x=10,class Variable int x=0,y=0,z=0;/成员变量 void init(int x,int y) this.x=x; this.y=y; int z=5;/方法中的局部变量 System.out.println(x+“ “+y+“ “+z); Variable v=new Variable(); System.out.println(v.x+“ “+v.y+“ “+v.z); v.init(20,30); System.out.println(v.x+“ “+v.y+“ “+v.z);,20,30,v.x=20,v.y=30,再来一个例题,public class A void f() int m=10,sum=0; if(m9) int z=10; z=2*m+z; for(int i=0;im;i+) sum=sum+i; m=sum; z=i+sum; ,Java技术及其应用,编译错,错在哪儿?,Z的有效区在if; i的有效区在for,课后习题4-8,class B int x=100,y=200; public void setX(int x) x=x; public void setY(int y) this.y=y; public int getXYSum() return x+y; ,Java技术及其应用,B b=new B(); b.setX(-100); /成员变量b.x=? b.setY(-200); /成员变量b.y=? System.out.println(b.getXYSum(); /成员变量x=100; /成员变量y=-200 /X+y=-100,变量作用域知识点小结,类的成员方法中定义的局部变量或成员方法的参数变量都会隐藏掉同名的类的成员变量, 这时可以使用this关键字来表示同名的类的成员变量 this关键字指向调用该成员方法的对象。,Java技术及其应用,已经介绍了类的属性,接下来是: ? 类的方法 或称为成员函数 1、构造方法 2、成员方法,构造方法,public class Example public static void main(String args) Rect r1= new Rect(); /创建对象 r1.width=128;/使用对象 r1.height=69; double area=r1.getArea(); System.out.println(“rectangle的面积:“+area); ,Java技术及其应用,分配空间,并初始化对象,调用构造方法,构造方法,class Rect double width; double height; double getArea() double area=width*height; return area; ,Java技术及其应用,Rect() ,构造方法是一种特殊的方法 构造方法名和类名相同 无返回类型 构造方法在new创建对象时被调用 若无构造方法,按照默认的构造方法仅分配空间 构造方法可以重载,Rect r1=new Rect();,构造方法: 是一个函数 和类同名 对类的属性进行赋值 可以重载,,构造方法的重载,class Rect double width; double height; Rect() width=10.0; height=20.0; Rect(double x,double y) width=x; height=y; double getArea() ,构造方法名相同,而 参数的个数或类型不同,Rect() ,构造方法的调用,public class Example public static void main(String args) Rect r1= new Rect(); /创建对象 double area1=r1.getArea(); Rect r2= new Rect(1,2); /创建对象 double area2=r2.getArea(); ,Java技术及其应用,一个类可以定义多个构造方法,根据参数个数或类型不同, 使用不同的构造方法, 构造函数作用是:为对象分配内存空间,为对象的属性赋初始值,方法重载(Method Overloading),多个方法可以享有相同的名字 方法的参数必须不同 或者是参数个数不同; 或者是参数类型不同; 完成的功能相似 返回类型不能作为区分函数重载的标准,方法重载的好处,要打印不同类型的数据:int, float, String,不需要定义不同名的方法名: printInt(int); printFloat(float); printString(String); 利用方法重载,只需要定义一个方法名print(),接收不同的参数: print(int); print(float); print(String);,class MethodOverloading void receive(int i) System.out.println(“Receive one int data “); System.out.println(“i=“+i); void receive(int x,int y) System.out.println(“Receive two int datas “); System.out.println(“x=“+x+“ y=“+y); ,方法重载例题,void receive(double d) System.out.println(“Receive one double data “); System.out.println(“d=“+d); void receive(String s) System.out.println(“Receive a string “); System.out.println(“s=“+s); ,方法重载例题,public class MethodOverloadingTest public static void main(String args) MethodOverloading mo=new MethodOverloading(); mo.receive(1); mo.receive(2,3); mo.receive(12.56); mo.receive(“very interesting,isn't it“); ,方法重载例题,多态性:发送消息给某个对象, 让该对象自行决定响应何种行为。,书上例题4-11,见.Java文件,Java技术及其应用,练习,课后习题4-10,Java技术及其应用,小结,构造方法 构造方法是一种特殊的方法 方法名和类名相同 无返回类型 构造方法在new创建对象时被调用 若无构造方法,按照默认的构造方法仅分配空间 构造方法可以重载,即可以有多个构造方法,Java技术及其应用,类的方法,与c语言的函数定义基本相同,只不过在类中称为方法,在此不再赘述 。 需要注意的是:在方法体内,成员变量和局部变量的区别。其实可以把成员变量当做全局变量理解即可。,小结,方法重载 多个方法可以享有相同的名字 方法的参数必须不同 或者是参数个数不同; 或者是参数类型不同; 完成的功能相似 返回类型不能作为区分函数重载的标准 体现面向对象的多态性,Java技术及其应用,类变量和简单数据类型变量的区别,Circle c1; int i;,Java技术及其应用,只声明,未分配空间,c1=null,声明的同时分配空间,简单数据类型变量,int i; i=1; int j; j=2; j=i;,Java技术及其应用,i,j,1,2,1,i和j分别指向两块不同的内存区域。 j=I;把i中的内容复制到j中;,类变量,Java技术及其应用,Circle c1; c1=new Circle(); Circle c2; c2=new Circle(); c2=c1;,c1,c2,c1和c2指向同一块内存区域。 c2=c1;c2相当于c1的引用; 此时,c2原来的内存空间被释放;,几条注意事项,1、不要定义没有实体的类的空对象,必需通过 new+构造函数创建对象; 2、对象的名字,可以认为是该对象对应内存区域的一个引用,即:一个别名。如果对象直接进行赋值,则原先的内存被释放。 3、在java语言中,类只有构造方法,没有析构方法,只是因为java语言有垃圾回收机制。这也正是java程序一般很少有内存泄露的原因。,已经介绍了类的属性和方法, 包括:成员变量的作用域 构造函数及重载 对象创建的原理 接下来,介绍一下方法的参数传递中的注意事项,成员方法参数,参数的类型: 简单数据类型:传值,不改变参数的值; 引用数据类型(数组类型、类或接口):传地址,可改变参数的值; class Method void receive(int i)i=6; 在main函数中,执行如下代码,思考输出? Method m=new Method (); int a=5; m. receive(a); System.out.println(a);,此时:a为全局变量,通过 参数i传到receive方法中, i相当于a的复制品, i的改变不改变a的值,class Method void receive(int i)i=6; 在main函数中,执行如下代码,思考输出? Method m=new Method (); float a=5; m. receive(a); System.out.println(a);,参数传递的值的级别 不能高于该参数值, 可以低于该参数值,参数传递,当传递的参数是简单类型的时候,传值,方法调用结束后原值不变; 当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。 int a=5; void receive(int i)i=6;,Java技术及其应用,5,5,6,a,i,i,如果参数是引用的话: 当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。 注意: 对象名是一种引用,5,a,i,6,i=6,再看一个综合性的例子!,传值和传地址举例,public class PassTest float ptValue; public void changeInt(int value) value=55; public void changeObjValue(PassTest ref) ref.ptValue=99f; public static void main(String args) int val; PassTest pt=new PassTest(); val=11; pt.changeInt(val); /val=? pt.ptValue=101f; pt.changeObjValue(pt); /pt.ptValue=? ,练习,Java技术及其应用,课堂练习 : 请同学们思考结果,并解释 public class Swap void swapp(int x,int y) int temp; System.out.println(x+“,“+y); temp=x; x=y; y=temp; System.out.println(x+“,“+y); public static void main(String args) int u=30,v=50; System.out.println(u+“,“+v); Swap s=new Swap(); s.swapp(u,v); System.out.println(u+“,“+v); ,练习,Java技术及其应用,public class Swap1 int x,y; void swapp(Swap1 s) int temp; System.out.println(s.x+“,“+s.y); temp=s.x; s.x=s.y; s.y=temp; System.out.println(s.x+“,“+s.y); int u=30,v=50; Swap1 s=new Swap1(); s.x=u; s.y=v; System.out.println(s.x+“,“+s.y); s.swapp(s); System.out.println(s.x+“,“+s.y);,参数传递小结,当传递的参数是简单类型的时候,传值,方法调用结束后原值不变; 当传递的参数是引用类型的时候,传地址,方法调用结束后原值会变。,Java技术及其应用,在之前的学习中,我们知道: 类的属性和方法,必须先创建对象,然后通过对象调用,为什么输出函数可以直接调用呢? System.out.println(); 请同学们思考: System是什么? Out是什么? println()是什么?,类成员 和实例成员 static关键字 静态成员:静态成员变量和静态成员函数,static关键字,class 类名 成员变量; 成员方法; class 类名 成员变量; 成员方法; ,static,static,实例成员,类成员或 静态成员,类变量 和实例变量,类的组成部分是: 属性和方法,及成员变量和成员函数 成员变量的类型分为两种: class rect int weight; /实例变量 static int height; /类变量或静态变量 ,由static修饰的成员变量,称为类变量。 1、一个类的不同对象,分别分配空间,一个对象的实例变量改变,不影响其他类; 2、但是对于类变量,在字节码文件加载到内存时,如果没有创建对象,实例变量就不分配内存,而类变量分配了内存,思考:意味着什么? 而且,所有的对象的类变量都共享同一个内存,即:如果一个对象的类变量改变,其他对象的类变量也同时改变。,类成员和实例成员,类成员(属性或方法) 用static修饰的成员; 属于类; 所有对象共享一个类成员,只有一个。 实例成员(属性或方法) 无static修饰的成员; 属于对象; 每个对象都有各自的一个,相互独立。,类成员和实例成员,类成员 用类名或对象名来调用; 对类成员的修改影响整个类的所有对象的类成员; 类成员方法只能对类成员变量进行操纵; 实例成员 用对象名来调用; 对某对象实例成员的修改不会影响其他对象的实例成员;,class Student String name; static String school=“北京大学“; class t public static void main(String args) System.out.println(Student.school);/正确 System.out.println(Student. name); /错误 Student stu1=new Student(); System.out.println(stu1.school); System.out.println(stu1. name); /对于类变量,可以在主函数中,不创建该类对象,而直接使用类名进行调用,也可以通过创建对象,通过对象进行调用,共享内存,实例成员和类成员举例,举例memberTest.java,类memberTest,类变量a 实例变量b,方法,。,对象a,对象b,对象n,类变量a 实例变量b,函数,类变量a 实例变量b,函数,类变量a 实例变量b,函数,类变量a,方法,实例成员方法在生成第一个对象时被分配了入口地址;,类成员方法在类被装载内存时被分配了入口地址;,Student.java,public class Student String name; static String school=“北京大学“; public static void main(String args) Student stu1=new Student(); Student stu2=new Student(); Student stu3=new Student(); stu1.name=“1“; stu2.name=“2“; stu3.name=“3“; System.out.println(stu1.name+“,“+stu1.school); System.out.println(stu2.name+“,“+stu2.school); System.out.println(stu3.name+“,“+stu3.school); stu2.school=“安徽大学“; System.out.println(stu1.name+“,“+stu1.school); System.out.println(stu2.name+“,“+stu2.school); System.out.println(stu3.name+“,“+stu3.school); /思考程序的输出结果 ,Java技术及其应用,对于方法,也分为:类方法和实例方法 class rect int start() /实例方法 static int stop /类方法 1、对于实例方法,只有创建对象后,通过对象调用。 2、对于类方法,可以不创建对象直接通过类名调用,也可以创建对象,通过对象调用。 3、实例方法可以调用实例变量和类变量,而类方法不能调用实例变量,思考为什么? 因为:类方法在对象创建之前就可以使用,而此时实例变量还没有分配内存。,class Student String name; static String school=“北京大学“; void start1() System.out.println(name); System.out.println(school); static void start() System.out.println(name); System.out.println(school); ,练习,class Student String name; static String school=“北京大学“; void start1() System.out.println(name); System.out.println(school); static void start() System.out.println(school); class t public static void main(String args) Student.start(); /类方法,可由类名直接调用 ,Java技术及其应用,main()方法,思考:为什么main()方法用static修饰? public class Student public static void main(String args) java 类名.main() Student .main() 一个类的main方法必须用static修饰,因为Java运行时系统在开始执行一个程序前,并没有生成类的一个实例,它只能通过类名来调用main方法作为程序的入口。,static关键字小结,用static修饰的类中的成员变量或成员方法,都称为类的成员;-类 没有用static修饰的,称为实例成员。-对象 类的成员唯一;而对象的成员有多个,每个相互独立。 类的成员由类或对象来调用;实例成员由对象来调用 类的成员在类有了之后就存在了,而实例成员必须在生成对象之后才存在。,Java技术及其应用,思考: this 关键字 能否在类方法中调用?为什么? class Rect static double width; static double height; double area=0; static double getArea() double area=width*height; return this.area; ,思考2:,在Java编程中,我们常常用System.out.println()方法来输出字符串,也许我们都已经猜到println()是方法名,但System是什么,out又是什么呢? 其实System是java.lang包里面的一个类 而out就是System类里面的一个静态成员变量,其类型是java.io.PrintStream类; 被关键字static修饰的数据成员或方法可以直接通过“类名.数据成员”或“类名.方法”来引用,而无须先建立对象。所以System.out是应用了out这个静态数据成; 而out又是一个java.io.PrintStream类的对象,所以out必然可以调用java.io.PrintStream类里面的方法,println()就是java.io.PrintStream类里的一个方法,它的作用就是用来想控制台输出信息的,class System static java.io.PrintStream out; / System. out class PrintStream println() / System. out . println(),包(package),由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同, 因此,同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。 比如:同一文件夹下,不能有相同名称的文件,而不同文件夹下的文件名可以相同。 c:/我的音乐/国歌.MP3 c:/我的音乐/好听/国歌.MP3,包(package),Ex1.java public class Ex1 class A package p1; public class Ex1 class A p1.A,Ex2.java public class Ex2 class A package p2; public class Ex2 class A p2.A,package语句,package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为: package pkg1.pkg2.pkg3; Java编译器把包对应于文件系统的目录管理,package语句中,用 . 来指明目录的层次;,package语句,package p1; public class Ex1 class A p1.A p1/A.class,package p2; public class Ex2 class A p2.A p2/A.class,package 的实际含义是指:定义当前java文件所在的文件夹路径,以及生成字节码文件的路径,命令行下编译和运行带包的Java程序,若无package语句,类都放入缺省的无名包中,对应于当前文件夹; 若有package p1; package p1; public class Ex1 Ex1类放入p1包内, 对应于文件目录:当前目录下创建p1文件夹,下放Ex1.java文件 编译方式:javac p1Ex1.java 运行方式:java p1.Ex1,练习,package s1.s2.s3.s4; public class Hello 如何存放Hello.java文件? 如何编译和运行? 当前文件夹下创建s1,再创建s2,再创建s3, 再创建s4,在s4里面放Hello.java 在当前文件夹下javac s1s2s3s4Hello.java 在当前文件夹下java s1.s2.s3.s4.Hello,Java技术及其应用,JCreator处理带包的Java程序,package p1; public class Ex1 class A Jcreator不需把源文件放入p1中,自动在当前文件夹下创建子目录p1,并将生成的字节码文件Ex1.class和A.class存入其中。,Java技术及其应用,同一个包,即同一个文件夹下的类可以互相调用,如果属于不同包的类,怎么处理? import命令,import语句,为了能使用不在同一个包中的其他类,我们需要用import语句来引入所需要的类。 import package1.package2. (classname |*); 例如: import java.awt.*; import java.util.Date; Java编译器为所有程序自动引入包java.lang,因此不必用import语句引入它所包含的所有类。,import语句,import java.util.Date; java/util/Date.class 当前目录下没有java文件夹!? 包的根目录由classPath决定。 classPath: c:/Program files/java/jdk1.6/jre/lib/rt.jar;.; 思考:如何引入自定义包?,Java技术及其应用,之前,我们做的所有实验,都没有定义包,如果一个源文件没有使用包语句,则得到的类没有包名,该类如果被使用,必须放在需使用工程的目录下。 但是,如果有其他包中的类名和该无包类的类名相同,就可能产生混淆。 比如:现有工程下有一个无名包中的类 A;通过import又引入了一个类:tom.A,则默认情况下, A类认为是tom.A。 正确的使用方法是: tom.A a=new tom.A(); /tom.A类 A a=new A(); /无名包A类,import语句,import java.util. Date ; class myDate Date date=new Date(); Class myDate java.util.Date date=new java.util.Date(); ,小结,package p1; 即指明当前java文件的包路径,方面进行工程管理。 Import ,引入其他包中的类,如果引入自定义包中的类,需要在环境变量中设置CLASSPATH。 Import 其他包中的类时,一般情况下,最好把类和包的全名都写上。即: import a.b.c /引入a.b下的c类 a.b.c test=new a.b.c(); 而不要写成c test=new c();,小结:Java程序结构,package p; import ; import ; class class public class . ,Java技术及其应用,0-1个,0-多个,0-多个,1个,访问权限,class 类名 成员变量; 成员方法; 类名 对象名=new 类名(); 对象名.成员变量;,Java技术及其应用,成员的访问权限,对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private default protected public ,成员的访问权限,private:同类。 default:同类,同包。默认情况下都是default。 protected:同类,同包,子类(不一定要同包) 处在不同包中的子类可以访问父类中限定为protected的成员,但这时访问这些成员的对象必须具有子类的类型或是子类的子类类型,而不能是父类类型。 public:所有,private,class Tom private float weight; private float f(float a,float b) return a+b; class Jerry void g() Tom cat=new Tom(); cat.weight=23f; float sum=cat.f(3,4); ,Java技术及其应用,public,class Tom public float weight; public float f(float a,float b) return a+b; class Jerry void g() Tom cat=new Tom(); cat.weight=23f; float sum=cat.f(3,4); ,Java技术及其应用,default,class Tom float weight; float f(float a,float b) return a+b; class Jerry void g() Tom cat=new Tom(); cat.weight=23f; float sum=cat.f(3,4); ,Java技术及其应用,protected,class Tom protected float weight; protected float f(float a,float b) return a+b; class Jerry void g() Tom cat=new Tom(); cat.weight=23f; float sum=cat.f(3,4); ,Java技术及其应用,成员的访问权限,对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private default protected public ,练习,课后习题4-7,Java技术及其应用,访问权限一般做法,class 类名 private folat height; private folat width; public void setHeight(float height) this.height=height; public void setWidth(flo

    注意事项

    本文(java教程--类与对象.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开