当前位置:文档之家› 类的封装继承与多态

类的封装继承与多态

类的封装继承与多态
类的封装继承与多态

教学提示:封装、继承与多态是面向对象程序设计的三个核心特性。封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想。继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,充分利用已有的类来完成更复杂、更深入的程序开发。而多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变得容易。

教学目标:理解封装、继承和多态的概念。了解如何在应用程序的开发中利用这些思想简化程序的开发。

7.1 封装

7.1.1 封装的概念

封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,也不能对类中非公共的数据进行操作。这样可以防止外部的干扰和误用。

封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只须用设计者提供的接口来访问对象。同时减少了程序各部分之间的依赖性,降低了程序的复杂性,由于隐藏了其内部信息的细节,使内部信息不易受到破坏,安全性有了保证,同时也为外界访问提供了简单方便的界面。

7.1.2 封装的实现

Java定义了4种访问权限:公有的(public)、保护的(protected)、私有的(private)和默认的。

1.公有的(public)

用public修饰的类成员(包括变量和方法)称为公有的,公有成员允许Java系统中所有的类访问,即不仅允许类内部的成员访问,也允许同一个包或不同包中的类直接访问。外界可以直接存取公有数据,调用公有方法。

113

【例7-1】成员变量说明为公有

//file name:Demo1.java

class p1

{

public int x; //定义公有变量

public void set_x(int i)

{ x=i; }

public void show_x() //定义公有方法

{ System.out.println("x="+x); }

}

class Demo1

{

public static void main(String args[])

{

p1 obj=new p1();

obj.set_x(3); //通过调用类的公有方法给公有变量赋值

obj.show_x(); //通过调用类的公有方法显示公有变量的值

obj.x=18; //直接给obj对象的公有变量赋值

System.out.println("x="+obj.x); //直接输出公有变量的值

}

}

程序输出结果如图7-1所示:

图7-1 程序运行结果

2.私有的(private)

用private修饰的类成员称为私有的,类的私有成员只能被这个类的方法直接访问。如果在例7-1中将x声明为私有的,则会出现编译错误,即obj.x=18这个语句出错,因为私有变量不能在类外直接访问,只能通过obj对象的公有方法访问x。

一般把不需要外界知道的数据说明为私有,这样有利于数据的安全性,也符合程序设计中隐藏内部信息处理细节的原则。

3.被保护的(protected)

用protected修饰的类成员成为被保护的。类的被保护成员允许其归属的类、由此类派生的子类以及同一个包中的其他类访问。

如果一个类有派生子类,为了使子类能够直接访问父类的成员,则把这些成员(大部分是

114

数据)说明为被保护的。

【例7-2】访问类的被保护成员

//file name:MyDemoClass.java

class ParentClass

{ protected int n=3;

protected void show_n()

{ System.out.println("n="+n); }

}

class MyDemoClass extends ParentClass

{

public static void main(String args[])

{

MyClass obj=new MyClass();

obj.show_n(); //在MyClass类中直接访问父类中被保护的方法

obj.n=18; //直接访问父类中被保护的数据

obj.show_n();

}

}

程序的运行结果如图7-2所示:

图7-2 程序运行结果

4.默认的

如果类成员前面没有任何关键字修饰,则称为默认的。默认的类成员除了允许被其归属的类访问外,还允许同一个包中的其他类访问。若两个类不在同一个包中,即使是这个类的子类,也不允许访问这个类的默认成员。

如果将例7-1中的变量x前面的public关键字去掉,则成为默认类型的变量,程序运行结果不变。如果将例7-2中的变量x前面的protected关键字去掉,则运行结果同样不变。

对类成员的4种访问权限总结在表7-1中。

115

116

7.2 继承

7.2.1 继承的概念

继承是一种由已有类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类。新类继承一般类的状态和行为,并根据需要增加它自己的状态和行为。

从现有类出发定义一个新类,称为新类继承了现有的类,其中被继承的现有类叫做超类(superclass )或父类,由继承而得到的类称为子类(subclass )。

例如,当类sub1继承类super 时,就表明sub1是super 的子类,即super 是sub1的超类(父类)。子类从超类继承变量和方法,从而可以共享数据和方法。sub1类由两部分组成:继承部分和增加部分。继承部分是从super 继承过来的,把super 的成员映射成sub1的继承成员;增加部分是专为sub1编写的代码,如图7-3所示。

图7-3 继承性

在Java 中规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,而且允许多层继承,即子类还可以有它自己的子类,在下一层的继承关系中原先的子类就变成了父类。这样的继承关系就形成了继承树。

7.2.2 类继承的实现

类继承用关键字extends 实现,格式为: class 子类名extends 父类名 {子类的类体}

如果没有extends 子句,则这个类直接继承Object 。 【例7-3】 类继承和传递性

设计思路:设计三个类A 、B 、C ,A 类中定义多个成员变量和方法,B 类继承

A 类,C

类继承B类,并且在B类中增加新的成员变量,在C类中增加新的成员变量。分别创建三个类的对象,在B、C类对象中访问父类的成员变量,观察继承的传递性。

代码://file name: MyClass.java

class A

{

int a1=1;

public int a2=2;

protected int a3=3;

private int a4=4;

int geta4()

{ return a4;}

}

class B extends A

{

int b=5; //添加新的数据成员b,同时B类还有从A类继承过来的数据成员

//a1,a2,a3和成员方法geta4()

}

class C extends B

{

int c=6; //添加新的数据成员c

void change() //添加新的方法change()

{

a1+=10; a2+=10; a3+=10; b+=10; c+=10;

}

}

class MyClass

