当前位置:文档之家› 2015.6.17--java第七章继承和多态章总结

2015.6.17--java第七章继承和多态章总结

2015.6.17--java第七章继承和多态章总结
2015.6.17--java第七章继承和多态章总结

第七章继承和多态

1.继承的作用:

它是面向对象的三大特征之一,可以解决编程代码冗余的问题,是实现代码重用的重要手段之一。继承是软件可重用性的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法,来充实自身内容,这种表现或行为就称为继承。这个时候新类称为子类,现有的类称为父类。它最基本的作用就是:使得代码可重用,增加软件的可扩充性。

2.继承的语法:

[访问修饰符] class extends;

a.通过extends实现继承subclass 是子类后者是父类。

b.如果访问修饰符是public,那么该类在整个项目可见。

不写访问修饰符,该类只在当前包可见。

c.子类可以从父类中继承,public和protected修饰的属性和方法,不论子类和父类是否在同一个包里。

d.子类还可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。

E.子类无法继承父类的构造方法。

3.多重继承关系的初始化顺序:

父类属性>>父类构造方法>>子类属性>>子类构造方法。

4.实例化子类对象:

A.创建该类的对象。

B.创建该类的子类的对象。

C.子类在实例化时,会首先执行父类的构造方法,然后才执行子类的构造方法。

5.子类继承父类时,构造方法的调用规则如下:

a.如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统默认先调用父类的无参构造方法,在这种情况下是否写入super语句,效果是一样的。

b.如果子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类的无参构造方法。

c.如果子类的构造方法中通过this显式调用自身的其他构造

方法,在相应构造方法中应用以上两条规则。

注意:如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直执行到顶级父类object类的无参构造方法为止。

注意:在类没有提供任何构造方法时,系统会提供无参的方法体为空的默认构造方法,一旦提供了自定义构造方法,系统将不会提供这个默认的构造方法,如果要使用它,程序员必须手动添加。

6.object类

它是所有类的父类。在java中所有的java类都直接或间接的继承了https://www.doczj.com/doc/4a3808590.html,ng.object类。在定义一个类时,没有使用extends关键字,也就是没有显式地继承某个类,那么这个直接继承object类,所有对象都继承这个类的方法。Object类定义大量的可被继承的方法。

7.继承中的方法重写。

A.子类可以根据需求对从父类继承的方法进行重写,这称为方法的重写或方法的覆盖(overriding)。

B.如果子类从父类中继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆盖)。

8.继承中方法重写的要求

a.重写方法与被重写方法必须具有相同的方法名(和方法重写一样)

b.重写方法与被重写方法必须具有相同的参数列表(不一样)

c.重写方法的返回值类型和被重写方法的返回值类型相同。(不一样)

d.重写方法不能缩小被重写方法的访问权限。

e.在继承父类方法的基础上只能修改返回值类型和方法体内容。

9.重载(overloading)和重写(overriding)的区别。

A.重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。

B.重写涉及的是子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同。

10.多态

a.多态一词的通常含义是指能够呈现出多种不同的形式或形态。在程序设计中,它意味着一个特定类型的变量可以引用不同类型的对象。并且能够自动地调用引用的对象的方法。也就是根据作用到的不同对象类型,响应不同的操作。方法

重写是实现多态的基础。

b./*Dog dog =new Dog();

dog.toHospital();

Bird bird =new Bird();

bird.toHospital();*/

Pet pet;

pet=new Dog();

pet.toHospital();

pet=new Bird();

pet.toHospital();

这两段代码的执行结果一样(page179),虽然定义的是Pet 类,但是实际执行的时候是Pet子类的方法,这里的代码就体现了多态性。

多态意味着在一次方法调用中是根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法。而不是用来储存对象引用的变量的类型来决定的。当调用一个方法时,为了得到多态的操作,这个方法即要是父类中声明过的,也必须是子类中重写过的方法。

11.向上转型

a.定义:子类到父类的转换成为向上转型。

