《JAVA程序设计 ch06面向对象编程.ppt》由会员分享,可在线阅读,更多相关《JAVA程序设计 ch06面向对象编程.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 面向对象编程面向对象编程JavaJavaJavaJava程序设计程序设计程序设计程序设计 http:/路路 强强2023/1/13PagePage 2 2 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and Information本章学习提示本章学习提示本章学习本章学习Java语言中面向对象编程的具体实施过程。语言中面向对象编程的具体实施过程。封装与继承封装与继承覆盖与重载覆盖与重载多态多态类的强制转换类的强制转换C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程
2、面向对象编程PagePage 3 3 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and Information目目 录录封装与继承封装与继承1多态机制多态机制32覆盖与重载覆盖与重载类的转换类的转换4C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 4 4 /36/36封装封装面向对象的程序设
3、计 以类作为基本处理单元,对象是类的实例。面向对象程序设计的重要特征是具有封装性、多态性和继承性。所谓封装封装封装封装表现在以下几个方面1.在类的定义中设置对对象中的成员变量和方法进行访问的权限。2.提供一个统一供其它类引用的方法。3.其它对象不能直接修改本对象所拥有的属性和方法。对象变量的四种访问权限 public protected private friendlypublic protected private friendlyC Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 5 5 /36/36Lu Qiang,2009Hefei
4、University of Technology,School of Computer and InformationCode-封装封装1./引用私有方法和修改私有成员变量引用私有方法和修改私有成员变量2.class def06_013.private int x,y,z=0;4.private void method1()5.int x=3,y=4,z;6.z=x*y;7.System.out.println(z=+z);8.public void show()9.System.out.println(z=+z);10.11.class ch06_0112.public static voi
5、d main(String args)13.def06_01 ss=new def06_01();14.ss.method1();/调用私有方法出错15.ss.z=12;/修改私有变量出错16.ss.show();17.18.1./引用引用公共方法和修改私有成员变量公共方法和修改私有成员变量2.class def06_01b 3.private int x,y,z=0;4.public void method1()5.int x=3,y=4,z;6.z=x*y;7.System.out.println(z=+z);8.public void show()9.System.out.println
6、(z=+z);10.11.class ch06_01b 12.public static void main(String args)13.def06_01b ss=new def06_01b();14.ss.method1();15.ss.z=12;16.ss.show();17.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 6 6 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-private(私有私有)
7、方法方法1./创建私有方法,在构造方法中引用方法,私有变量的引用权限创建私有方法,在构造方法中引用方法,私有变量的引用权限 2.class Scope06_02 3.private int x=10;4.Scope06_02()5.int x=1000;6.private void a()7.int x=200;x*=4;8.System.out.println(A of a method is+x);9.private void b()10.x*=2;11.System.out.println(B of a method is+x);12.13.public class ch06_02 14
8、.public static void main(String args)15.int x=100;16.System.out.println(x of main method is+x);17.Scope06_02 b1=new Scope06_02();18.b1.a();/调用私有方法出错19.b1.b();/调用私有方法出错20.System.out.println(x of main method is+x);21.22.不不想想让让其其它它类类访访问问就就设设置置为为私私有有权权限限C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePag
9、e 7 7 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-protected方法方法1./定义类的定义类的protected 方法,通过创建对象来引用此方法方法,通过创建对象来引用此方法 2.class Max06_03 3.private int x,y;4.protected int play(int s,int t)5.int m;6.x=s;7.y=t;8.m=(xy)?x/y:y/x;9.return m;10.11.12.public class ch
10、06_03 13.public static void main(String args)14.int result;15.Max06_03 ss=new Max06_03();16.result=ss.play(5,45);17.System.out.println(result=+result);18.19.使用使用protectedprotected定义的成员变量定义的成员变量或方法具有二重或方法具有二重性,类本身、子性,类本身、子类或包中的方法类或包中的方法可以访问它们,可以访问它们,而其它类没有访而其它类没有访问权限问权限C Chapterhapter6 6 面向对象编程面向对象编程
11、面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 8 8 /36/36包包未设定public或private访问权限的均为friendly,包内包内的所有类可以访问它们,包外的不行的所有类可以访问它们,包外的不行一个JAVA程序文件只能定义一个public类,而且程序文件必须与它同名。为其它程序共享的类须经过编译进行打包,形为其它程序共享的类须经过编译进行打包,形成一个包文件,然后用成一个包文件,然后用import语句加以引用语句加以引用打包打包是
12、在java程序编译时进行的,注意参数-d被编译程序所在路径 javac d 被编译程序所在路径 被编译程序名.java被编译程序的第一行用package 包名;给出它被打入的包,该包与系统创建的子目录同名C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 9 9 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-friendly方法方法1./将将ch06_04_bag类独立建成类独立建成ch06_04_bag.jav
13、a类文件,放入类文件,放入bag包中包中2./以便其他程序直接调用以便其他程序直接调用,编译命令为编译命令为 C:javac-d 路径路径 ch06_04_bag.java3.package bag;4.public class ch06_04_bag5.public ch06_04_bag()System.out.println(this is a construct);6.public void doing()7.System.out.println(could you tell me);8.1./引用包引用包bag中的中的ch06_04_bag类文件类文件 2.import bag.ch
14、06_04_bag;3.public class ch06_04 4.static void store()5.System.out.println(this is a store processing);6.public static void main(String args)7.ch06_04_bag y=new ch06_04_bag();8.y.doing();9.store();10.未设定未设定public或或private访问权限的均访问权限的均为为friendly,包内的所包内的所有类可以访问它们,有类可以访问它们,包外的不行包外的不行C Chapterhapter6 6 面
15、向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 1010 /36/36类的继承类的继承类之间的继承关系是现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。子类也可以具有自己独立的属性和操作。子类从父类继承有两个主要的方面:1.属性的继承属性的继承。例如,公司是一个父类,一个公司有名称、地址、经理、雇员等,这些都属于结构方面。2.方法的继承方法的继承。一个父类
16、定义了若干操作,如一个公司要有项目开发、利润创造、经理任命、员工录用等操作,子公司也将继承这些行为。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 1111 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-类继承的实现类继承的实现1.class Shape06_05 2.public int x,y;3.private int m,n;4.public Shape06_05()/父类Shape的构造方法5.x=
17、10;y=20;6.m=100;n=200;7.System.out.println(x=+x+y=+y);8.System.out.println(this is a constractor of shape );9.10.public void measure()11.int s;s=x*y;System.out.println(result=+s);12.void show()13.System.out.println(x=+x+y=+y);14.15.public class Rectangle06_05 extends Shape06_05 16.public static void
18、 main(String args)17.int width=30,height=10;18.Rectangle06_05 tt=new Rectangle06_05();/创建对象时要引用的构造方法19.tt.x=width;20.tt.y=height;21.tt.measure();22.23.程序运行结果X=10 y=20This is a Constractor of ShapeResult 300C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School
19、of Computer and InformationPagePage 1212 /36/36属性继承与隐藏属性继承与隐藏 并不因为父类就意味着它有更多的功能。恰恰相反,子类比它们的父类具有更多的功能。因为子类是父类的扩展,增加了父类没有的属性和方法。子类不能访问父类的privateprivate成员,但子类可以访问其父类的publicpublic成员。protectedprotected访问是publicpublic和privateprivate访问之间一个保护性的中间层次。虽然被继承的父类成员没有在子类声明中列出,但是这些成员确实存在于子类中。C Chapterhapter6 6 面向对象
20、编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 1313 /36/36构造方法的继承构造方法的继承构造方法的继承应遵守以下原则1.子类可以无条件的继承父类不含参数的构造方法无条件的继承父类不含参数的构造方法2.如果子类没有构造方法,则它继承父类无参数的构造方法作为自己的构造方法;如果子类有构造方法,那么在创建子类对象时,则将先执行继承下来的父类的构造方法,然后再执行自己的构造方法3.对于父类中包含有参数的构造方法,子类可以通过在自
21、己的构造方法中使用supersuper关键字来引用,而且必须是必须是子类构造方法中的第一条语句子类构造方法中的第一条语句。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 1414 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-构造方法的继承构造方法的继承1.class Point06_06 2.protected int x,y;3.public Point06_06()/不带参数的构造方法4.x=0;y=0
22、;System.out.println(Point constructor:+this.toString();5.public Point06_06(int a,int b)/带参数的构造方法6.x=a;y=b;System.out.println(Point constructor:+this.toString();7.public String toString()8.return+x+,+y+;9.10.class Circle06_06 extends Point06_06 11.protected double radius;12.public Circle06_06()13.sup
23、er(4,5);radius=10;14.System.out.println(Circle constructor:+this.toString();15.public String toString()16.return Center=+super.toString()+radius=+radius;17.18.public class ch06_0619.public static void main(String args)20.Circle06_06 circle1=new Circle06_06();21.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面
24、向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 1515 /36/36终止继承终止继承为了防止网络黑客将属于系统的重要信息的类来创建其子类,将这些子类添加代码并替换原有的类,防止父类方法的覆盖,保持父类方法不会被子类中定义的方法替代,保证程序的安全有效的运行处于这种考虑有时需要限制子类对某些方法的继承,通过关关键字键字finalfinal 来达到终止继承的目的C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage
25、 1616 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-终止继承终止继承1./对父类中的public方法设置final 属性,禁止子类继承父类中定义的方法2./为系统安全考虑 防止父类方法被非法覆盖3./本程序中父类定义的sum()方法具有final属性,子类不准许定义与sum同名方法4.class mother06_07 5.int x=100,y=20;6.public final void sum()7.int s;s=x+y;8.System.out.p
26、rintln(s=+s);9.10.public class Children06_07 extends mother06_07 11.int m=20,n=30;12.public void sum()13.int f;14.f=m+n;15.System.out.println(f=+f);16.public static void main(String args)17.Children06_07 aa=new Children06_07();18.aa.sum();19.程序编译结果出现错误提示C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Pag
27、ePage 1717 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and Information目目 录录封装与继承封装与继承1多多 态态32覆盖与重载覆盖与重载类的转换类的转换4C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 1818 /36/36覆盖覆盖java 允许子类对父类的同名方法进
28、行重新定义,因此出现了同名方法而方法的内容不同的情况。出现这种情况时,子类引用方法需要指明引用的父类的方法还是子类的方法。引用父类方法时可采用super加上点再加上成员变量或方法名如:super.成员变量 或 super.方法名(参数表)C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 1919 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-方法的覆盖方法的覆盖1.class Shape06_08 2.publ
29、ic int y;3.public Shape06_08()/父类Shape的构造方法4.y=20;System.out.println(this is a constractor of shape );5.public void measure()6.System.out.println(super_y=+y);7.8.class Rectangle06_08 extends Shape06_08 9.public int y;10.public void measure()11.super.measure();12.y=super.y+y;13.System.out.println(Sha
30、pe06_08.y=+super.y);14.System.out.println(Rectangle06_08.y=+y);15.16.public class ch06_08 17.public static void main(String args)18.int width=30,height=10;19.Rectangle06_08 tt=new Rectangle06_08();/创建对象时要引用的构造方法20.tt.y=height;21.tt.measure();22.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,200
31、9Hefei University of Technology,School of Computer and InformationPagePage 2020 /36/36This&super 的区别的区别在引用父类的方法时,为了明确的是父类方法需在方法前加super有时,因为继承虽然对子类的方法进行了重新定义,但是当前的方法中的形参明与成员变量名相同或与方法中的局部变量名相同,为了明确其含义,就要采用this关键字加以区别。下面的例子中在创建Circle类对象时引用Point类的构造器,使用super关键字来调用父类的方法super(a,b),对于限制继承的成员变量加上protected 说
32、明,由于Point类和Circle类都存在toString()方法,所以在引用toString()方时用this和super加以区别。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2121 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-this&super 1.class Point06_09 2.protected int x,y;3.public Point06_09(int a,int b)4.x=a
33、;y=b;5.System.out.println(“Point构造方法:+this.toString();6.public String toString()7.return+x+,+y+;8.9.class Circle06_09 extends Point06_09 10.protected double radius;11.public Circle06_09(double r,int a,int b)12.super(a,b);radius=r;13.System.out.println(“Circle构造方法:+this.toString();14.public String to
34、String()15.return Center=+super.toString()+radius=+radius;16.17.public class ch06_09 18.public static void main(String args)19.Circle06_09 circle1,circle2;20.circle1=new Circle06_09(4.5,72,29);21.circle2=new Circle06_09(10,5,5);22.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei Univers
35、ity of Technology,School of Computer and InformationPagePage 2222 /36/36子类中与父类同名的成员变量的使用子类中与父类同名的成员变量的使用在子类和父类中都存在同名的非私有成员变量时,对子类而言,只存在子类的成员变量,而不能引用父类的成员变量,如果一定要引用父类的成员变量,需要加上”supersuper”关键字。下面给出一个例子说明如何使用子类来引用父类的成员变量/定义父类为Shape,再定义子类Rectangle /子类与父类具有相同的成员变量 /若使用父类的 成员变量,应在变量前增加super前缀程序中的父类Shape和子
36、类Rectangle都存在y成员变量,它们被保存在不同的存储区域,所以子类的实例在进行赋值时tt.y=height,只改变子类成员变量的值,对父类的y值没有影响。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2323 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-父子类同名变量的使用父子类同名变量的使用1.class Shape06_10 2.public int x,y;3.private int m,n
37、;4.public Shape06_10()/父类Shape的构造方法5.x=10;y=20;6.System.out.println(x=+x+y=+y);7.System.out.println(this is a constractor of shape);8.9.public void measure()10.System.out.println(super_y=+y);11.12.public class Rectangle06_10 extends Shape06_10 13.public static void main(String args)14.int width=30,h
38、eight=10;15./创建对象时要引用的构造方法16.Rectangle06_10 tt=new Rectangle06_10();17.tt.y=height;/修改成员变量y的值18.System.out.println(this_y=+tt.y);/当前子类中成员变量y的值19.tt.measure();/输出父类中成员变量y的值20.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPageP
39、age 2424 /36/36重载重载所谓方法的重载,是在类中创建了多个方法,它们具有相同的名称,但有不同的参数和不同的实现。在调用方法时依据其参数个数及类型自动选择相匹自动选择相匹配的方法配的方法去执行。达到各种对象处理类似问题时具有统一的接口目的。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2525 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode 成员方法重载成员方法重载1./定义多个同名方法,实现的重
40、载方法2./这些方法具有相同的名称,但有不同的参数和不同的定义 3.public class Calculate06_11 4.public static int abs1(int x)/定义整数运算的方法5.int y;6.y=x;7.if(y0)8.y=-y+5;9.return y;10.11.public static double abs1(double x)/定义双精数运算的方法12.double y;13.y=x;14.if(y0)15.y=-y*2;16.return y;17.18.public static void main(String args)19.int m=-2
41、5;20.double n=-8.27;21.System.out.println(m=+m+abs1(m);22.System.out.println(n=+n+abs1(n);23.24.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2626 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode 构造方法重载构造方法重载1./定义构造方法的重载2.Public class Point3.protected in
42、t x,y;4.public Point()setPoint(0,0);5.public Point(int a,int b)setPoint(a,b);6.public void setPoint(int a,int b)7.x=a;8.Y=b;9.10.public int getx()return x;11.public int gety()return y;12.public String toString()13.return“+x+”+y+”;14.这里定义了两这里定义了两个构造方法,个构造方法,根据类实例初根据类实例初始化时给定的始化时给定的参数决定使用参数决定使用哪一个哪一个C
43、 Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2727 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and Information目目 录录封装与继承封装与继承1多态机制多态机制32覆盖与重载覆盖与重载类的转换类的转换4C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and Infor
44、mationPagePage 2828 /36/36多态机制多态机制多态机制是面向对象程序设计的一个重要特征。多态的特点是采用同名的方式,根据调用方法时传送的参数的多采用同名的方式,根据调用方法时传送的参数的多少以及传送参数类型的不同,调用不同的方法少以及传送参数类型的不同,调用不同的方法,这样对于类的编制而言,可以采用同样的方法获得不同的行为特征。多态性1.编译时多态编译时多态表现为方法名相同,而参数表不同方法名相同,而参数表不同。典型:System.out.println();它的参数有很多种。2.运行时多态运行时多态程序运行的时候判断到底是哪个类(父类还是子类的),进而确定实际调用的方法
45、3.对象状态的判断对象状态的判断由于子类对象可以作为父亲类对象使用。那么我们有时需要判断这个对象究竟属于哪个类。Java提供 instanceof 关键字关键字。C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 2929 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-多态多态1.class 动物 2.void cry()3./do nothing4.5.6.class 狗 extends 动物 7.void c
46、ry()8.System.out.println(汪汪.);9.10.class 猫 extends 动物 11.void cry()12.System.out.println(喵喵.);13.14.public class ch06_12 15.public static void main(String args)16.动物 dongwu;17.dongwu=new 狗();18.dongwu.cry();19.dongwu=new 猫();20.dongwu.cry();21.22.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2
47、009Hefei University of Technology,School of Computer and InformationPagePage 3030 /36/36目目 录录封装与继承封装与继承1多态机制多态机制32覆盖与重载覆盖与重载类的转换类的转换4C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程Lu Qiang,2009Hefei University of Technology,School of Computer and InformationPagePage 3131 /36/36类的转换类的转换类的转换是指父类对象与子类对象之间在
48、一定条件下父类对象与子类对象之间在一定条件下可以转换可以转换,但类对象的转换须遵守以下原则:1.子类对象可以转换为父类对象,但成员变量必须强制转换2.处于相同层次的类对象不能进行转换或者说:子类对象可以被看作为父类的一个对象;反之父类对象不能看作为子类的对象。1./处理父类与子类的转换处理父类与子类的转换 注意转换应遵循的两条原则例注意转换应遵循的两条原则例Conver06_13 2.class Father 3.int x=1,y=2;4.public void show1()5.System.out.println(x=+x+y=+y);6.7.class Son extends Fath
49、er 8.int m=5,n=10;9.public void show2()10.System.out.println(m=+m+n=+n);11.C Chapterhapter6 6 面向对象编程面向对象编程面向对象编程面向对象编程PagePage 3232 /36/36Lu Qiang,2009Hefei University of Technology,School of Computer and InformationCode-类的转换类的转换1.public class Conver06_13 2.public static void main(String args)3.Fath
50、er father1,father2;/生成两个父类对象引用4.Son son1;/生成两个子类对象引用5.father1=new Father();6.father2=new Father();7.son1=new Son();8.System.out.println(Father.x=+father1.x+Father.y=+father1.y);9.father1.show1();10.System.out.println(Son.x=+son1.x+Son.y=+son1.y);11./子类对象可以被视为其父类的对象,因此可以引用父类的成员变量12.son1.show1();/子类引用