{

public static void main(String args[])

{

A aa=new A();

System.out.println("A:"+aa.a1+" "+aa.a2+" "+aa.a3+" "+aa.geta4());

B bb=new B();

System.out.println("B:"+bb.a1+" "+bb.a2+" "+bb.a3+" "+bb.geta4()

+" "+bb.b);

C cc=new C();

System.out.println("C:"+cc.a1+" "+cc.a2+" "+cc.a3+" "+cc.geta4()+

" "+cc.b+" "+cc.c);

cc.change();

117

118 System.out.println("C :"+cc.a1+" "+cc.a2+" "+cc.a3+" "+cc.geta4() +" "+cc.b+" "+cc.c); } }

请读者自己写出输出结果。

此例中A 、B 、C 3个类的层次关系如图7-4所示。

图7-4 类继承的层次关系

7.2.3 成员变量的继承

子类继承父类中所有可被子类访问的成员变量。继承原则如下: 1. 能够继承那些声明为public 和protected 的成员变量。 2. 能够继承同一包中的那些默认修饰符的成员变量。 3. 不能继承那些声明为private 的成员变量。

4. 如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量。此

时子类的成员变量称做隐藏了父类的成员变量。

总之,子类可继承父类的public 、protected 和默认修饰变量,不能继承private 变量。反之,如果父类不允许其子类访问它的某些成员,那么它必须以private 方式声明该成员。这一点充分体现了类封装的信息隐蔽原则。

【例7-4】 子类继承父类的成员变量。

设计思路:设Person 类定义抽象“人”具有的特征和行为包括姓名、年龄。Student 类定义学生这群人的特征和行为,包括姓名、年龄、系别等。分别设计Person 类与student 类。

A

B

C

代码:

public class Person

{

String name; //姓名

int age; //年龄

}

class Student

{

String name; //姓名

int age; //年龄

String dept; //系别

}

这样的定义其中有大量的重复。利用继承的原则,将Student类定义为Person类的子类。程序如下:

public class Person

{

String name; //姓名

int age; //年龄

}

class Student extends Person //Student是Person类的子类

{

String dept; //系别

}

此时Student共有3个成员变量,从Person类中继承了两个成员变量name和age,自己增加了成员dept。

7.2.4 成员方法的继承

子类继承成员方法的规则类似于继承成员变量的规则:子类继承父类中所有可被子类访问的成员方法。继承规则如下:

1.能够继承那些声明为public和protected的成员方法。

2.能够继承同一包中的默认修饰符的成员方法。

3.不能继承那些声明为private的成员方法。

4.不能继承父类的构造方法。

如果子类方法与父类方法同名,则不能继承。子类方法称为覆盖了父类中的那个方法。

总之,子类可继承其父类的public、protected和默认修饰方法,不能继承private方法。子类除了可以继承父类中的变量及方法,还可以增加自己的成员。当一个父类成员不适合该子类时,子类会重新定义它,如果是重新定义的是成员变量就是隐藏父类的变量,如果是成员方法就是覆盖父类的方法。

119

【例7-5】子类继承超类的成员方法。

设计思路:重新设计Person类及其子类Student1。Person类中声明了两个保护变量name、age及两个方法:setdata用于赋初值,print用于打印成员变量的值。Student1类继承Person类,增加了自己的成员变量dept。

代码://file name:Student1.java

public class Person

{

protected String name; //保护成员

protected int age;

void setdata(String n1,int a1)

{

name=n1;

age=a1;

}

public void print()

{

System.out.println(name+","+age);

}

}

class Student1 extends Person

{

protected String dept;

public static void main(String args[])

{

Person p1=new Person();

p1.setdata("张军",21);

p1.print();

Student1 s1=new Student1();

s1.setdata("陈丽华",20); //调用父类的成员方法

s1.dept="计算机系"; //访问本类的成员变量

s1.print();

}

}

程序的运行结果如图7-5所示:

120

121

图7-5 程序运行结果

在该程序中,语句:

p1.setdata(“张军”,21);

表示父类Person 对象p1通过调用本类方法为p1的成员变量name 、age 赋值。而Student1子类继承了其父类Person 的成员变量name 、age 及方法setdata 、print ,语句:

s1.setdata(“陈丽华”,19);

表示子类对象s1通过调用继承来的setdata 方法,为s1的成员变量name 、age 赋值。 在Student1子类中虽然增加了成员变量dept ,但在使用中仍然存在问题,不够圆满: 1.调用s1.setdate()只能为超类中成员赋值,却无法为子类成员dept 赋值。这是因为s1所调用的setdate 和print 方法是由超类定义的,其中没有对dept 的操作。改进的方法是使用构造方法。

2.调用s1.print()只能显示超类成员值,却无法显示子类成员dept 的值。为了能使s1.print()显示dept 的值,就需要在Student1子类中对超类的方法print 进行重新定义,称为方法的覆盖。 7.2.5 重写

重写是指在继承过程中,子类中的成员(包括数据和方法)与其父类中的成员同名,但功能不同,此时,子类的成员“覆盖”从父类继承过来的成员。包括两种情况:一是数据覆盖,称为数据隐藏,即父、子类中数据成员的名称相同,类型不同,它们实际上是完全不同的两个数据;二是方法覆盖,称为方法重写,即父、子类中方法的名称相同,参数表也完全相同,但功能不同。

在数据隐藏和方法覆盖后,子类成员覆盖了父类的同名成员,要访问父类的这些成员, 需用super 关键字来引用当前类的父类。super 的用法有3种情况。 1.super.变量名:访问父类中被隐藏的成员变量。

2.super.方法名([参数表]):调用父类中被重写的方法。

3.super([参数表]):调用父类的构造方法,此时,可用super 来表示父类的构造方法。 【例7-6】 变量隐藏和方法重写。 设计思路:设计类A 和类B ,类B 继承类A ,在类A 中定义一个整型变量A 和一个方法show(),在类B 中将A 变量类型改变为double 型,并将show()方法的方法体重新写,改变在类A 中的功能。在main()中创建一个类B 的对象调用show()方法。 代码://file name:TestClass.java

class A { int x=1;

void show()

{

System.out.println("class A:");

}

}

class B extends A

