《第4章 Java面向对象编程(下).ppt》由会员分享,可在线阅读,更多相关《第4章 Java面向对象编程(下).ppt(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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
26、tected等修饰符。等修饰符。(5)Java中不允许类的多继承,但允许接口的多继承。中不允许类的多继承,但允许接口的多继承。(6)不允许创建接口的实例,但允许定义接口类型的引用变量,不允许创建接口的实例,但允许定义接口类型的引用变量,该变量引用实现了该接口的类的实例。该变量引用实现了该接口的类的实例。(7)一个类只能继承另外一个类,但能同时实现多个接口,并一个类只能继承另外一个类,但能同时实现多个接口,并且重写的方法必须显式声明为且重写的方法必须显式声明为public。【例例4.8】测试接口的多种测试接口的多种特性特性。234.6 终止继承Tfinal具有具有“不可改变不可改变”的含义,它可
27、以修饰非抽象类、非抽的含义,它可以修饰非抽象类、非抽象成员方法和变量。象成员方法和变量。(1)用用final修饰的类不能被继承,没有子类。修饰的类不能被继承,没有子类。(2)用用final修饰的方法不能被子类的方法重写或隐藏。修饰的方法不能被子类的方法重写或隐藏。(3)用用final修饰的变量表示常量,只能被赋值一次。修饰的变量表示常量,只能被赋值一次。(4)父类中用父类中用private修饰的方法不能被子类的方法重写,因此修饰的方法不能被子类的方法重写,因此private类型的方法默认是类型的方法默认是final类型的。类型的。244.6 终止继承T4.6.1 final类类T继承关系的弱点
28、是打破封装,子类能够访问父类的实现细节,继承关系的弱点是打破封装,子类能够访问父类的实现细节,而且能以方法重写的方式改变实现细节。在以下情况下。可以而且能以方法重写的方式改变实现细节。在以下情况下。可以考虑把类设计为考虑把类设计为final类型,使得这个类不能被继承。类型,使得这个类不能被继承。(1)不是专门为继承而设计的类,类本身的方法之间有复杂的不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系。如果随意创建这些类的子类,子类有可能错误地修调用关系。如果随意创建这些类的子类,子类有可能错误地修改父类的实现细节。改父类的实现细节。(2)出于安全的原因,类的实现细节不允许有任何改动。出
29、于安全的原因,类的实现细节不允许有任何改动。(3)在创建对象模型时,确信这个类不会再被扩展。例如在创建对象模型时,确信这个类不会再被扩展。例如java.lang.String类是类是final类。类。254.6 终止继承T4.6.1 final类类T【例例4.9】定义类定义类T为为final类。类。TestFinal.javafinal class T int i=3;int j=6;void f()System.out.println(i+j);public class TestFinal public static void main(String args)T n=new T();n.f
30、();n.i=20;n.j+;程序运行结果:程序运行结果:9264.6 终止继承T4.6.2 final方法方法T假如父类允许子类继承父类的某些方法或重写某些方法,但假如父类允许子类继承父类的某些方法或重写某些方法,但保留某些方法,使得这些方法不能被子类继承,那么父类可以保留某些方法,使得这些方法不能被子类继承,那么父类可以将这些方法声明为将这些方法声明为final类型。类型。T例如在例如在java.lang.Object类中,类中,getClass()方法为方法为final类型,类型,而而equals()方法不是方法不是final类型。类型。T如果父类的某个方法是如果父类的某个方法是priv
31、ate,子类将无法继承该方法,自,子类将无法继承该方法,自然也就无法重写或隐藏该方法。然也就无法重写或隐藏该方法。【例例4.10】分别在分别在Parent类中定义不同访问权限的类中定义不同访问权限的final方法方法。274.6 终止继承T4.6.3 final变量变量T一个变量被限定为一个变量被限定为final,其实是将它定义为一个符号常量。,其实是将它定义为一个符号常量。T例如,在类例如,在类ConstValue中定义了三个中定义了三个final变量,如下所示。变量,如下所示。class ConstValue final int CONST1=10;static final int CON
32、ST2=20;public static final int CONST3=30;Tfinal变量具有以下特点:变量具有以下特点:(1)final修饰符可以修饰静态变量、实例变量和局部变量,分修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量。别表示静态常量、实例常量和局部常量。【例例4.11】使用静态常量、实例常量和局部常量。使用静态常量、实例常量和局部常量。284.6 终止继承T4.6.3 final变量变量(2)final成员变量应该显式初始化,否则成员变量应该显式初始化,否则final类型的实例变量类型的实例变量会导致编译错误。会导致编译错误。对于对于fi
33、nal类型的实例变量可以先声明,不必立即赋值,这类型的实例变量可以先声明,不必立即赋值,这时又叫空白时又叫空白final,可以在构造方法中或对象的初始化块中对它,可以在构造方法中或对象的初始化块中对它进行初始化。进行初始化。对于对于final类型的静态变量,可以在定义变量时进行初始化,类型的静态变量,可以在定义变量时进行初始化,也可以在静态初始化块中进行初始化,若没有显式初始化,则也可以在静态初始化块中进行初始化,若没有显式初始化,则系统自动初始化为默认值,并且系统自动初始化为默认值,并且final类型变量只能被赋值一次,类型变量只能被赋值一次,即使两次赋值的值相同也不行。即使两次赋值的值相同
34、也不行。294.6 终止继承T4.6.3 final变量变量T例如,在下面的代码片段中试图对例如,在下面的代码片段中试图对final类型的变量赋值两次。类型的变量赋值两次。public class FinalInitialize final int a=1;/合法,合法,final变量被显式初始化变量被显式初始化 final int b;/编译出错,因为后边没有对编译出错,因为后边没有对b进行显式初始化进行显式初始化 final int c;/空白空白final final static int d=9;/静态静态final变量被显式初始化变量被显式初始化 /静态静态final变量变量f没有显
35、式初始化,则没有显式初始化,则int类型的类型的f值的默认值是值的默认值是0 final static int f;FinalInitialize()a=1;/编译出错,编译出错,final变量只能被赋值一次变量只能被赋值一次 c=5;/空白空白final在构造器中得到初始化在构造器中得到初始化 304.7 权限修饰符1私有访问权限私有访问权限使用了使用了private访问控制符访问控制符的成员方法或的成员方法或成员变量,只能在这个类的内部使用,其他类不能访问。成员变量,只能在这个类的内部使用,其他类不能访问。2默认访问权限默认访问权限没有使用任何访问控制符成员方法或成没有使用任何访问控制符成
36、员方法或成员变量,就称为默认的或者包类型的成员。这种成员可以被员变量,就称为默认的或者包类型的成员。这种成员可以被这个包中的其他类访问。位于同一个包中的子类可以访问父这个包中的其他类访问。位于同一个包中的子类可以访问父类中的默认访问控制成员。但如果子类与父类位于不同的包类中的默认访问控制成员。但如果子类与父类位于不同的包中,子类则不能访问父类中的默认访问控制成员。中,子类则不能访问父类中的默认访问控制成员。3受保护访问权限受保护访问权限使用了使用了protected访问控制符访问控制符的成员方的成员方法或成员变量,既可以被同一个包中的其他类访问,也可以法或成员变量,既可以被同一个包中的其他类访
37、问,也可以被位于不同包继承此父类的子类访问,但不能被不同包的类被位于不同包继承此父类的子类访问,但不能被不同包的类访问。访问。4公有访问权限公有访问权限使用了使用了public访问控制符访问控制符的成员方法或的成员方法或成员变量,可以被所有的类访问,不管访问类与被访问的类成员变量,可以被所有的类访问,不管访问类与被访问的类是否位于同一个包中,以及是否有继承关系。是否位于同一个包中,以及是否有继承关系。314.7 权限修饰符T4.7.1 类内部类内部T在一个类的内部,其定义的四种不同的成员变量和成员方法,在一个类的内部,其定义的四种不同的成员变量和成员方法,在整个类中都是可见的。在整个类中都是可
38、见的。【例例4.12】定义四种不同的成员变量和定义四种不同的成员变量和方法方法。324.7 权限修饰符T4.7.2 同一个包的类同一个包的类T除了除了private类型的所有成员变量和成员方法,一个类可以访类型的所有成员变量和成员方法,一个类可以访问位于同一个包中的另一个类中的成员变量和成员方法。问位于同一个包中的另一个类中的成员变量和成员方法。【例例4.13】访问位于同一个包中的其他类的成员变量和成员访问位于同一个包中的其他类的成员变量和成员方方法法。334.7 权限修饰符T4.7.3 不同包的子类不同包的子类T如果类如果类B继承位于不同包的类继承位于不同包的类A,那么类,那么类B只能访问类
39、只能访问类A中中protected与与public类型的成员变量和成员方法,不能访问类类型的成员变量和成员方法,不能访问类A中中private与与default类型的成员变量和成员方法。类型的成员变量和成员方法。【例例4.14】访问不同包的子类的成员变量和访问不同包的子类的成员变量和方法方法。344.7 权限修饰符T4.7.4 通用性通用性T如果类如果类B与类与类A位于不同包,并且两者之间并没有继承关系,位于不同包,并且两者之间并没有继承关系,那么类那么类B只能访问类只能访问类A中中public类型的成员变量和成员方法,类型的成员变量和成员方法,其他类型的都不能访问。其他类型的都不能访问。【例
40、例4.15】访问不同包的类的成员变量和方法。访问不同包的类的成员变量和方法。354.7 权限修饰符T4.7.4 通用性通用性TestAccess4.javapackage org.approach2;import org.approach1.TestAccess1;public class TestAccess4 public static void main(String args)TestAccess1 access1=new TestAccess1();/System.out.println(access1.var1);/System.out.println(access1.var2);
41、/System.out.println(access1.var3);System.out.println(access1.var4);/access1.f1();/access1.f2();/access1.f3();access1.f4();程序的运行结果:程序的运行结果:public variable public method364.7 权限修饰符T4.7.4 通用性通用性T现在对以上情况进行归纳,如下表所示。现在对以上情况进行归纳,如下表所示。privatedefaultprotectedpublic同一个类同一个包中的类子类任何包中的类权权限修限修饰饰符符374.7 权限修饰符T4.
42、7.5 访问权限与继承访问权限与继承T父类中哪些成员能够被子类继承?其遵循如下规则:父类中哪些成员能够被子类继承?其遵循如下规则:(1)构造方法是不能被继承的。构造方法是不能被继承的。(2)private修饰的成员是不能被继承的。修饰的成员是不能被继承的。(3)默认访问权限的成员,当子类与父类处于同一包中时,这默认访问权限的成员,当子类与父类处于同一包中时,这些成员会被继承,当子类与父类处于不同包时,这些成员不能些成员会被继承,当子类与父类处于不同包时,这些成员不能被继承。被继承。(4)protected与与public修饰的成员总是能被继承的。修饰的成员总是能被继承的。(5)能被子类访问的成
43、员,才会被子类继承。能被子类访问的成员,才会被子类继承。(6)能被子类继承的实例方法,才会被子类重写或重载。能被子类继承的实例方法,才会被子类重写或重载。(7)能被子类继承的能被子类继承的static方法,才会被子类隐藏或重载。方法,才会被子类隐藏或重载。(8)能被子类继承的数据成员,才会被子类隐藏。能被子类继承的数据成员,才会被子类隐藏。384.8 综合实例:航班管理T某航空公司对航班进行管理,管理控制台用如下几条命令进某航空公司对航班进行管理,管理控制台用如下几条命令进行管理:行管理:命令:命令:create命令命令格式:格式:create 功能:创建一个航班。功能:创建一个航班。命令命令
44、2:reserve命令命令格式:格式:reserve 功能:旅客预订座位,返回预订号。要求:同一批的旅客必须功能:旅客预订座位,返回预订号。要求:同一批的旅客必须安排在同一排且座位相邻,每一位旅客返回一个预订号。预安排在同一排且座位相邻,每一位旅客返回一个预订号。预订号自已定义,只要不重号即可。若安排不下订号自已定义,只要不重号即可。若安排不下(条件不能满条件不能满足足),则显示反馈信息。,则显示反馈信息。394.8 综合实例:航班管理命令命令3:Cancel命令命令格式:格式:Cancel 功能:取消预订功能:取消预订命令命令4:list命令命令格式:格式:list功能:显示座位预订情况功能
45、:显示座位预订情况命令命令5:exit命令命令功能:退出程序。功能:退出程序。404.8 综合实例:航班管理T实现上述功能需要定义实现上述功能需要定义2个接口和个接口和3个类,两个接口分别是旅个类,两个接口分别是旅客接口和航班接口,三个类分别是旅客接口的实现类、航班客接口和航班接口,三个类分别是旅客接口的实现类、航班接口的实现类和用户界面操作类。接口的实现类和用户界面操作类。(1)定义旅客接口定义旅客接口PassengerInterface.java package org.aeroplane;public interface PassengerInterface public String
46、getName();/获取姓名获取姓名 public int getBookingNumber();/获取预订号获取预订号 public int getRow();/获取座位排数获取座位排数 public int getSeatPosition();/获取座位号获取座位号 (2)实现该接口的实现该接口的旅客类旅客类Passenger.java414.8 综合实例:航班管理(3)定义航班接口定义航班接口PassengerInterface.java package org.aeroplane;public interface PassengerInterface public String ge
47、tName();public int getBookingNumber();public int getRow();public int getSeatPosition();424.8 综合实例:航班管理(4)实现航班接口的航班类实现航班接口的航班类Flight.java 在航班类中,要实现创建座位、完成客户座位的预订和取在航班类中,要实现创建座位、完成客户座位的预订和取消座位的预订。航班类的消座位的预订。航班类的源程序源程序。其中:其中:l创建航班座位创建航班座位 passengerList=new Passengerrow*rowLength;l预订航班预订航班座位座位434.8 综合实例
48、:航班管理l取消预订航班座位取消预订航班座位 public boolean cancel(int bookingNumber)boolean Status=false;for(int i=0;i row*rowLength;i+)if(passengerListi!=null&bookingNumber=passengerListi.getBookingNumber()Status=true;passengerListi=null;break;return Status;444.8 综合实例:航班管理(4)用户航班命令输入和处理用户航班命令输入和处理Client.java。在在Client.j
49、ava中,能够对控制台输入的命令进行分析并且中,能够对控制台输入的命令进行分析并且进行相应的处理,命令功能包括客户预订航班座位、取消航进行相应的处理,命令功能包括客户预订航班座位、取消航班预订和客户寻求帮助。班预订和客户寻求帮助。源程序源程序。其中:其中:l创建航班座位对控制台输入的指令进行创建航班座位对控制台输入的指令进行分析分析l客户预订航班座位客户预订航班座位private void reserveCommand(String cmds)/用户名放在用户名放在cmds1,cmds2.if(cmds.length=1)System.out.println(reserve command e
50、rror!);return;String names=new Stringcmds.length-1;for(int i=0;i names.length;i+)namesi=new String(cmdsi+1);int bn=flight.reserve(names);/处理座位预订处理座位预订 if(bn0!=-1)for(int i=0;i bn.length;i+)System.out.println(namesi+s Booking Number is:+bni);else System.out.println(No Such Sequential Seats Now!);454.