《java面向对象-教程.ppt》由会员分享,可在线阅读,更多相关《java面向对象-教程.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、n 继承n 上转型n 多态课程安排n 访问权限 类有2种重要的成员:成员变量和方法。类创建的对象可以通过“.”运算符访问分配给自己的变量,也可以通过“.”运算符调用类中的实例方法和类方法。 类在定义声明成员变量和方法时,可以用关键字private、protected和public来说明成员变量和方法的说明成员变量和方法的访问权限访问权限,使得对象访问自己的变量和使用方法受到一定的限制。 1私有变量和私有方法 用关键字private修饰的成员变量和方法被称为私有变私有变量量和私有方法。私有方法。 对于私有成员变量或方法,只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有
2、方法访问权限访问权限访问权限访问权限class Employee private double salary=1800;/私有属性,类外无法访问私有属性,类外无法访问 public void setSalary(double salary) if(salary1800&salary=6000) this.salary=salary; public class Example public static void main(String args ) Employee zhang=new Employee(); Employee wang=new Employee(); zhang.setSal
3、ary(100); System.out.println(zhang的薪水:+zhang.getSalary(); wang.setSalary(3888); /wang.salary=88888;是非法的,因为对象是非法的,因为对象wang已经不在已经不在Employee类中类中 System.out.println(wang的薪水:+wang.getSalary(); 用某个类在另外的一个类中创建对象后用某个类在另外的一个类中创建对象后, ,如果不希望如果不希望该对象直接访问自己的变量(即通过该对象直接访问自己的变量(即通过“. .”运算符来操作运算符来操作自己的成员变量),就应将该变量访
4、问权限设置为自己的成员变量),就应将该变量访问权限设置为privateprivate。 面向对象编程提倡对象应当调用方法来改变自己的面向对象编程提倡对象应当调用方法来改变自己的属性,我们应当提供操作数据的方法,这些方法可以经属性,我们应当提供操作数据的方法,这些方法可以经过精心设计,使得对数据的操作更加合理。过精心设计,使得对数据的操作更加合理。 2公有变量和公有方法 用public修饰的成员变量和方法被称为共有变量共有变量和共有方法共有方法,如:class A public float weight; /weight被修饰为public的float型变量。 public float f(fl
5、oat a,float b) /方法 f是public方法。 访问权限访问权限 当我们在任何一个类中用类A 创建了一个对象后,该 对象能访问自己的public变量和类中的public方法。如: class B void g() A a = new A(); a.weight = 23f; /合法 a.f(3,4); /合法 3受保护的成员变量和方法 用protected修饰的成员变量和方法被称为受保护受保护的成员变量的成员变量和受保护的方法受保护的方法,如:class A protected float weight; /weight被修饰为public变量。 protected float
6、f(float a,float b) /f是public方法。 访问权限访问权限 假如B与A是同一个包中的类,那么,B类中的a.weight、a.f(3,4)都是合法的。 class B void g() Tom a = new Tom(); a.weight=23f; /合法 a.f(3,4); /合法 对象对象a a的位置的位置PrivatePrivate成员成员默认的默认的成员成员protectedprotected成员成员publicpublic成员成员在类A中,a访问成员在与A同包的另外一个类中,a访问成员在与A不同包的另外一个类中,a访问成员假设对象a是类A创建的,对象对成员的访问
7、权限总结如下: 一个类可以把对象作为自己的成员变量一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,那么该对象中就会有其它对象,也就是说该对象将其他对象作为自己的组成部分,或者说该对象是由几个对象组合而成 。对象的组合对象的组合对象的组合对象的组合public class Rectangle private double x,y,width,height; public void setX(double x) this.x=x; public double getX() return x; .public class Circle private double x,y,radius;
8、 public void setX(double x) this.x=x; public double getX() return x; public class Geometry private Rectangle rect; private Circle circle; Geometry(Rectangle rect,Circle circle) this.rect=rect; this.circle=circle; public void setCirclePosition(double x,double y) circle.setX(x); circle.setY(y); 生活中的继承
9、生活中的继承 生活中,继承的例子随处可见动物动物食草动物食草动物食肉动物食肉动物谁是父类?谁是父类?谁是子类?谁是子类?能说出继承的特点吗?能说出继承的特点吗?继承需要符合的关系:继承需要符合的关系:is-a,父类更通用、子类更具体,父类更通用、子类更具体生活中的继承生活中的继承 子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性巴士是汽车吗?巴士是汽车吗?卡车是汽车吗?卡车是汽车吗?出租车是汽车吗?出租车是汽车吗?最大载客数量最大载客数量报站报站引擎数量引擎数量外观颜色外观颜色刹车刹车加速加速汽车汽车最大载重量最大载重量卸货卸货所属公司所属公司最大载客数量最大载客数量打发票打发票属
10、性属性行为行为请问:出租车请问:出租车包含哪些属性包含哪些属性和行为呢?和行为呢?子类与父类子类与父类 继承继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。 子类与父类子类与父类 父类可以是自己编写的类也可以是java类库中的类。利用继承有利于实现代码的重复使用,子类只需要添加新的功能代码即可。JavaJava不支持多重继承,即子类只能有一个父类不支持多重继承,即子类只能有一个父类。 使用关键字exten
11、ds来声明一个类是另外一个类的子类,格式如下: class 子类名子类名 extends 父类名父类名 . 子类与父类子类与父类 1继承的定义 所谓类继承就是子类继承父类的成员变量和方法作为自类继承就是子类继承父类的成员变量和方法作为自己的成员变量和方法,己的成员变量和方法,就好象它们是在子类中直接声明一样。当然,子类能否继承父类的变量和方法还有一定的限制。下面对其进行详细介绍。 2子类和父类在同一包中的继承性 如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法。继承的成员变量以
12、及方法的访问权限保持不变。3子类和父类不在同一包中的继承性 如果子类和父类不在同一个包中,那么子类只能继承父类的protected、public成员变量和方法,继承的成员或方法的访问权限不变。子类与父类子类与父类class Father private int moneyDollar=300; int moneyHK=200; int add(int x,int y) return x+y; class Son extends Father int moneyRMB=800; public void changMoneyHK(int x) moneyHK=x; public void chan
13、gMoneyRMB(int x) moneyRMB=x; int subs(int x,int y) return x-y; 子类与父类子类与父类public class Example public static void main(String args) int a=5,b=3; Son son=new Son(); son.changMoneyHK(666); son.changMoneyRMB(5000); System.out.println(儿子的港币是继承的属性儿子的港币是继承的属性,当前的值是当前的值是:+son.moneyHK); System.out.println(儿子
14、的人民币是新增的属性儿子的人民币是新增的属性,当前的值是当前的值是:+son.moneyRMB); System.out.printf(减法是儿子新增的功能减法是儿子新增的功能,%d-%d等于等于%dn,a,b,son.subs(a,b); System.out.printf(加法是儿子继承的功能加法是儿子继承的功能,%d+%d等于等于%dn,a,b,son.add(a,b); 子类与父类子类与父类 当用子类的构造方法创建一个子类的对象时,子类的构造子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法方法总是先调用父类的某个构造方法,如果子类的构造方法没有指明使用父类的哪个构造方法,
15、子类就调用父类的不带没有指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。参数的构造方法。子类对象的构造过程子类对象的构造过程 1成员变量的隐藏 子类可以隐藏继承的成员变量,当在子类中定义和父类中同名的成员变量时,子类就隐藏了继承的成员变量,即子类对象以及子类自己声明定义的方法操作与父类同名的成员变量。 成员变量隐藏与方法重写成员变量隐藏与方法重写class A public double y=11.456789; public void f() y=y+1; System.out.printf(y是是double型的变量型的变量,y=%fn,y); class B extend
16、s A int y=0; public void g() y=y+100; System.out.printf(y是是int型的变量型的变量,y=%dn,y); class Example public static void main(String args ) B b=new B(); b.y=200; b.g(); /调用子类新增的方法调用子类新增的方法 b.f(); /调用子类继承的方法调用子类继承的方法 2方法重写 子类也可以隐藏方法,子类通过方法重写方法重写来隐藏继承的方法。方法重写是指:子类中定义一个方法,并且这个方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参
17、数个数和类型与从父类继承的方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。方法完全相同。子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。这时,如果子类想使用被隐藏的方法,必须使用关键字super,我们将在后面讲述super的用法。成员变量隐藏与方法重写成员变量隐藏与方法重写class A protected double x=8.0,y=0.888888; public void speak() System.out.println(我喜欢我喜欢NBA); public void cry() y=x+y; System.out.printf(y=%fn,y);
18、class B extends A int y=100,z; public void speak() z=2*y; System.out.println(I love This Game); System.out.printf(y=%d,z=%d,y,z); class Example public static void main(String args ) B b=new B(); b.cry(); b.speak(); Super关键字有两种用法:一种用法是子类使用super调用父类的构造方法,另一种用法是子类使用super调用被子类隐藏的成员变量和方法。 1使用super调用父类的构造
19、方法 子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用并且必须使用关键字super来表示,而且而且supersuper必须是子类构造方法中的第必须是子类构造方法中的第一条语句。一条语句。成员变量隐藏与方法重写成员变量隐藏与方法重写class A int x,y; A() x=100; y=200; A(int x,int y) this.x=x; this.y=y; class B extends A int z; B(int x,int y) super(x,y); z=300; B( ) super(); /可以省略可以省略 z=800; publi
20、c void f() System.out.printf(x=%d,y=%d,z=%dn,x,y,z); public class Example public static void main(String args) B b1=new B(10,20); b1.f(); B b2=new B(); b2.f(); 2使用super操作被隐藏的成员变量和方法 当子类中定义了一个方法,并且这个方法的名字、返回类型、参数个数和类型和父类的某个方法完全相同时,子类从父类继承的这个方法将被隐藏。如果我们在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super 。成员变量隐藏与方法重写成员变
21、量隐藏与方法重写class B extends A int m=1,n=1; long f() long result=0; super.m=10; super.n=20; result=super.f()+(m+n); return result; long g() long result=0; result=super.f(); return result/2; class Examplepublic static void main(String args ) B b=new B(); b.m=3; b.n=7; long resultOne=b.g(); long resultTwo=
22、b.f(); long resultThree=b.g(); System.out.println(resultOne=+resultOne); System.out.println(resultTwo=+resultTwo); System.out.println(resultThree=+resultThree); class A int m=0,n=0; long f() return m+n; finalfinal类不能被继承,即不能有子类类不能被继承,即不能有子类,如: final class A final class A 将一个类声明为final类一般是由于安全性考虑。因为一旦一
23、个方法被修饰为final方法,则这个方法不能被重写,即不允许子类通过重写隐藏继承的final方法。final类和类和final方法方法 1对象的上转型 我们经常说“老虎是哺乳动物”、“狗是哺乳动物”等。若哺乳类是老虎类的父类,这样说当然正确,但当你说老虎是哺乳动物时,老虎将失掉老虎独有的属性和功能。下面我们就介绍对象的上转型对象。 假设,B是A的子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到A类声明的对象中时,比如: A a; a=new B();对象的上转型对象对象的上转型对象 那么就称对象a是子类对象b的上转型对象,对象的上转型对象的实体是子类负责创建的,但上转型对象会
24、失去原对象的一些属性和功能。对象对象的上转型对象继承或隐藏的成员变量继承或重写的方法新增的变量新增的方法对象的上转型对象对象的上转型对象 (1 1)上转型对象不能操作子类声明定义的成员变量;也)上转型对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。不能使用子类声明定义的方法。 (2 2)上转型对象可以操作子类继承的成员变量和隐藏的)上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法。成员变量,也可以使用子类继承的或重写的方法。 (3 3)上转型对象不能操作子类新增的方法和成员变量)上转型对象不能操作子类新增的方法和成员变量 (4 4)可以将
25、对象的上转型对象再强制转换到一个子类对)可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。象,这时,该子类对象又具备了子类所有属性和功能。对象的上转型对象对象的上转型对象class A double n; int m; void f() System.out.printf(子类继承方法子类继承方法f(),n=%f,m=%dn,n,m); void g() System.out.printf(你好,你好,n=%f,m=%dn,n,m); class B extends A int n=12; void g() System.out.printf(子类重写
26、方法子类重写方法g(),n=%d,m=%dn,n,m); void cry() System.out.printf(子类新增的方法子类新增的方法,n=%d,m=%dn,n,m); public class Example public static void main(String args ) A a; a=new B(); /a是子类对象的上转型对象是子类对象的上转型对象 a.n=0.618; /操作子类隐藏的操作子类隐藏的double类型成员类型成员n a.m=200; /操作子类继承的成员操作子类继承的成员m,等价于等价于b.m=200; a.f(); /调用子类继承的方法调用子类继承
27、的方法,等价于等价于b.f(); a.g(); /调用子类重写的方法调用子类重写的方法,等价于等价于b.g(); B b=(B)a; /上转型对象强制转换成子类对象上转型对象强制转换成子类对象 b.n=555; /操作子类新增的操作子类新增的int类型成员类型成员n b.cry(); / a.cry(); 是非法的是非法的 和继承有关的多态性是指父类的某个方法被其子类重写时,可以产生自己的功能行为,即同一个操作被不同类型对象调用时可能产生不同的行为。例如,狗和猫都具有哺乳类的功能:“叫声”,当狗操作“叫声”时产生的声音是“汪汪,而猫操作“叫声”时产生的声音是“喵喵”,这就是“叫声”的多态。 当
28、一个类有很多子类时,并且这些子类都重写了父类中的某个方法。当我们把子类创建的对象的引用放到一个父类当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个的对象中时,就得到了该对象的一个上转型对象,那么这个上转型对象在调用这个方法时就可能具有多种形态上转型对象在调用这个方法时就可能具有多种形态 。因为不同的子类在重写父类的方法时可能产生不同的行为。也就是说,不同对象的上转型对象调用同一方法可能产不同对象的上转型对象调用同一方法可能产生不同的行为生不同的行为。继承与多态继承与多态class Animal void cry( ) class Dog extend
29、s Animal void cry() System.out.println(Wang!Wang!.); class Cat extends Animal void cry() System.out.println(miaomiao.); public class Example public static void main(String args ) Animal animal; animal=new Dog(); /animal是是Dog对象的上转型对象对象的上转型对象 animal.cry(); animal=new Cat(); /animal是是Cat对象的上转型对象对象的上转型对象 animal.cry();