{

double x=7.8; //子类B的成员变量double型的x隐藏了父类A的int型的x void show() //子类B的成员方法覆盖了父类A的成员方法show()

{

System.out.println("class B:");

}

void show1()

{

super.show(); //访问父类A的成员方法show()

System.out.println(super.x); //访问父类A的成员变量x

show(); //访问本类B的成员方法show()

System.out.println(x); //访问本类B的成员变量x }

}

class TestClass

{

public static void main(String srgs[])

{

B bb=new B();

bb.show1();

}

}

输出结果如图7-6所示:

图7-6 程序运行结果

122

7.3 多态

多态(polymorphism),是指一个名字可具有多种语义。在面向对象语言中,多态是在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法。通常有两种途径实现多态:方法的重载和覆盖。

多态性允许以统一的风格处理已存在的变量及相关的类。多态性使得向系统增加新功能变得容易。继承性和多态性是降低软件复杂性的有效技术。

7.3.1 方法的重载

方法重载时:

●参数必须不同即参数个数不同,类型也可以不同。

●返回值可以相同,也可以不同。

重载的价值在于它允许通过使用一个普通的方法名来访问一系列相关的方法。当调用一个方法时具体执行哪一个方法根据调用方法的参数决定,Java运行系统仅执行与调用的参数相匹配的重载方法。尽管Java并没有规定重载方法之间必须有联系,但习惯上,为了程序的可读性,最好重载相同含义的方法。

例如,输出语句print的参数可以是Java中的任何基本类型,其实就是对print()方法的重载:

public void print(boolean b)

public void print(char c)

public void print(int i)

public void print(long l)

public void print(float f)

public void print(double d)

【例7-7】构造方法的重载。

设计思路:本例还是以Person构造方法为例说明方法的重载。子类继承超类中所有的成员变量和成员方法,但子类不能继承超类的构造方法。解决办法有两种:一是使用默认的构造方法,二是编写多个直接的构造方法。本例使用第二种方法。

代码://file name:Student.java

class Person

{

static int count=0;

protected String name;

protected int age;

public Person(String n1,int a1)

{

name=n1;

age=a1;

123

}

public Person(String n1) { //构造方法重载

this(n1,0); //调用本类的构造方法

}

public Person(int a1) { //构造方法重载

this("未知名", a1);

}

public Person(){ //构造方法重载

this("未知名");

}

public void print(){

System.out.print(this.getClass().getName()+" ");

System.out.print("count="+this.count+" ");

System.out.println(" "+name+","+age);

}

}

public class Student extends Person{

protected String dept;

Student(String n1,int a1,String d1) {

super(n1,a1);

dept=d1;

}

Student(){

this("未知名",0,"未知系");

}

public static void main(String args[]) {

Person p1 = new Person("王小红",21);

p1.print();

Person p2 = new Person("张小云");

p2.print();

Person p3 = new Person(19);

p3.print();

Person p4 = new Person();

p4.print();

Student s1 = new Student("赵小丽",19,"计算机系");

s1.print();

Student s2 = new Student();

124

}

}

程序运行结果如图7-7所示:

图7-7 程序运行结果

7.3.2 方法的覆盖

在前述继承规则中有一条:子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类方法同名,则不能继承,此时子类的方法称为覆盖(override)了超类中的那个方法。在进行覆盖时,应注意以下三点:

●子类不能覆盖超类中声明为final或static的方法。

●子类必须覆盖超类中声明为abstract的方法,或者子类也声明为abstract。

●子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方法的声明一样。

方法的覆盖(method overriding)与类的继承有密切的关系。覆盖体现了子类补充或改变超类方法的能力。通过覆盖使一个方法在不同的子类间表现出不同的行为。

在面向对象系统中,对象封装了方法。恰恰利用诸如重名、重定义让各对象自己去解释执行,而这种多义性决不会带来混乱。这对于需求分析、模型设计是极为有利的,因为这些

工作不需要涉及具体的数据结构和类型,只是着重于揭示系统的逻辑合理性。

【例7-8】方法的覆盖。

设计思路:设计Person类定义toString和print方法,print方法显示本类名和父类名,SuperStudent子类中的toString和print方法覆盖了超类Person的同名方法。

代码://file name:SuperStudent

class Person

{

static int count=0;

protected String name;

protected int age;

public Person(String n1,int a1)

{

name=n1;

125

age=a1;

this.count++; //超类对象计数

}

public String toString()

{

return https://www.doczj.com/doc/ed5985194.html,+"," +this.age;

}

public void print()

{

System.out.println("本类名="+this.getClass().getName()+" "+

"超类名="+this.getClass().getSuperclass().getName()+" ");

System.out.print("Person.count="+this.count+" ");

System.out.print("SuperStudent.count="+SuperStudent.count+" ");

Object s1= this;

if(s1 instanceof Person) //判断对象属于哪个类

{

System.out.println(s1.toString()+"是Person类对象。");

}

if(s1 instanceof SuperStudent)

{

System.out.println(s1.toString()+"是SuperStudent类对象。");

}

}

}

public class SuperStudent extends Person

{

static int count=0; //隐藏了超类的count

protected String dept;

protected SuperStudent(String n1,int a1,String d1)

{

super(n1,a1); //调用超类的构造方法

dept=d1;

this.count++; //子类对象计数

}

public String toString() //覆盖超类的同名方法

{

return super.toString()+","+dept; //调用超类的同名方法}

126

public void print() //覆盖超类的同名方法

{

super.print(); //调用超类的方法

System.out.println("super.count="+super.count); //引用超类变量

System.out.println("this·count="+this.count);

}

public static void main(String args[])

{

Person p1= new Person("王小明",21);

p1.print();

SuperStudent s1=new SuperStudent("张小云",19,"计算机系");

s1.print();

}

}

程序运行结果如图7-8所示:

图7-8 程序运行结果

从本例可以看出:

(1)在子类中声明了与超类成员count同名的变量时,超类和子类中都有静态变量count,子类中的count隐藏了超类中的count,此时两者不是继承关系,可以用this.count引用本类的变量,而用super.count引用被子类隐藏了的超类的同名变量。

(2)子类方法与超类方法同名时,子类方法覆盖超类的同名方法。例如:s1.toString()方法覆盖了p1.toString()方法,s1.print()方法覆盖p1.print()方法。

不同的对象执行属于自己类的方法。例如,pl.print执行的是Person类中方法,输出前两行结果;sl.print 执行的是子类SuperStudent中的方法,首先通过“super.print ( ); ”调用超类的同名方法,再执行自己的语句,输出后五行的结果。

(3)子类对象“即是”超类对象,所以Person.count也统计子类对象。可用instanceof 运算符判断一个对象是否为某个类的对象,如“if(sl instanceof Student)”。

(4)this和super引用的用法区别。

this有两种用法:既可以指代对象自身,如s1=this;也可以通过this引用本类的成员变量和方法,如this.count和this.toString()。

127

super只有一种用法,即通过super引用超类中的成员变量和方法,如super.count和super.print(),而不能单独使用super,如sl=super是非法的。因为子类与超类存在继承关系,子类从超类继承变量和方法,但子类对象与超类对象却不存在类似继承的对应关系,所以super无所指。

128

实验04 类的继承与多态

实验四类的继承与多态 一、实验目的 1.掌握构造方法和成员方法重载的应用。 2.理解类的继承性的作用 3.领会面向对象编程的多态性。 二、实验内容与要求 基本概念 1.进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。 当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。 Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少 有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 2.了解成员变量的隐藏方式 所谓隐藏是指子类重新定义了父类中的同名变量,在子类L ine 中重新定义了x为x1,y 为y1,隐藏了父类Point 中的两个成员变量x 和y。子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给程序带来麻烦。 3.了解成员方法的覆盖方式 (1)方法覆盖的定义与作用通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。 4.理解类的多态性类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在O OP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。 类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。 实践应用

实验六继承性与多态性

湖北工业大学工程技术学院实验报告 课程名称:面向对象程序设计实验内容:实验六继承性与多态性 学院:工程技术学院专业班级: 姓名:学号:指导教师: 实验日期:实验地点: 一、实验目的 1、1、了解多态性的概念。 2、2、了解虚函数的作用及使用方法。 3、3、了解纯虚函数和抽象类的概念和用法。 二、实验步骤 1.设计一个类层次,其中的基类为Date,它拥有一个相关数据成员及一个虚函 数print,从Date类派生ShortE、MediumDate和LongDate类,Date的print 函数使用日期格式:11-26-2015, ShortE的print函数使用日期格式:26-11-2015 MediumDate的print函数使用日期格式:Nov.26,2015 LongDate的print函数使用日期格式:November 26, 2015 编写一个程序来测试各个类的print函数。 #include using namespace std; class Date { protected: int year,month,day; public: Date(int y,int m,int d) { year=y; month=m;

day=d; } virtual void print() { cout<

继承与多态习题

继承与多态习题 一.基本概念与基础知识自测题 8.1填空题 8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。(3)类 的对象可作为(4)类的对象处理,反过来不行,因为(5)。如果强制转换则要注意(6)。 答案:(1)基类 (2)派生类 (3)派生类 (4)基类 (5)派生类有一些新成员 (6)只能派生类强制转换为基类 8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员, protected成员成为派生类的(2)成员,对private成员是(3)。公有派生可以使其类的(4),所以公有派生是主流。 答案:(1)public成员 (2)protected成员 (3)不可访问 (4)接口不变 8.1.3 利用继承能够实现(1)。这种实现缩短了程序开发的时间,VC++中的(2)很 好地体现了这一点。 答案:(1)代码的复用 (2)MFC编程 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.5 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和

(3)完全一样就认为是虚函数,而不必再加关键字(4)。如有任何不同,则认为是(5)而不是虚函数。除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。 答案:(1)同虚函数名 (2)同参数表 (3)同返回类型。如基类中返回基类指针,而派生类中返回派生类指针是允许的 (4)virtual (5)重载 (6)静态成员函数 (7)内联函数 (8)构造函数 8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质 是将指向函数体的指针定为(3)。 答案:(1)=0 (2)不定义 (3)NULL 8.2简答题 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)? 答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖(override)。 8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的 调用?为什么? 答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。 8.2.4为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的 存储方式。 答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。虚基类(virtual base class)定义方式如下: class派生类名:virtual 访问限定符基类类名{...}; class派生类名:访问限定符virtual基类类名{...}; virtual 关键字只对紧随其后的基类名起作用。

JAVA继承和多态实验报告

实验项目名称:继承和多态 (所属课程:Java语言程序设计) 院系:专业班级:姓名: 学号:实验地点:指导老师: 本实验项目成绩:教师签字:日期: 1.实验目的 (1)掌握类的继承机制。 (2)熟悉类中成员变量和方法的访问控制。 (3)熟悉方法或构造方法多态性。 2.实验内容 (1)模拟编写程序,理解类的继承、多态、继承和多态规则。 (2)独立编程,实现类的继承和多态。 3.实验作业 设计一个类Shape(图形)包含求面积和周长的area()方法和perimeter()方法以及设置颜色的方法SetColor(),并利用Java多态技术设计其子类Circle(圆形)类、Rectangle (矩形)类和Triangle(三角形)类,并分别实现相应的求面积和求周长的方法。每个类都要覆盖toString方法。 海伦公式:三角形的面积等于s(s-a)(s-b)(s-c)的开方,其中s=(a+b+c)/2 程序代码为: Class包 package Class; public class Shape { private String color = "while"; public Shape(String color){ this.color = color; } public void setColor(String color){ this.color = color; } public String getColor(){ return color;

} public double getArea(){ return 0; } public double getPerimeter(){ return 0; } public String toString(){ return"color:" + color; } } package Class; public class Circle extends Shape { private double radius; public Circle(String color,double radius) { super(color); this.radius = radius; } public void setRadius(double radius){ this.radius = radius; } public double getRadius(){ return radius; } public double getCircleArea(){ return 3.14*radius*radius; } public double getCirclePerimeter(){ return 3.14*2*radius; } public String toString(){

C 的封装性、继承性和多态性概念

C++的封装性、继承性和多态性概念 封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。例如,在抽象的基础上,我们可以将时钟的数据和功能封装起来,构成一个时钟类。按c++的语法,时钟类的声明如下:class Clock { public: //共有成员,外部借口void SetTime(int NewH,int NewM,int NewS); void ShowTime(); private: //私有成员,外部无法访问int Hour,Minute,Second; } 可以看到通过封装使一部分成员充当类与外部的接口,而将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。什么是多态(Polymorphisn)?按字面的意思就是“多种形状”。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等 的技术,赋值之后,>>>父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作<<<(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function)实现的。好,接着是“虚函数”(或者是“虚方法”)。虚函数就是允许被其子类重新定

义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”(override),或者称为“重写”。“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。 ... 继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的"父亲",而这些子实体则是汽车的"孩子"。19. 多态的作用?主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用; 2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

JAVA面向对象基础测试题,继承,封装,多态等测试题

JAVA面向对象基础测试题 提示:本题为第一阶段,JAVA面向对象基础部分练习题,包括对象,类,继承,封装,多态,接口,内部类等等,java核心基础,适合初学者对面向对象基础的知识进行测试,以便查漏补缺。 1. 程序执行的结果是:()。 01 public class Point{ 02 int y = 7; 03 public void step(int y) { 04 y += y; 05 System.out.println(y); 06 } 07 public static void main(String[] args) { 08

Point p = new Point(); 09 p.step(10); 10 } 11 } A.14 B.20 C.10 D.17 正确答案:B解析: 2. 程序的执行结果是:()。 01 public class Question { 02 private int num; 03 public static void main(String [] args){ 04 Question q = new Question();

05 q.num=13; 06 update(q); 07 System.out.println(q.num); 08 } 09 public static void update(Question q){ 10 q.num=9; 11 } 12 } A.13 B.9 C.0 D.4 正确答案:B解析: 3.

程序执行的结果是:()。 01 public class Answer { 02 public static void main(String[] args) { 03 int score = 20; 04 Answer ans= new Answer(); 05 ans.add(score); 06 System.out.println(" main:score = " + score); 07 } 08 void add(int score) { 09 System.out.println(" add:score=" + score++); 10 } 11

如何体现封装、继承、多态 编程人员看看

如何体现封装、继承、 编程人员看看! 如何体现封装、继承、多态 编程人员看看!! ! 什么事封装? 1. 保护数据成员, 不让类以外的程序直接访问或 修改,只能通过提供的公共的接口访问==>数据封 装。 2. 方法的细节对用户是隐藏的,只要接口不变, 内容的修改不会影响到外部的调用者==>方法封装。 3. 当对象含有完整的属性和与之对应的方法时称为 封装。 4. 从对象外面不能直接访问对象的属性, 只能通 过和该属性对应的方法访问。 5. 对象的方法可以接收对象外面的消息。 比如: Class A { private int prop; puplic int getProp() { return prop; }

public void setProp(int prop) { this.prop = prop; } } 属性 prop 是 private 的,外界不能直接访问, 但是外界可以通过调用 getProp()和 setProp()的方 法, 给对象发消息,从而完成某种功能。 什么事多态? 多态性的概念经常被说成事“一个接口,多种方 法”。这意味着可以为一组相关的动作作设计一个通 用 的接口。多态允许同一个接口被必于同一个类的多个 动作使用,这样就降低了程序的复杂性。再拿狗作比 喻, 一条狗的嗅觉是多态的。如果狗闻到猫的气味,它会 在吠叫并且追着它跑。如果狗闻到食物的气味,它将 分 泌唾液并向盛着食物的碗跑去。两种状况下同一种嗅 觉器官在工作,差别在于问到了什么气味,也就是有

两 种不同类型的数据作用于狗的鼻子!在 java 中,同一 个类中的 2 个或 2 个以上的方法可以有同一个名字, 只要 参数声明不同即可。在这种情况下,该方法就被称为 重载(Overload),这个过程称为方法重载(Method overloading)。方法重载是 java 实现多态的一种方 式。 有两种方式可以实现多态:* 1. 继承(子类继承父类(包括 abstract class,interf ace ect)) 2. 重载(同一个类中) 如果是面向对象程序设计的话,面向对象程序设 计中的另外一个重要概念是多态性。在运行时,通过 指向 基类的指针,来调用实现派生类中的方法。可以把一 组对象放到一个数组中,然后调用它们的方法,在这 种场 合下,多态性作用就体现出来了,这些对象不必是相 同类型的对象。当然它们都继承自某个类,你可以把 这些 派生类都放到一个数组中。如果这些对象都有同名方

类的继承性和多态性

南京信息工程大学实验(实习)报告 实验(实习)名称类的继承性和多态性实验(实习)日期得分指导教师陈遥 系计算机专业网络工程年级 2014 班次 2 姓名刘信言学号 20142346074 一、实验目的 1.掌握Java语言的类的继承的概念。 2.掌握Java语言中抽象类的使用。 3.掌握Java语言中接口的使用 二、实验内容及步骤 1.类的继承,具体要求如下: (1)定义一Person类,该类具有属性人名、年龄、身份证号等信息以及将属性信息作为字符串返回的 方法; (2)定义一Student类,让该类继承Person类,该类除了具有属性人名、年龄、身份证号等信息以外还有学号,所在学校等信息;该类也具有将属性信息作为字符串返回的一方法; (3)编写测试类,测试这两个类 【源程序】

【运行效果图】

2.定义一个动物抽象类Animal,该类有一个抽象的方法cry();定义一个小猫类Cat,该类继承了Animal 类并实现了cry()方法,当调用cry()方法时打印“小猫喵喵叫”,定义一个小狗类Dog,该类也继承了Animal类并实现了cry()方法,当调用cry()方法时打印“小狗汪汪叫”。 【源程序】 【运行效果图】

3. 接口的运用。 定义一接口接口名叫Usb,该接口声明了两个方法分别为start()和stop()方法,定义一U盘类UsbDiskWriter,一照相机类Camera、一手机类Mobile,让它们都实现该接口。 【源程序】

【运行效果图】

五、结果分析 1. 子类若想调用父类的构造函数必须要用super关键字。 2.接口体中只能运用抽象类。 3.在同一个java文件中只能在入口函数的类中用public。

Java继承与多态实验报告

西安邮电大学 (计算机学院) 课内实验报告 实验名称:继承与多态 专业名称:计算机科学与技术 班级:计科1405班 学生姓名:高宏伟 学号:04141152 指导教师:刘霞林 实验日期:2016.10.13

一、实验目的 通过编程和上机实验理解Java 语言的继承和多态特性,掌握变量的隐藏、方法的覆盖、重载,掌握抽象类和接口的使用。 二、实验要求 1.编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序。 2.编写体现类的多态性(成员方法重载)的程序。 3.编写体现类的多态性(构造方法重载)的程序。 4.编写使用接口的程序。 三、实验内容 (一)类的继承 1.创建公共类Student. (1)编写程序文件Student.java,源代码如下: public class Student { protected String name; //具有保护修饰符的成员变量 protected int number; void setData(String m,int h) //设置数据的方法 { name =m; number= h; } public void print() //输出数据的方法 { System.out.println(name+", "+number); } } (2)编译Student.java,产生类文件Student.class。 2.创建继承的类Undergraduate

(1)程序功能:通过Student 类产生子类undergraduate,其不仅具有父类的成员变量name()、number(学号),还定义了新成员变量academy(学院)、department (系)。在程序中调用父类的print 方法。 (2)编写Undergraduate 程序: class Undergraduate extends Student { 【代码1】//定义成员变量academy 【代码2】//定义成员变量department public static void main(String args[]) { 【代码3】//创建一个学生对象s 【代码4】//用父类的setData方法初始化对象s 【代码5】//对象s调用print方法 【代码6】//创建一个大学生对象u 【代码7】//调用父类的成员方法setData初始化对象u 【代码8】//设置对象u的成员变量academy 【代码9】//设置对象u的成员变量department System.out.print(https://www.doczj.com/doc/ed5985194.html,+", "+u.number+", "+u.academy+", "+u.department); } } (3)编译并运行程序 注意:公共类Student 与undergraduate 类要在同一文件夹(路径)。 (二)方法的重载 (1)程序功能:对不同的数进行排序输出。在IntSort 类中定义3 个同名的方法sort。 (2)编写Sort.java 文件,源代码如下。 import java.awt.Graphics; import java.applet.Applet; class IntSort { public String sort(int a, int b) { if (a>b) return a+""+b; else return b+""+a; } public String sort(int a, int b, int c) { int swap; if (a

第七章继承多态练习题

第七章继承多态 一、选择题: 1、分析: class A { A() { } } class B extends A { //系统自动生成的构造方法和类的访问权限一样 } 哪两种说法是正确的? ( ) A:类B的构造方法是public的. B:类B的构造方法包含对this()的调用. C:类B的构造方法没有参数. D:类B的构造方法包含对super()的调用. 2、运行结果是:() class Base { Base() { System.out.print("Base"); } } public class Alpha extends Base { public static void main( String[] args ) { new Alpha(); new Base(); } } A: Base B: BaseBase C: 编译失败. D: 没有输出. E: 运行时异常. 3. 程序的运行结果是?() A: 编译失败. B: hello from a C: hello from b D: hello from b E: hello from a hello from a hello from b

4. 运行结果是:() class TestSuper { TestSuper(int i) { } } class TestSub extends TestSuper{ } class TestAll { public static void main (String [] args) { new TestSub(); } } A: 编译失败. B: 程序运行没有异常. C: 第7行抛出异常. D: 第2行抛出异常. 5. 程序的运行结果是?() A: 0 B: 1 C: 2 D: 编译失败. 6. 对于语句"B is a D" 和"B has a C",一下哪两种说法是正确的? ( ) A:D是B. B:B是D. C:D是C. D:B是C. E:D继承B. F:B 继承D. 7. 运行结果是?()

《java面向对象程序设计-继承和多态》教案

第四章 面向对象的概念和 Java 实现-2 回顾 ?类是具有相同属性和行为的一组对象的集合 , 对象是类的实例 ?封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 ?类可用Class 来定义,类的变量和方法可被该类的实例访问, 圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 ?包可用package 来申明,可用import 来导入包 目标 ?理解继承及其特点 ?运用JAVA程序实现继承 ?理解多态及其特点设计 ?运用JAVA程序实现多态 ?掌握访问修饰符和方法修饰符 继承 继承的特点 继承的优点 继承的JAVA实现 子类构造方法 2-1 子类构造方法 2-2 ?调用父类构造方法的语法为: super() 或 super(参数列表) ; ?super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态性 2-1 ?多态性是指?°多种形式?± ?它使用不同的实例而执行不同操作 ?多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 演示:示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 ?信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 ?信息隐藏的原因包括: ?对任何实现细节所作的更改不会影响使用该类的代码 ?防止用户意外删除数据 ?此类易于使用

访问修饰符 3-2访问修饰符 3-3

?访问修饰符可访问性 方法修饰符 static 修饰符 3-1 ?static修饰符修饰的方法叫静态方法 ?目的 ?使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法 static 修饰符 3-2 ?调用静态方法的语法为: classname.methodname( ); static 修饰符 3-3 演示:示例 6 final 修饰符 abstract 修饰符 3-1 ?由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类 ?抽象方法必须声明在抽象类中 ?抽象方法语法: abstract type method_name(parameter_list); ?声明抽象类语法: abstract class{…… } ?使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节 abstract 修饰符 3-2 ?抽象类可以具有指向子类对象的对象引用 abstract 修饰符 3-3 演示:示例 7 接口 ?接口就是某个事物对外提供的一些功能的申明 ?可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 ?使用interface关键字定义接口 ?一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 创建接口的步骤 2-1 // 定义方法的接口 public interface myinterface { public void add(int x, int y); public void volume(int x,int y, int z); } // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 创建接口的步骤 2-2 接口使用示例

面向对象的三大特性(封装-继承-多态)

一丶封装 1 权限修饰符 可以用来修饰成员变量和成员方法,对于类的权限修饰只可以用public和缺省default。 被public修饰的类可以在任意地方被访问;default类只可以被同一个包内部的类访问。 权限由大到小:public protected default(不写) private 被private修饰的成员只能在本类中访问,外界不能访问 2 set()/get()方法 (1)this关键字 a.可以用来调用变量,方法,构造方法; b.this.xx 理解为调用当前类的xx。 (2)成员变量和局部变量 1)在类中的位置不同 a:成员变量:在类中,方法外 b:局部变量:在方法声明上(形式参数),或者是在方法定义中

2)在内存中的位置不同 a:成员变量:在堆内存 b:局部变量:在栈内存 3)生命周期不同 a:成员变量:随着对象的创建而存在,随着对象的消失而消失 b:局部变量:随着方法调用而存在,随着方法的调用结束而消失 4)初始化值不同 a:成员变量:有默认值 b:局部变量:必须初始化值,否则报错!(在使用它之前,没有初始化) (3)set()/get()方法 当成员变量被private修饰时,不在本类中无法直接访问,便需要set()/get()方法来解决这个问题 3 封装性 封装:是面向对象的第一大特性,所谓封装,就是值对外部不可见(一般而言被private修饰),外部只能通过对象提供的接口(如set()/get()方法)来访问。 封装的好处:a.良好的封装能够减少耦合;

b.类内部的结构可以自己修改,对外部影响不大; c.可以对成员进行更精准的控制(防止出现与事实不符的情况); d.影藏实现细节。 注意:在开发中,类的成员变量全部要进行封装,封装之后通过set()/get()方法访问。 二丶继承extends 1 实现:通过 class Zi extends Fu{} 实现类的继承 (1)子类继承父类,父类中声明的属性,方法,子类都可以获取到; 当父类中有私有的属性方法时,子类同样可以获取到,由于封装性的设计,使得子类不能直接调用访问。 (2)子类除了可以继承父类的结构外,还可以定义直接特有的成员变量,成员方法; (3)Java中类的继承只支持单继承,一个类只能继承一个父类,父类可以有多个子类,但是可以多层继承; (4)子类不能继承父类的构造方法,可以间接的通过super关键字去访问父类的构造方法(super();); 在子类的构造方法中如果没有显示的调用父类的构造方法,会默认调用父类的无参构造(所以最好父类都写有无参构造方法)。 子类继承父类的访问特点:首先父类进行初始化,然后子类进行初始化;多层访问! 2 方法的重写(区别重载) 子类继承父类以后,若父类的方法对子类不适用,那么子类可以对父类方法重写(override) 规则:1)要求子类方法的返回值类型方法名(参数列表)与父类方法一致; 2)子类方法的权限修饰符不能小于父类方法的修饰权限; 3)若父类方法抛异常,那么子类方法抛的异常类型不能大于父类; 注意: a.当子类重写了父类的方法以后,可以用 super.方法调用父类被重写的内容; b.子父类的方法必须同为static或同为非static。 class Fu{ private int i; public Fu(){ //无参构造 super();可以省略 super(); } public Fu(int i){ //有参构造

JAVA面向对象基础测试题-继承-封装-多态等测试题教程文件

J A V A面向对象基础测试题-继承-封装-多 态等测试题

JAVA面向对象基础测试题 提示:本题为第一阶段,JAVA面向对象基础部分练习题,包括对象,类,继承,封装,多态,接口,内部类等等,java核心基础,适合初学者对面向对象基础的知识进行测试,以便查漏补缺。 1. 程序执行的结果是:()。 01 public class Point{ 02 int y = 7; 03 public void step(int y) { 04 y += y; 05 System.out.println(y); 06 } 07 public static void main(String[] args) { 08 Point p = new Point(); 09 p.step(10); 10 } 11 } A.14 B.20 C.10 D.17 正确答案:B解析: 2. 程序的执行结果是:()。 01 public class Question { 02 private int num; 03 public static void main(String [] args){ 04 Question q = new Question();

q.num=13; 06 update(q); 07 System.out.println(q.num); 08 } 09 public static void update(Question q){ 10 q.num=9; 11 } 12 } A.13 B.9 C.0 D.4 正确答案:B解析: 3. 程序执行的结果是:()。 01 public class Answer { 02 public static void main(String[] args) { 03 int score = 20; 04 Answer ans= new Answer(); 05 ans.add(score); 06 System.out.println(" main: score = " + score); 07 } 08 void add(int score) { 09 System.out.println(" add: score=" + score++); 10 } 11

Java为什么要继承、封装和多态

为什么要继承、封装和多态 1,为什么要继承 继承的好处是代码重用.哲学上讲事物都是有共性和特性的.把共性函数代码放入到父类中,把特性函数代码放入到子类中,当然是否共性要以参照点的标准.OO中所谓的抽象我自己理解为哲学中的共性在同一个行业中,他们各业务流程往往有很大的相似性,但往往我们都是到一个项目中就重新写一套流程代码,或者粘贴以前的代码.可能有很多代码都是以前写过的重复代码.造成重复劳动.如果采用继承应该这样,首先在父类中做一个基本上大部分行业项目都必要的简洁的主流程.在子类中针对具体项目的特殊性做主流程充分的完善的补充.这样在每个项目中,只针对项目的特殊性编写代码,大大降低重复劳动.当然根据具体流程的复杂多可以划分多的继承层次,呈现一种继承的树结构,但一定的要保证层次一定要有实际的意义. 2,为什么要封装 高内聚低偶合的思想简单的理解同一模块内的提高内聚,不同模块降低偶合.如果说一个类代表一个模块或是一个业务流,那么A类内部要提高内聚,类的属性可以看成是内的局部变量.提高数据的重用.公共函数尽量能被其他主函数,尽量达到功能内聚.如果说是A类和B类,并且是不同模块(也许是同一个模块下的两个子模块),那么B 是不能使用A的函数和属性的,紧进行数据偶合.封装的作用就体现在这里.

再现实中就项目中经常遇到这种情况,某项业务增加或修改一种类型的业务流,自己本身调试成功了,但是缺影响了此业务下其他的业务流,不得不测试所有得其他原本正常的业务流并不得不针对此做类型判断的补丁,这种补丁很肯能导致程序结构的不合理. 3.为什么要多态 个人认为多态的好处体现在代码的可扩充性,比如一个业务有多个业务流,为了区别不同的类型就的使用判断,那么新添加一个流程就得在过程执行主流程(往往是final,必然是面向过程的)中添加一个”if then”或是重载一个函数 在目前项目中mvc得控制器就是典型的多态.想想如果我们不使用多态那么怎么办?因为对PO对象是新添加的,那么必须针对新的PO 对象在代码中做IF判断,才能用他本身的对象类型指向他.造成过程执行主流程不断的要变更自己的代码. 总结: OO中继承和多态互相依赖又互相矛盾,没有继承就不可能有多态,多态的使用往往又在面向过程的代码中.继承是使子类可以使用父类的功能,而多态使父类能使用子类的功能. OO并非只是在编码阶段来处理,实际上在概要设计,详细设计,数据库设计的时候就应该OO的思想来设计.提高软件可重用性和可扩充性.对于想对一个行业做标准化产品软件而言,很重要.

C++习题3(继承和多态)

一、选择题 1. 在C++中,类与类之间的继承关系具有(C ) A)自反性B)对称性C)传递性D)反对称性 2. 在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(B A)受限制B)保持不变C)受保护D)不受保护 3. 按解释中的要求在下列程序划线处填入的正确语句是: (C ) #in elude class Base{ public: void fun(){coutfun(); 4. 在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(C ) A)受限制B)保持不变C)受保护D)不受保护 5. 在哪种派生方式中,派生类可以访问基类中的protected 成员(B ) A)public 禾口private B)public 、protected 禾口 private C)protected 禾口private D)仅protected