将一个父类的引用指向一个子类对象,称为向上转型,自动

进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法。此时同过父类引用变量无法调用子类特有的方法。

b.语法:<父类型><引用变量名>=new <子类型>();

int i=5;

double di=5;

把int型常量或变量的值赋值给double型变量,可以自动进行类型转换。

double d2=3.14;

int a=(int) d2;

把double型常量或变量的值赋值给int型变量,须进行强制转换。

实际上在引用数据类型的子类和父类之间也存在这类型转换问题。如:

Pet pet=new Dog();子类到父类的转换

pet.toHospital();会调用Dog类的toHospital()方法,而不是Pet类的toHospital()方法体现了多态。

12.向下转型

A.定义:当向上转型发生后,将无法调用子类特有的方法。但是如果需要调用子类特有的方法时,可以通过把父类在转换为子类来实现。

B.将一个指向子类对象的父类引用赋给一个子类的引用,即父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。

C.语法:<子类型><子类引用变量>=(子类型)<父类引用变量>

Dog dog =(Dog) pet;

dog.catchingFlyDisc();Dog特有的接飞盘方法.

13.instanceof运算符

在向下转型的过程中,如果没有转化为真实子类类型,会出现类型转换异常。Page181

Pet pet=new Dog();

pet.toHospital();

Bird bird=(Bird) pet;将pet转换为Bird类型会出错。

A.使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系。否则会出现编译错误。Instanceof通常和强制类型转换结合使用。

14.多态的应用。

A.可替换性:多态对已存在的代码具有可替换性。

B.可扩充性:增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作,实际上新增子类更容易获得多态功能。

C.借口性:多态是父类向子类提供类一个共同接口,由子类完善或

者覆盖来实现。

D.灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。

E.简化性:多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

15.使用父类作为方法的形参。

A.这个方法是java中实现和使用多态的主要方式。(page182)

父类作为方法形参,所有子类对象都可以作为实参。(chapter07.ketang03.pet)

16.使用父类作为方法返回值:

使用父类作为方法返回值也是java中实现和使用多态的主要形式。Page183,(chapter07.ketang0)

掌握继承的优点和实现*****

掌握子类重写父类方法*****

掌握继承下构造方法的执行**********

掌握抽象类和抽象方法的使用*****

掌握final修饰属性、方法和类*****

多态:多种表现形态

多态;父类引用指向子类对象。

Person类型是person的编译类型。

Soldier类型是p的运行时类型。

1.转型

A.向上转型:子类类型转换成父类类型

B.向下转型instanceof:父类类型转换成子类类型,强转。

2.多态的使用

2.1父类作为方法形参

2.2父类作为方法返回值类型。

3.向下转型要转换成真实子类。

Instanceof前边放的是变量后边放的是一个类,可以判断变量是否属于这个类。结果是布尔类型。

Instanceof的使用必须有继承关系。

第七章继承多态练习题

第七章继承多态 一、选择题: 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. 运行结果是?()

第七章派生与继承2

