第5面向对象高级程序设计.ppt
《第5面向对象高级程序设计.ppt》由会员分享,可在线阅读,更多相关《第5面向对象高级程序设计.ppt(54页珍藏版)》请在三一文库上搜索。
1、1,第5章 面向对象高级程序设计,2,主要内容,5.1 继承 5.2 多态性 5.3 抽象类和抽象方法 5.4 接口 5.5 内部类和匿名类,3,5.1 继承,5.1.1 创建子类 5.1.2 成员变量的隐藏和方法的重写 5.1.3 super 5.1.4 对象的上转型对象,4,5.1.1 创建子类,继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个拥有共同属性的一般类,根据该一般类再创建具有特殊属性的新类。由继承而得到的类称为子类(subclass),被继承的类称为父类(或叫超类,superclass)。 直接或间接被继承的类都是父类。子类继承父类的状态和行为,同时也可以修改父
2、类的状态或重写父类的行为,并添加新的状态和行为。Java中不支持多重继承。,5,5.1.1 创建子类,通过在类的声明中加入extends子句来创建一个类的子类,其格式如下: class SubClass extends SuperClass 上面的代码把SubClass声明为SuperClass的直接子类。如果SuperClass又是某个类的子类,则SubClass同时也是该类的(间接)子类。子类可以继承父类的成员变量和方法。如果缺省extends子句,则该类为java.lang.Object的子类。子类可以继承父类中访问权限设定为public、protected、default的成员变量和方
3、法。但是不能继承访问权限为private的成员变量和方法。,6,5.1.1 创建子类,7,5.1.1 创建子类,Public class MammalClass String name,eyeColor; int age; public MammalClass() name=“the name”; eyeColor=“black”; age=0; ,8,5.1.1 创建子类,注意,MammalClass类拥有来自于DogClass和CatClass的相同属性,包括了name、eyeColor、age等。现在我们可以利用继承重写DogClass和CatClass。 public class Do
4、gClass extends MammalClass boolean hasTail; / name,eyeColor,age已经从父类继承 public DogClass() /隐式调用super() name=“Chase“; eyeColor=“Black“; age=2; hasTail=true; ,9,5.1.1 创建子类,【例5-1】 继承的简单例子 class Father /父类 private int money; float weight,height; String head; String speak(String s) return s ; class Son ex
5、tends Father /子类 String hand ,foot; ,Weight,height,head, Speak(); Hand,foot,10,5.1.1 创建子类,【例5-1】 继承的简单例子 public class TestExtend public static void main(String args) Son boy=new Son(); boy.weight=120f; boy.height=1.8f; boy.head=“一个头“; boy.hand=“两只手“; boy.foot=“两只脚“; System.out.println(“我是儿子“); Syste
6、m.out.println(“我有:“+boy.hand+“、“+boy.foot+“、“+ boy.head +“、重“+boy.weight+“、高“+boy.height); 上面程序运行结果如下: 我是儿子 我有:两只手、两只脚、一个头、重120.0、高1.8,11,5.1.1 创建子类,如果子类和父类不在同一个包中,那么,子类可以继承了父类的protected、public修饰的成员变量做为子类的成员变量,并且也可以继承了父类的protected、 public 修饰的方法作为子类的方法。另外子类和父类不在同一个包中,则子类不能继承父类的default变量和default方法。,12
7、,5.1.1 创建子类,【例5-2】继承不同包中的类的简单例子 / HouseHold.java package xing.house; public class HouseHold /家类 protected String address; /地址 保护型 public String surnname; /姓 公共型 String givenname; /名 缺省 public HouseHold(String add) address =add; protected String getAddress()return address; void setMoney(String newadd
8、) address=newadd; void setAddress(String add)address=add; ,13,5.1.1 创建子类,/ Mikey.java: package xing.friend; import xing.house.HouseHold; public class Mikey extends HouseHold public Mikey() super(“Star flight street 110“); public static void main(String args) Mikey mikey=new Mikey(); /mikey.givenname
9、=“Johnson”; /非法 mikey.surnname=“Math“; /合法. mikey.address=“Star flight street 110“; /合法. String m=mikey.getAddress(); /合法 /mikey.setAddress(“Star flight street 110“); /非法. System.out.println(mikey.surnname+“:“+m); ,14,5.1.1 创建子类,程序编译和运行过程如下:,15,5.1.2 成员变量的隐藏和方法的重写,当我们在子类中定义的成员变量和父类中的成员变量同名时,此时称子类的成员
10、变量隐藏了父类的成员变量。当子类中定义了一个方法,并且这个方法的名字,返回类型,参数个数以及类型和父类的某个方法完全相同时,父类的这个方法将被隐藏,这时我们说重写了父类的方法。 子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。,16,5.1.2 成员变量的隐藏和方法的重写,例如下面的这段程序就是这样的情况: class SuperClass /父类 int y; void setY() y=0; class SubClass extends SuperClass int y; / 父类变量y被隐藏 void setY() / 重写父类的方法setY() y=1;
11、 ,17,5.1.3 super,5.1.3 super 子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。我们知道,this用来引用当前对象,与this类似,super用来引用当前对象的父类。 super的使用可以分为下面三种情况: 1)用来访问父类被隐藏的成员变量,如: super.variable 2)用来调用父类中被重写的方法,如: super.Method(paramlist): 3)用来调用父类的构造方法,如:
12、 super(paramlist);,18,5.1.3 super,【例5-3】调用父类的构造方法的例子 class A /类A public int n; /公共类型的成员变量 public A() public A(int n) this.n = n; int method() return n; public class B extends A /类B public B() super(15); public static void main(String args) A aInstance = new B( ); int b=aInstance.method(); System.out
13、.println(“类A中的成员变量:“+b); ,19,Super的使用-调用父类的方法,class superClass int y; superClass( ) y=30; System.out.println(“in superClass:y=“+y); void doPrint() System.out.println(“In superClass.doPrint()“); ,例子5-4 调用父类的方法,20,class subClass extends superClass int y; subClass( ) super(); /调用父类的构造方法(多余的) y=50; Syst
14、em.out.println(“in subClass:y=“+y); void doPrint( ) super.doPrint(); /调用父类的方法 System.out.println(“in subClass.doPrint()“); System.out.println(“super.y=“+super.y+“ sub.y=“+y); public class inviteSuper public static void main(String args) subClass subSC=new subClass(); subSC.doPrint( ); ,21,5.1.4对象的上转
15、型对象,假设A 类是B 类的父类, class B extends A 当我们用子类创建一个对象,并把这个对象的引用放到父类的对象中时,例如 A a; A a=new B(); 或 A a; B b=new B(); a=b; 称这个父类对象a,是子类对象b的上转型对象。,22,5.1.4对象的上转型对象,对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。上转型对象具有如下特点: 1)上转型对象不能操作子类新增的成员变量和子类新增的方法。 2)上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。 3)如果子类重写了父类的某个方法后,当对
16、象的上转对象调用这个方法时一定是调用了这个重写的方法,因为程序在运行时知道,这个上转对象的实体是子类创建的,只不过损失了一些功能而已。 不要将父类创建的对象和子类对象的上转型对象相混淆。 上转型对象在Java编程中是常见的。 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所给的所有属性和功能。,23,5.1.4对象的上转型对象,【例5-5】 上转型对象的使用 class Mammal /哺乳动物类 private int n=40; void crySpeak(String s) System.out.println(s); public class Monkey
17、 extends Mammal / 猴子类 void computer(int aa,int bb) int cc=aa*bb; System.out.println(cc); void crySpeak(String s) System.out.println(“*“+s+“*“); public static void main(String args) / mammal是Monkey类的对象的上转型对象. Mammal mammal=new Monkey(); mammal.crySpeak(“I love this game“); / puter(10,10); /把上转型对象强制转化
18、为子类的对象. Monkey monkey=(Monkey)mammal; puter(10,10); ,24,5.1.4对象的上转型对象,上述程序的运行结果为: *I love this game* 100 在上述例子中,上转对象mammal调用方法: mammal.crySpeak(“I love this game“); 得到的结果是”*I love this game*”。而不是“I love this game”。因为mammal调用的是子类重写的方法crySpeak。 在main()中,如果出现下面的两行代码,那将是错误的: mammal.n=1000; /因为子类本来就没有继承n
19、。 puter(10,10); /因为computer方法是子类新增的方法。,25,第5章 面向对象高级程序设计,5.1 继承 5.2多态性 5.3 抽象类和抽象方法 5.4接口 5.5内部类和匿名类,26,5.2多态性,多态(Polymorphism)的意思就是用相同的名字来定义不同的方法。在Java中,普通类型的多态为重载,这就意味着可以使几个不同的方法使用相同的名字,这些方法以参数的个数不同、参数的类型不同等方面来进行区分,以使得编译器能够进行识别。 重载是Java实现多态性的方式之一。 例如:family()方法可以有三个版本,如下: family() family(String ch
20、) address=ch; family(String ch,float n) address=ch; pay=n; 这些方法并存于程序中,编译时,编译器根据实参的类型和个数来区分从而调用那个方法。这在其它语言的程序中,如C,那将导致灾难性的错误。,27,5.2多态性,【例5-6】构造方法重载的例子 class person String name=“Johnson“; / 姓名 int age=45; / 年龄 person() person(String a) name=a; person(String a,int b) name=a; age=b; public void display
21、() System.out.println(“Name=“+name+“,“+“Age=“+age); public class Poly public static void main(String args) person ko1=new person(); ko1.display(); person ko2=new person(“Mike“); Ko2.display(); person ko3=new person(“Willian“,50); ko3.display(); ,28,5.2多态性,在Java语言中,多态性主要体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方
22、法重写实现的动态多态性(运行时多态),如下: 1) 编译时多态 在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。 2) 运行时多态 如果子类重写了父类的方法,那么重写方法的调用原则如下:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 另外,方法重写时应遵循的原则如下: 改写后的方法不能比被重写的方法有更严格的访问权限。 改写后的方法不能比被重写的方法产生更多的异常。 进行方法重写时必须遵从这两个原则,否则编译
23、器会指出程序出错。,29,5.2多态性,【例5-7】方法重写的例子 class Parent public void function() System.out.println(“I am in Parent!“); class Child extends Parent private void function() System.out.println(“I am in Child!“); public class RTpolyTest public static void main(String args) Parent pl=new Parent( ); Parent p2=new Ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 高级 程序设计
链接地址:https://www.31doc.com/p-2551263.html