6. 当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C) A) public 成员B) private 成员C) protected

成员D) 友元 7. 不论派生类以何种方法继承基类,都不能使用基类的(B ) A) public 成员B) private 成员C) protected 成员D) public 成员和protected 成员 8 下面叙述错误的是( S )。 A) 基类的protected 成员在派生类中仍然是protected 的 B) 基类的protected 成员在public 派生类中仍然是protected 的 C) 基类的protected 成员在private 派生类中是private 的 D) 基类的protected 成员不能被派生类的对象访问 9. 下列说法中错误的是( S )。 A) 保护继承时基类中的public 成员在派生类中仍是public 的 B) 公有继承时基类中的private 成员在派生类中仍是private 的 C) 私有继承时基类中的public 成员在派生类中是private 的 D) 保护继承时基类中的public 成员在派生类中是protected 的 10下面叙述错误的是( C)。 A) 派生类可以使用private 派生 B) 对基类成员的访问必须是无二义性的 C) 基类成员的访问能力在派生类中维持不变 D) 赋值兼容规则也适用于多继承的组合 11派生类的构造函数的成员初始化列表中,不能包含(C )。 A) 基类的构造函数B) 派生类中子对象 的初始化 C) 基类中子对象的初始化D) 派生类中一般数 据成员的初始化 12. 下列虚基类的声明中,正确的是: ( B ) A)class virtual B: public A B)class B: virtual public A C)class B: public A virtual D)virtual class B: public A 13..实现运行时的多态性采用(D ) A)重载函数B)构造函数C)析构函数D)虚函数 14. 若一个类中含有纯虚函数,则该类称为(D )