第七章派生与继承2 /*7.4多继承与虚基类 7.4.1多继承中的二义性问题 解决方式 1<对象名>.<基类名>::<成员名> //数据成员 <对象名>.<基类名>::<成员名>(<参数名>) //成员函数 */ /*#include using namespace std; class Base1 { public: int date; void fun(){cout<<"Member of Base1"<<";base1="<fun(); 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

实验七、继承和多态

实验五继承和多态 一.实验目的 1.理解继承的含义,掌握派生类的定义方法和实现; 2.理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员; 3.理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;正确使用base关键字; 4.理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。 二、实验内容 1.编写一个程序计算出球、圆柱和圆锥的表面积和体积。 要求: (1)定义一个基类圆,至少含有一个数据成员——半径;提供方法来计算其面积并输出其信息; (2)定义基类的派生类球、圆柱、圆锥,根据不同的形状为其添加必须的数据成员(如定义圆柱必须额外给出圆柱的高),并添加或改写其方法成 员,提供各形状求表面积和体积的成员函数,并能正确输出该类对象实 例的信息。 (3)定义主函数,求球、圆柱、圆锥的和体积并输出结果信息。 注意:派生类覆盖基类的同名方法时,如果不是虚方法,需要在前面加关键字new,否则会有警告信息。 public class Circle { private double radius; public Circle () { ……} public Circle (double radiusValue){ this.radius = radiusValue; } public double Radius { ……} public virtual double CircumFerence()//计算周长 { ……}

public virtual double Area()//基类中的面积计算方法 { ……} public override string ToString() { return "圆半径="+radius; } } public class Cylinder : Circle//圆柱继承自圆类 { private double height; public Cylinder() { } public Cylinder(double radiusValue, double heightValue) :base(。。。) { this. height = heightValue; } public override double Area() { … } 2.编写测试用例,对一组不同形状的物体调用其面积和体积的计算,并输出其结果。 提示:在Main方法中定义一个Circle 数组,赋予数组不同的对象(比如第一个元素为圆锥、第二个元素圆柱、第三个球等,然后遍历这个数组,去求取每

《Java知识点总结系列》第七章——封装、继承、多态篇

面向对象的三大特性封装继承多态 知识点预览 封装的概念 继承的概念 访问修饰符 方法的覆盖(Override) super关键字 多态的概念 强制类型转换与instanceof关键字 封装的概念 1. 什么是封装 通过边界将内部组成部分与外部分开 2. 封装的好处 a) 提高一个物体内部组成部分的安全性 b) 向外部屏蔽物体内部组成部分的差异 私有访问修饰符private 2个方法获得设置 3. 封装的内容 a) 属性----->必须 b) 方法根据需要封装 c) 方法声明公开方法实现封装 ------->思想 继承的概念 1. 什么是继承

2. 继承的语法 a) extends关键字; b) 继承的好处:提高代码的复用性 3. 子类对象的扩展 4. Java语言中继承的特点 a) Java语言中继承是单继承(最多有一个直接父类) b) Java中单继承的好处

几何拓扑:树状结构较简单易于实现5. 继承关系在内存中的表现形式

JVM开辟连续的存储空间(父类、子类) 6. 对象的创建过程\ new Dog(); a) 分配空间(父类对象空间子类对象空间) b) 初始化属性 递归的构造父类对象 调用构造方法 c) 初始化属性 d) 调用构造方法 Java中的访问修饰符 1. 什么是Java中的访问修饰符式 private public default protected 2. Java中的访问修饰符

方法的覆盖(Override) 1. 什么是方法的覆盖 子类对从父类继承的方法重新实现 2. 方法覆盖的要求 a) 子类覆盖方法的访问修饰符范围必须大于或者等于父类对应方法的访问修饰符范围 b) 子类覆盖方法的返回值类型必须和父类方法一致 c) 覆盖方法的参数必须和父类方法一致 super关键字 1. super代表父类对象 a) super.属性 子类、父类出现同名,子类中访问父类属性 b) super(); 在付了构造方法中调用父类构造方法 2.super()总结 a) 每一个子类的构造方法没有显示调用super(),系统都会提供一个默认的super();(子类编译完后编译器默认加上super(),调用无参构造) b) super()书写在第一行; c) 可以在父类构造方法红枣年糕显示调用super()实现对特定父类构造方法的调用。 3. super思考题 TestSuper4 [java]view plaincopy

第7章 继承和接口设计 习题

第7章继承和接口设计 一.选择题 1.在C#中,一个类【】。 A) 可以继承多个类B) 可以实现多个接口 C) 在一个程序中只能有一个子类D) 只能实现一个接口 2.【】关键字用于在C#中从派生类中访问基类的成员。 A) new B) super C) this D) base 3.在定义类时,若希望类的某个方法能够在派生类中进一步改进,以满足派生类的不同需要,则应将该方法声明为【】。 A) new B) public C) virtual D) override 4.在C#中,在派生类中对基类的虚方法进行重写,要求在派生类的声明中使用【】。 A) new B) public C) virtual D) override 5.已知类B是由类A继承而来,类A中有一个名为M的非虚方法,现在希望在类B中也定义一个名为M的方法,且两方法的参数个数和类型完全相同,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用【】关键字。 A) static B) new C) override D) virtual 6.假设类B继承了类A,下列说法错误的是【】。 A) 类B中的成员可以访问类A中的公有成员 B) 类B中的成员可以访问类A中的保护成员 C) 类B中的成员可以访问类A中的私有成员 D) 类B中的成员可以访问类A中的静态成员 7.关于多态,下列说法正确的是【】。 A) 多态实际上就是重载,它们本质上是以一样的 B) 多态可以分为编译时多态和运行时多态。前者的特点是在编译时就能确定要调用成 员方法的哪个版本,后者则是在程序运行时才能确定要调用成员方法的哪个版本。 C) 编译时多态是在程序运行时才能确定要调用成员方法的哪个版本,而运行时多态在 编译时就能确定要调用成员方法的哪个版本。 D) 多态和重载是两个完全不同的概念,前者是通过定义虚方法和重写虚方法来实现, 后者是通过对同一函数名编写多个不同的实现代码来实现。 8.下列关于接口的说法,正确的是【】。 A) 接口中定义的方法都必须是虚方法 B) 接口中定义的方法可以编写其实现代码 C) 继承接口的类可提供被继承接口中部分成员的实现代码 D) 接口中的所有方法都必须在其派生类中得到实现。 9.下列关于虚方法的描述中,正确的是【】。 A) 虚方法能在程序执行时动态确定要调用的方法,因此比非虚方法更灵活 B) 在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符 C) 在重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符 D) 在重写基类的虚方法时,需要同时带上virtual和override修饰符 10.在C#中,以下关于抽象类的叙述中错误的是【】。 A) 抽象类可以包含抽象方法B) 含有抽象方法的类一定是抽象类 C) 抽象类不能被实例化D) 抽象类可以是密封类 11.在C#中,以下关于抽象类和接口的叙述中正确的是【】。

C++习题第07章 继承和派生

第07章继承和派生 (1)面向对象程序设计的____机制实现了代码重用,有效地缩短了程序的开发周期。(2)在继承关系中,被继承的类称为____,通过继承关系定义出来的新类称为_____。(3)派生类的继承方式有____ ,____ 和____3种,其中默认的继承方式为____.。 (4)公有继承时,基类的私有成员为跑生类的____成员,基类的保护成员成为派生类的____成员,基类的公有成员成为派生类的____成员。 (5)在派生类中不能访问基类的____成员,这符合面向对象程序设计的封装思想。(6)C++语言不仅支持____继承,也支持____继承。 (7)可以把派生类的对象当做基类对象来处理,这是____的概念。 (8)根据联编实现的不同极端,可将其分为____联编和____联编两种。 (9)声明了纯虚函数的类,称为____。 2.选择题 (1)下列关于派生类的描述中,不正确的是() A)派生类的成员除了包含它自己的成员的访问权限在派生类中保持不变 B)派生类中继承的基类 C)派生类至少有个一个基类 D)一个派生类可以作为另一个派生的基类 (2)在保护继承中,基类的私有成员变成派生类的() A)不可访问成员B)稀有成员C)保护成员D)公有成员 (3)若有如下类声明: Class Base { int k; Public: Void set(int n){k=n;} Int get()const{return k;} }; Class Derived:protected Base {protected: Int j; Public: Void set(int m,int n) { Base::set(m); j=n; } Int get()const { return Base::get()+j; } }; 则类Derived中保护的数据成员和成员函数的个数是() A)4 B)3 C)2 D)1 (4)在派生类的结构函数的初始化表中,不能包含()

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