第4章 Java面向对象编程(下).ppt
《第4章 Java面向对象编程(下).ppt》由会员分享,可在线阅读,更多相关《第4章 Java面向对象编程(下).ppt(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章Java面向对象编程(下)T4.1 继继承承T4.2 对对象的象的转转型型T4.3 多多态态T4.4 抽象抽象类类T4.5 接口接口T4.6 终终止止继继承承T4.7 权权限修限修饰饰符符T4.8 综综合合实实例例:航班管理航班管理主要内容24.1 继承T4.1.1 继承的定义继承的定义T在在Java语言中,用语言中,用extends关键字来声明一个类继承了另一关键字来声明一个类继承了另一个类,其语法格式是:个类,其语法格式是:class extends T通过继承子类自动拥有了父类的所有成员。通过继承子类自动拥有了父类的所有成员。T例如,下面的代码片段定义了一个子类例如,下面的代码片段
2、定义了一个子类son类,继承了父类类,继承了父类farther类:类:class father public class son extends father 34.1 继承T4.1.1 继承的定义继承的定义T注意,注意,Java只支持单继承(一个子类只能有一个父类,一个只支持单继承(一个子类只能有一个父类,一个父类可以派生出多个子类)。如下的父类可以派生出多个子类)。如下的son类试图继承两个类:类试图继承两个类:class grandFather class farther public class son extends farther,grandFather /错误,不允许继承两个类错
3、误,不允许继承两个类T【例例4.1】计算箱子的体积和计算箱子的体积和重量重量。44.1 继承T4.1.2 初始化基类初始化基类T当创建一个子类的对象时,该对象包含了一个基类对象。这当创建一个子类的对象时,该对象包含了一个基类对象。这个基类对象与用子类直接创建的对象是一样的。个基类对象与用子类直接创建的对象是一样的。T二者的区别在于,后者来自于外部,而基类对象被包装在子二者的区别在于,后者来自于外部,而基类对象被包装在子类对象内部。类对象内部。Java虚拟机会确保在子类构造器中调用基类的构虚拟机会确保在子类构造器中调用基类的构造器来初始化基类。造器来初始化基类。【例例4.2】子类构造器子类构造器
4、C调用基类的构造器调用基类的构造器A来来初始化基类初始化基类。54.1 继承T4.1.3 方法的重写方法的重写T子类通过子类通过extends关键字声明继承了父类的属性和方法,但关键字声明继承了父类的属性和方法,但子类可能觉得从父类继承过来的方法不能满足自己的要求,怎子类可能觉得从父类继承过来的方法不能满足自己的要求,怎么办呢?么办呢?T解决方法是:子类可以根据需要重写解决方法是:子类可以根据需要重写(或覆盖或覆盖)父类的方法。父类的方法。例如在下面的代码片段中,子类重写了父类的例如在下面的代码片段中,子类重写了父类的run()方法:方法:class Animal void run()/*慢跑
5、慢跑*/class Tiger extends Animal void run()/*快跑快跑*/【例例4.3】子类子类Employee重写父类的重写父类的getInfo()方法方法。64.1 继承T4.1.3 方法的重写方法的重写T在使用方法重写时,以下几点需要注意。在使用方法重写时,以下几点需要注意。(1)子类重写的方法必须与父类被重写的方法具有相同的方法子类重写的方法必须与父类被重写的方法具有相同的方法名称、参数列表和相同或相容的返回值类型,否则不构成重写。名称、参数列表和相同或相容的返回值类型,否则不构成重写。例如:父类定义了方法:例如:父类定义了方法:int f(int i)。若子类
6、方法重。若子类方法重写时写成:写时写成:byte f(int i),由于返回值类型是,由于返回值类型是Java基本数据基本数据类型,必须要相同。因而编译程序会报错。类型,必须要相同。因而编译程序会报错。但是,若父类定义了方法:但是,若父类定义了方法:Object get(),子类方法,子类方法重写时写成重写时写成Point get(),虽然返回值类型不同,但由于,虽然返回值类型不同,但由于Point是是Object的子类,因而是允许的。的子类,因而是允许的。即对于返回值类型是引用,则要求相容。这种方式的重写很即对于返回值类型是引用,则要求相容。这种方式的重写很有用。有用。74.1 继承T4.1
7、.3 方法的重写方法的重写(2)子类重写的方法不能比父类中被重写的方法拥有更严格的子类重写的方法不能比父类中被重写的方法拥有更严格的访问权限。访问权限。例如,在下面的代码片段中,子类试图缩小父类方法的例如,在下面的代码片段中,子类试图缩小父类方法的访问权限:访问权限:class Base public void method().public class Sub extends Base private void method()/编译错误,子类方法缩小父类方法的访问权限编译错误,子类方法缩小父类方法的访问权限 .84.1 继承T4.1.3 方法的重写方法的重写(3)父类的静态方法不能被子类重
8、写为非静态的方法。同样,父类的静态方法不能被子类重写为非静态的方法。同样,父类中的实例方法也不能被子类重写为静态方法。父类中的实例方法也不能被子类重写为静态方法。例如下面的代码片段:例如下面的代码片段:class Base .static void method().public class Sub extends Base.void method()/编译错误编译错误.94.1 继承T4.1.3 方法的重写方法的重写(4)方法重写只针对实例方法,父类中的静态方法,子类只能方法重写只针对实例方法,父类中的静态方法,子类只能隐藏、重载和继承。隐藏、重载和继承。(5)父类中能被子类继承的实例方法,
9、才会在子类中被重写。父类中能被子类继承的实例方法,才会在子类中被重写。(6)子类重写的方法不能比父类中被重写的方法声明抛出更多子类重写的方法不能比父类中被重写的方法声明抛出更多的异常。的异常。T方法重写和方法重载具有以下相同点:方法重写和方法重载具有以下相同点:(1)都要求方法同名;都要求方法同名;(2)都可以用于抽象方法和非抽象方法之间。都可以用于抽象方法和非抽象方法之间。104.1 继承T4.1.3 方法的重写方法的重写T方法重写和方法重载具有以下不同点:方法重写和方法重载具有以下不同点:(1)方法重写要求参数列表必须一致,而方法重载要求参数列方法重写要求参数列表必须一致,而方法重载要求参
10、数列表必须不一致。表必须不一致。(2)方法重写要求返回类型必须一致,方法重载对此不做限制。方法重写要求返回类型必须一致,方法重载对此不做限制。(3)方法重写只能用于子类从父类继承的实例方法,方法重载方法重写只能用于子类从父类继承的实例方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。用于同一个类的所有方法(包括从父类中继承而来的方法)。(4)方法重写对方法的访问权限和抛出的异常有特殊的要求,方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没任何限制。而方法重载在这方面没任何限制。(5)父类的一个方法只能被子类重写一次,而一个方法在所在父类的一个方法只能被子
11、类重写一次,而一个方法在所在的类中可以被重载多次。的类中可以被重载多次。(6)构造方法能被重载,但不能被重写。构造方法能被重载,但不能被重写。114.1 继承T4.1.4 super关键字关键字T若子类重写了父类中的方法或子类隐藏了父类中的数据成员,若子类重写了父类中的方法或子类隐藏了父类中的数据成员,但又想访问父类的成员变量和方法,怎么办?但又想访问父类的成员变量和方法,怎么办?T解决的办法是:使用解决的办法是:使用super关键字。关键字。T【例例4.4】子类子类SubClass使用使用super关键字,访问父类关键字,访问父类SuperClass的成员变量和的成员变量和构造方法构造方法。
12、class FatherClass public int value;public void f()value=100;System.out.println(“father.value=“+value);class ChildClass extends FatherClass public int value;public void f()super.f();value=20;System.out.println(“child.value=“+this.value);System.out.println(“local.value=“+value);System.out.println(“fat
13、her.value=“+super.value);124.2 对象的转型T例如,例如,B类是类是A类的子类或间接子类类的子类或间接子类,当子类当子类B创建一个对象,创建一个对象,并把这个对象赋给类并把这个对象赋给类A的引用变量。的引用变量。T也就是说,子类也就是说,子类B的对象当作父类的对象当作父类A的对象来使用,称为的对象来使用,称为向上向上转型转型。T反之,这个向上转型的对象还可以通过强制类型转换还原成反之,这个向上转型的对象还可以通过强制类型转换还原成它本来的类型,被称为对象的它本来的类型,被称为对象的向下转型向下转型。class A class B extends AA a;B b1=
14、new B();a=b1;/向上转型向上转型B b2=(B)a;/向下转型向下转型134.2 对象的转型T向上转型的对象具有如下特点:向上转型的对象具有如下特点:(1)向上转型对象不能操作子类新增的成员属性和方法。向上转型对象不能操作子类新增的成员属性和方法。(2)向上转型对象可以操作子类继承或隐藏的成员变量,也可向上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。以使用子类继承的或重写的方法。(3)向上转型对象操作子类继承或重写的方法时,就是通知对向上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的应的子类对象去
15、调用这些方法。因此,如果子类重写了父类的某个方法后,对象的向上转型对象调用这个方法时,一定是调某个方法后,对象的向上转型对象调用这个方法时,一定是调用了这个重写的方法。用了这个重写的方法。(4)可以将向上转型对象再强制转换到它本来的类型,该对象可以将向上转型对象再强制转换到它本来的类型,该对象又具备了其所有属性和方法。又具备了其所有属性和方法。T【例例4.5】测试对象转型的特点,使用测试对象转型的特点,使用instanceof判断一个实判断一个实例对象是否属于某个例对象是否属于某个类类。144.2 对象的转型Tinstanceof可以判断一个引用变量所指向的对象是否属于某可以判断一个引用变量所
16、指向的对象是否属于某个类,例如:个类,例如:System.out.println(p instanceof Employee);p=new Employee(Mary,3000);在执行下面第一条语句在执行下面第一条语句返回返回true,执行第二条语句,执行第二条语句发生了对象的向上转型,发生了对象的向上转型,Person类的引用变量指向类的引用变量指向Employee对象,如右图对象,如右图的箭头的箭头。154.2 对象的转型 但这时引用变量但这时引用变量p所能访问的内容只限于所能访问的内容只限于Employee对象的对象的父类父类Person对象,也就是箭头对象,也就是箭头所指向的区域。在
17、执行下面所指向的区域。在执行下面的这条语句时,发生了对象的向下转型。的这条语句时,发生了对象的向下转型。Employee e1=(Employee)p;Employee类的引用类的引用变量变量e1同样指向同样指向Employee对象。这时引用变量对象。这时引用变量e1能能访问访问Employee对象的所对象的所有内容,也就是箭头有内容,也就是箭头所所指向的区域。指向的区域。164.2 对象的转型T实例实例 class Animal public String name;Animal(String n)name=n;class Cat extends Animal public String e
18、yesColors;Cat(String n,String c)super(n);eyesColor=c;class Dog extends Animal public String furColors;Cat(String n,String c)super(n);furColor=c;public class Test public static void main(String args)Animal a=new Animal(“ani1”);Cat c=new Cat(“cat1”,”blue”);Dog d=new Dog(“dog1”,”black”);System.out.prin
19、tln(c instanceof Animal);System.out.println(a instanceof cat);a=new Dog(“bigyellow”,”yellow”);System.out.println(a.name);174.3 多态T运行运行Cast.java程序,可以发现程序,可以发现testCase()方法接受一个方法接受一个Person引用。那么在这种情况下,编译器怎样才能知道这个引用。那么在这种情况下,编译器怎样才能知道这个Person引用指向的是引用指向的是Student对象还是对象还是Employee对象?对象?T实际上,编译器无法得知,解决的方法就是动态
20、绑定。它的实际上,编译器无法得知,解决的方法就是动态绑定。它的含义就是在运行期间含义就是在运行期间(而非编译期间而非编译期间)判断所引用对象的实际类判断所引用对象的实际类型并根据对象的类型进行绑定,从而调用恰当的方法。型并根据对象的类型进行绑定,从而调用恰当的方法。T只要满足类之间有继承关系、子类重写父类的方法、父类引只要满足类之间有继承关系、子类重写父类的方法、父类引用指向子类对象这三个条件,动态绑定就会自动发生,从而实用指向子类对象这三个条件,动态绑定就会自动发生,从而实现多态。现多态。184.3 多态T多态不但能够改善代码的组织结构和可读性,还能够创建可多态不但能够改善代码的组织结构和可
21、读性,还能够创建可扩展的程序,消除类型之间的耦合关系。扩展的程序,消除类型之间的耦合关系。T多态方法调用允许一种类型表现出与其他相似类型之间的区多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要它们都是继承同一基类。别,只要它们都是继承同一基类。T【例例4.6】Polymorphism程序满足多态条件,根据对象的类程序满足多态条件,根据对象的类型调用恰当的型调用恰当的方法方法。194.4 抽象类T在在Java中,只声明而没有实现的方法称为中,只声明而没有实现的方法称为抽象方法抽象方法,其语法,其语法规则如下:规则如下:abstract();T用用abstract修饰的类称为抽象类,其
22、语法规则如下:修饰的类称为抽象类,其语法规则如下:访问修饰符访问修饰符abstract class 例如下面的例如下面的Graphix类为抽象类,方法类为抽象类,方法calArea()为抽象方法:为抽象方法:abstract class Graphix/抽象类抽象类 abstract void calArea();/抽象方法抽象方法class Rect extends Graphix void calArea()/重写抽象方法重写抽象方法 System.out.println(计算长方形面积计算长方形面积);204.4 抽象类T抽象类具有以下特性:抽象类具有以下特性:(1)含有抽象方法的类必须
23、被声明为抽象类,抽象类必须被继含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被实现。承,抽象方法必须被实现。(2)抽象类中不是所有的方法都是抽象方法,可以在抽象类中抽象类中不是所有的方法都是抽象方法,可以在抽象类中声明并实现方法。声明并实现方法。(3)抽象类的子类必须实现父类的所有抽象方法后才能实例化,抽象类的子类必须实现父类的所有抽象方法后才能实例化,否则这个子类也成为一个抽象类。否则这个子类也成为一个抽象类。(4)抽象类不能实例化。抽象类不能实例化。T【例例4.7】Dog类继承类继承Animal类并实现类并实现抽象方法抽象方法run()。214.5 接口T接口的定义格式
24、如下:接口的定义格式如下:public interface extends T关键字关键字interface用于定义接口,接口通常定义为用于定义接口,接口通常定义为public类型。类型。例如,定义一个接口:例如,定义一个接口:public interface Runner int id=1;/等价于等价于public static final int id=1;public void start();/等价于等价于public abstract void start();public void run();public void stop();224.5 接口T接口具有以下特性:接口具有以下
25、特性:(1)接口中的常量默认为接口中的常量默认为public static final,并且也只能是,并且也只能是public static final。(2)接口中只能定义抽象方法,而且这些方法默认为接口中只能定义抽象方法,而且这些方法默认为public abstract,并且也只能是,并且也只能是public abstract类型。类型。(3)接口可以继承其他的接口,并添加新的属性和抽象方法。接口可以继承其他的接口,并添加新的属性和抽象方法。(4)在接口中声明方法时,不能使用在接口中声明方法时,不能使用native、static、final、synchronized、private、pro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 Java面向对象编程下 Java 面向 对象 编程
限制150内