第7课件 封装、继承和多态(4学时 19-22)

第七讲义面向对象——类 几种设计模式: 1. 当创建一个对象,若不想让对象的内容(私有成员变量)发生变化,则需要满足以下条件 (1) 所有数据域都是私有的;(2)没有修改方法setMethod;(3)没有一个访问器方法会返回一个指向可变数据域的引用。不可变类/对象例如:String类 2. 为了防止用户创建某个类的对象,则应该定义该类的私有构造方法。例如:Math类 3. 当只允许某个类只能创建一个实例时,称为单例模式。 一、类的封装 方法的抽象;类的抽象;(将方法的实现和使用分开| 将类的实现和使用分开) 类的用户&类的开发者 二、类的继承和多态(2个学时) 继承是java在软件重用方面最重要的特征。能有效避免代码冗余,使系统易于理解和维护、子类继承于父类,UML图表示,次类——超类,或继承类—基类。 当子类继承父类的时候,子类可以继承父类的所有成员跟方法,继承下来不代表可以访问,要访问得看访问控制规则。私有属性也可以继承,不过根据访问控制规则,私有属性虽继承下来却不可以访问的,只有通过public的方法访问继承下来的私有属性。 B继承A类,C继承B类。A类中的私有属性,到了C会怎么样,能继承、访问吗?答案是:如果A中的属性有增加setget方法,可以访问的。举例 public class A { private int a; public int getA(){ return a; } public void setA(int a){ this.a=a; } } public class B extends A{ private int b; public int getB() { return b; } public void setB(int b) { this.b = b; } } public class C extends B { private int c; public int getC() { return c; }

相关主题
文本预览
相关文档 最新文档