当前位置:文档之家› 子类与继承

子类与继承

子类与继承
子类与继承

太原师范学院

实验报告

Experimentation Report of Taiyuan teachers College

报告内容

一、实验目的四、实验方法

二、实验原理五、实验记录及数据处理

三、实验仪器及材料六、误差分析及讨论

系部计算机系班级XXX 班课程Java语言程序设计姓名XXXX 学号XXXXX 日期XXXXXXXXXXxx

项目子类与继承——银行计算利息

1.相关知识点

子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super所拥有,同样子类一旦重写了继承的方法,就覆盖了继承的方法,那么子类创建的对象就不能调用被覆盖的方法,该方法的调用由关键字super负责。因此,如果在子类中想使用被子类隐藏的成员变量或覆盖的方法,就需要使用关键字super。比如super.x、super.play()就是访问和调用被子类隐藏的成员变量x和方法play()。

2.实验目的

本实验的目的是让学生重写的目的以及怎样使用super关键字。

3.实验要求

假设银行Bank已经有了按整年year计算利息的一般方法,其中year只能取正整数。比如按整年计算的方法:

double computerInterest(){

Interest=year*0.35*savedMoney;

return interest;

}

建设银行ConstructionBank是Bank的子类,准备隐藏继承的成员变量year,并重写计算信息的方法,即自己声明一个double型的year变量,比如,当year取值是5.216时,表示要计算5年零216天的利息,但希望首先按银行Bank的方法computerInterest()计算出5整年的利息,然后再自己计算216天的利息。那么,建设银行就必须把的整数部分赋值给隐藏的year,并让super 调用隐藏的、按整年计算利息的方法。

要求ConstructionBank和BankOfDalian类是Bank类的子类,ConstructionBank和BankOfDalian都使用super调用隐藏的成员变量和方法。

ConstructionBank、 BankOfDalian和Bank类的UML图如下:

Bank

savedMoney:int

year:int

interest:double

computerInterest():double

ConstructionBank BankDalian

year:double year:double computerInterest():double computerInterest():double 4.实验程序源代码

Bank.java

Public class Bank{

int savedMoney;

int year;

double interest;

double interestRate=0.29;

public double computerInterest(){

interest=year*interestRate*saveMoney;

return interest;

}

public void setInterestRate(double rate){

interestRate=rate;

}

}

ConstructBank.java

public class ConstructionBank extends Bank{

double year;

public double computerInterest(){

super.year=(int)year;

double r=year-(int)year;

int day=(int)(r*1000);

double yearInterest=https://www.doczj.com/doc/0818483296.html,puterInterest();

double dayInterest=day*0.0001*savedMoney;

interest=yearInterest+dayInterest;

System.out.printf(“%d元存在建设银行%d年零%d天的利息:%f元\n”,savedMoney,super.year,day,interest);

return interest;

}

}

BankOfDalian.java

public class BankOfDalian extends Bank{

double year;

public double computerInterest(){

super.year=(int)year;

double r=year-(int)year;

int day=(int)(r*1000);

double yearInterest=https://www.doczj.com/doc/0818483296.html,puterInterest;

double dayInterest=day*0.00012*savedMoney;

interest=yearInterest+dayInterest;

System.out.printf(“%d元存在大连银行%d年零%d天的利息:%f元\n”,savedMoney,super.year,day,interest);

return interest;

}

}

SaveMoney.java

public class SaveMoney{

public static void main(String args[]){

int amount=8000;

ConstructionBank bank1=new ConstructionBank();

bank1.savedMoney=amount;

bank1.year=8.236;

bank1.setInterestRate(0.035);

double interest1=https://www.doczj.com/doc/0818483296.html,puterInterest();

BankOfDalian bank2=new BankOfDalian();

bank2.savedMoney=amount;

bank2.year=8.236;

bank2.setInterestRate(0.035);

double interest2=https://www.doczj.com/doc/0818483296.html,puterInterest();

System.out.printf(“两个银行利息相差%f元\n”,interest2-interest1);

}

}

5.运行效果示例

程序运行效果如下图所示:

6.实验小结

(1)当S U PER调用被隐藏的方法时,该方法中出现的成员变量是被子类隐藏的成员变量或继承的成员变量。

(2)子类不继承父类的构造方法,因此,子类在其构造方法中需使用super 来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在子类的构造方法中,没有明显的写出super关键字来调用父类的某个构造方法,那么默认的有“super();”。类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误。

JAVA类的继承实验报告

《面向对象程序设计》实验报告 实验六、类的继承 课程代码:1H10500学分:6 实验类型:实践型实验学时:4个学时 实验时间:2017.11.23 实验地点:5407 班级:计算机164 专业:计算机科学与技术专业学号:2016011147 姓名:林文辉 一、实验目的 (1)学习JAVA继承的思想 (2)了解JAVA语言继承的实现 二、实验内容及步骤 内容:在圆柱体类Cylinder里,用一个构造方法调用另一个构造方法 步骤:方案的设计与分析(类结构图。。。。。。) (1)找出对象的共同属性和行为 (2)设计代表共同状态与行为的类 (3)决定子类是否需要让某项行为有特定的不同的运行方式 (4)寻找更多抽象化的机会 (5)完成类的继承层次 三、实验过程及结果 实验1代码: abstract class Graphics { abstract void parameter(); abstract void area(); } class Rectangle extends Graphics{ double h,w; Rectangle(double u,double v){h=u;w=v;} void parameter() { S ystem.out.println("矩形高度为:"+h+",矩形宽度为:"+w); } void area() { S ystem.out.println("矩形面积为:"+(h*w)); } }

class Circle extends Graphics{ double r; String c; Circle(double u,String v){r=u;c=v;} void parameter() { System.out.println("圆半径为:"+r+",圆颜色为:"+c); } void area() { System.out.println("圆面积为:"+(Math.PI*r*r)); } } class ExamAbs{ public static void main(String args[]) { Rectangle rec=new Rectangle(2.0, 3.0); Circle cir=new Circle(4.0, "Red"); Graphics[]g= {rec,cir}; for(int i=0;i

类地封装与继承习题(题)

1.以下关于继承的叙述正确的是( C )。 A、在Java中类只允许单一继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口只允许单一继承 2.有继承关系时用到的关键字是(A )。( 2 分) A:extend B:extends C:implements D:implement 3:Java变量中,以下不属于复合类型的数据类型是( D)。( 2 分) A:类 B:字符型 C:数组型 D:接口 4:java中定义数组名为abc,下面(B )可以得到数组元素的个数。( 2 分) A:abc.length( ) B:abc.length C:len(abc) D:ubound(abc) 5:下列说确的是(A )。( 2 分) A:编译后的Java源程序根据文件中定义的类和接口的个数产生相应个数的.class 字节码文件。 B:Java语言的源文件中不是任何地方都可以加注释的。 C:一个文件中可以有多个访问权限为public的类。 D:含有main()方法的类可以为public的类,也可以为其他类。 6:在调用构造函数时(C )( 2 分) A:子类可以不加定义就使用父类的所有构造函数 B:不管类中是否定义了何种构造函数,创建对象时都可以使用默认构造函数C:先调用父类的构造函数 D:先调用形参多的构造函数 7:Java与C/C++比较说法错误的是(D)。( 2 分) A:Java不提供goto语句,所以也就没指定goto作为关键字。

B:Java没有指针。 C:Java没有联合和结构 D:Java只有单继承没有多重继承。 8:若需要定义一个类域或类方法,应使用( B)修饰符。( 2 分) A:static B:package C:private D:public 9:下列说法( C)是正确的。( 2 分) A:程序执行到break语句是一定会结束所有的循环 B:程序执行到continue语句时会结束当前循环 C:break语句和continue语句都可以和标签协同使用 D:continue语句和break语句的作用相同 10:以下说确的是(D )。( 2 分) A:每个Java类都至少有一个构造方法,如果没有则机器自动生成一个默认的构造方法。 B:如果类里定义了一个或多个构造方法,那么java也提供默认的构造方法 C:每个Java类中用户必须定义至少一个构造方法。 D:以上都不对 11:对封装的理解正确的是(A )。( 3 分) A:封装就是把对象的属性和行为结合成一个独立的单位。 B:封装就是把对象完全隐蔽起来,不让外界访问。 C:封装性是一个使用问题。 D:封装和抽象是一回事。 12:对成员的访问控制保护最强的是(C )。( 3 分) A:public B:缺省 C:private D:protected

java中继承的相关知识总结

JAVA中继承的总结 一、继承概念: 把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容。这个关系叫继承。 二、何时实现继承 A:继承体现的是:is a的关系。 B:采用假设法 三、怎么实现继承 A:用关键字extends表示 B:格式: class 子类名 extends 父类名 {} C:子类 public class 子类 extends 父类 { //增加自己属性 //重写父类的属性 //增加自己的方法 //重写父类的方法 } 四、继承的好处: A:提高了代码的复用性 B:提高了代码的维护性

C:让类与类产生了一个关系,是多态的前提 继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 五、Java中继承的特点 A:Java中类只支持单继承,只能一个直接父类,Object 根类 B:Java中可以多层(重)继承(继承体系) 六、继承的注意事项: A:子类能继承父类的私有成员,但不是都能访问 B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承 七、继承中static用法 A:static:子类可以继承父类的静态方法,但不能重写 B:static 的属性和方法都是不能覆盖的,因为static修饰的部分都是与对象无关的,只与类有关 八、Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单 b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?

继承和派生实验报告

实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1)

(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。

2. #include #include using namespace std; #define PI 3.14159 class Point{ friend class Line; protected: double x, y ; public: Point(){x = 0 ; y = 0 ; } Point(double xv,double yv){ x = xv; y = yv; } double Area(){return 0;} void Show() { cout<<"x="<

c=m; } void print(void); protected: char *c; }; void der_table::print(void) { cout< using namespace std; #include class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<=122;i++)

Java 接口与类之间继承例题

1,定义一个接口Assaultable(可攻击的),该接口有一个抽象方法attack()。 2,定义一个接口Mobile(可移动的),该接口有一个抽象方法move()。 3,定义一个抽象类Weapon,实现Assaultable接口和Mobile接口,但并没有给出具体的 实现方法。 4,定义3个类:Tank,Flighter,WarShip都继承自Weapon,分别用不同的方式实现Weapon 类中的抽象方法。 5,写一个类Army,代表一支军队,这个类有一个属性是Weapon数组w(用来存储该军队所拥有的所有武器);该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有的最大武器数量,并用这一大小来初始化数组w。该类还提供一个方法addWeapon(Weapon wa),表示把参数wa所代表的武器加入到数组w中。在这个类中还定义两个方法attackAll()和moveAll(),让w数组中的所有武器攻击和移动。 6,写一个主方法去测试以上程序。 interface Assaultable{//可攻击的 void attack(); } interface Mobile{//可移动的 void move(); } abstractclass Weapon implements Assaultable,Mobile { publicvoid attack(){} publicvoid move(){} } class Tank extends Weapon{ publicvoid attack(){ System.out.println("坦克攻击!!!"); } publicvoid move(){ System.out.println("坦克移动!!!"); } } class Flighter extends Weapon{ publicvoid attack(){ System.out.println("战斗机攻击!!!"); } publicvoid move(){ System.out.println("战斗机移动!!!");

C++类与继承

C++类总结 类中创建的每一个新对象都有自己的存储空间,用于存储其内部变量和类成员,但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。 Const 成员函数 例const Stock land = Stock (“Kludgehorn Properties”); land.show(); 第二句将拒绝编译,show()的代码无法保证被调对象不被修改,所以要这样声明show() Void show()const; 构造函数的参数不是类成员,而是赋给类成员的值,因此参数名不能与类成员名相同。 构造函数的使用分为显式和隐式。 显式例:Stock food =Stock (“world cabbage”,250,1.25); 隐式例:Stock garment(“furry mason”,50,2.5); 用new创建类对象时,C++都将使用类构造函数。 例:Stock *pstock=new Stock(“electroshock games”,18,19.0); 当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。 构造函数不仅仅可用于初始化新对象,还可以用来对已有对象赋值。例如stock1为已有对象。Stock1=stock(“nifty foods”,10,50.0); 析构函数的用途:做类的善后处理。例如构造函数使用new来分配内存,则析构函数将使用delete来释放这些内存。 每个成员函数(包括构造函数和析构函数)都有一个this指针。This指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。 如const stock & topval(const stock & s)const; 要创建对象数组,则这个类必须有默认构造函数。 当想创建一个由所有对象共享的常量时不可以直接用如const int len =30;的方式。可以通过枚举enum {len=30};或使用static关键字static const int len =30;(此时len与其他静态变量存储在一起,而不是存储在类对象中。 运算符重载限制 1.重载运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准型重载操作 符。 2.使用操作符时不能违反操作符原来的句法规则。不能修改操作符的优先级。 3.不能定义新的操作符。 4.不能重载下面的操作符。“Sizeof”“.”(成员操作符) “.*”(成员指针操作符) “::”(作用域解析操作符) “?:”(条件操作符) typeid(一个RTTI操作符), const_cast(强制类型转换操作符), dynamic_cast(强制类型转换操作符),

类的继承与派生

类的继承与派生 编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels 和车重weight。小车类car是它的派生类其中包含载人数passenger_load。卡车类truck是vehicle的派生类其中包含载人数passenger_load和载重量payload,每个类都有相关数据的输出方法. 提示:vehicle类是基类由它派生出car类和truck类将公共的属性和方法放在vehicle类中。 输出结果: 车型:小车 车轮:4个 重量:2000公斤 载人:5人 车型:卡车 车轮:10个 重量:8000公斤 载人:3人 参考代码: #include class vehicle // 定义汽车类 { protected: int wheels; // 车轮数

float weight; // 重量 public: vehicle(int wheels,float weight); int get_wheels(); float get_weight(); float wheel_load(); void show(); }; class car:public vehicle // 定义小车类 { int passenger_load; // 载人数 public: car(int wheels,float weight,int passengers=4); int get_passengers(); void show(); }; class truck:public vehicle // 定义卡车类 { int passenger_load; // 载人数 float payload; // 载重量 public: truck(int wheels,float weight,int passengers=2,float max_load=24000.00); int get_passengers(); float efficiency(); void show(); }; vehicle::vehicle(int wheels,float weight) { vehicle::wheels=wheels; vehicle::weight=weight;

C++继承与派生类习题

第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有 成 的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数D.派生类中子对象类的构造函数 答案:B 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。

例题5:C++类体系中,能被派生类继承的是()。 A.构造函数B.虚函数C.析构函数D.友元函数答案:B 分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的. 例题6:设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 用派生类中子对象类的析构函数,最后调用基类的析构函数。 例题11:设有以下类的定义: class A class B: protected A class C: private B { int A1; { int b1; { int c1; protected: int A2; protected: int b2; protected: int c2; public: int A3; public: int b3; public: int c3; }; }; }; 请按访问权限写出派生类C中具有的成员。 私有成员: (1)

第五章 类与继承作业一

第五章类与继承作业一 一、填空选择题 1、(在同一包中)子类不能继承父类中的私有成员,除此之外,其它所有的成员都可以通过继承变为子类的成员。 2、给出如下的程序,A-E选项中与构造方法ConstOver重载的两个构造方法是:AC。 .public class ConstOver { publicConstOver (int x, int y, int z) { } } A.ConstOver ( ) { } B.ProtectedintConstOver ( ) { } C.PrivateConstOver (int z, int y, byte x) { } D.public Object ConstOver (int x, int y, int z) { } E.public void ConstOver (byte x, byte y, byte z) { } 3、已知类关系如下: class Employee; class Manager extends Employeer; class Director extends Employee; 则以下关于数据的语句正确的是:(A)。 A. Employee e=new Manager(); B. Director d=new Manager(); C. Director d=new Employee(); D. Manager m=new Director(); 4、(A)下面对类的申明哪个是正确的? A)public class Fred { publicint x = 0; public Fred (int x) { this.x = x; } } B)public class fred publicint x = 0; publicfred (int x) { this.x = x; } } C)public class Fred extends MyBaseClass, MyOtherBaseClass { publicint x = 0; public Fred (intxval) { x = xval; } } D)protected class Fred { privateint x = 0;

子类继承父类private属性问题

子类可以继承父类的private属性,但是不能访问。具体到以下这个程序如何解释呢? class Person { private String name; private int age; public void setName(String name) { https://www.doczj.com/doc/0818483296.html, = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } } class Student extends Person { private String school; public void setSchool(String school) { this.school = school; } public String getSchool() { return school; } }

public class TestPerson { public static void main(String[] args) { Student student = new Student(); student.setName("John");//子类继承父类的方法 student.setAge(18); student.setSchool("SCH"); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getSchool()); } } 我在网上搜索有如下两种解释: (1) 子类是不能访问父类中private的属性和方法的,但子类能访问父类的public的属性和方法,因为student这个类继承父类Person,而父类Person里的setName()是public的,所以子类能访问setName()这个方法,setName()这个方法又是在父类Person里的,在同一个类里的方法当然可以访问这个类的属性,总的来说:就是子类student通过setName()来间接访问父类Person的私有属性 (2) 子类虽然不能访问父类的私有变量,但是子类继承了父类的变量和方法,Student类实际上有3个变量,分别是name age school,有6个方法,分别是父类的4个和自己的两个,实际上你在main方法是给自己的private变量name age school 赋值,所以你在get时取到的是自己的private 变量值而不是父类private变量的值 一般是把父类的属性设置为private的,然后提供一个public的方法可以获得该属性,这样父类就可以实现封装,子类可以继承父类属性和方法。

类的继承与派生综合题

1. 类的继承与派生综合题1 题目描述 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。 要求: a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其他数据成员。 b.各类人员的实发工资公式如下: 员工实发工资=基本工资+奖金*出勤率 销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例 经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例 销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例 c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 主函数如下: int main() { Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000); Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000); SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000); objsale.Output(); cout<< "销售员的实发工资:" << " "; cout<

Java中类的继承

Java中类的继承 1、方法重载 重载方法必须满足以下条件: #方法名相问. #方法的参数类型、个数、顺序至少有一项不相同。 #方法的返回类型可以不相同。 #方法的修饰符可以不相同. 方法覆盖 (1)子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致. (2)子类方法不能缩小父类方法的访问权限. (3)子类方法不能抛出比父类方法史多的异常, (4)方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间.在同一个 类中方法只能被重载,不能被扭盖。 (5)父类的静态方法不能被子类覆盖为非静态方法。 (6)子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法.在编译时,子类定义的静态方法也必须满足与方法覆盖类似的约束。 (7)父类的非静态方法不能被了类覆盖为静态方法。 (8)父类的私有方法不能被子类覆盖。 (9)父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法:二是子类重新声明父类的抽象方法。 (10)父类的非抽象方法可以被覆盖为抽象方法. 方法覆盖与方法重载的异同 方法覆盖和方法重载具有以下相同点: #都要求方法同名. #都可以用于抽象方法和非抽象方法之间. 方法筱盖和方法重载具有以下不同点: #.方法覆盖要求参数签名必须一致.而方法重载要求参数签名必须不一致.

#.方法覆盖要求返回类型必须一致,而方法重载对此不做限制. #.方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方d (包括从父类中继承而来的方法)。 #.方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这力面没有任何限制。 #.父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。 super关键字 super和this关键字都可以用来履盖Java语言的默认作用域.使被屏蔽的方法或变 盆变为可见。在以下场合会出现方法或变量被屏蔽的现象. .场合一:在一个方法内.当局部变量和类的成员变量同名,或者局部变量和父类的成员变量同名时,按照变量的作用域规则,只有局部变量在方法内可 见。 .场合二:当子类的某个方法覆盖了父类的一个方法。在子类的范围内,父类 的方法不可见. .场合三:当子类中定义了和父类同名的成员变量时,在子类的范围内,父类 的成员变量不可见。 在程序中,在以下情况下会使用super关键字: #在类的构造方法中,通过super语句调用这个类的父类的构造方法。 #在子类中访问父类的被屏蔽的方法和属性。 多态性 它是指当系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务, 而这一切对系统A是透明的. 多态的各种特性 (1)对于一个引用类型的变量,Java编译器按照它声明的类型来处理. (2)对于一个引用类型的变盆.运行时Java虚拟机按照它实际引用的对象来处理.例如以下代码虽然编译可以通过,但运行时会抛出ClassCastException运行时异常. Sub sub=new Sub();

c++实验三继承和派生类(附答案)

实验三继承和派生类 实验目的和要求 1.理解类的继承的概念,能够定义和使用类的继承关系。 2.掌握派生类的声明与定义方法。 3.熟悉公有派生和私有派生的访问特性。 4.学习虚基类在解决二义性问题中的作用。 实验内容 1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 (1) #include<> class A { public: A() { cout<<"A::A() called.\n"; } ~A() { cout<<"A::~A() called.\n"; } }; class B:public A { public: B(int i) { cout<<"B::B() called.\n"; buf=new char[i]; } ~B() { delete []buf; cout<<"B:~B() called.\n"; } private: c har *buf; }; void main() {

B b(10); } (2) #include<> class A { public: A(int a,int b):x(a),y(b) { cout<<"A constructor..."<

java 类的继承 实验报告(含代码)

实验三类的继承 实验目的:掌握类的继承、抽象类的定义和使用、对象的向上转型。实验内容:已知若干图形,求以该图形为底的锥体的体积。 实验要求:用面向抽象的思想实现 实验步骤: 1、程序总体框架 2、在shape包中创建抽象类Shape,代码如下: 3、在centrun包中创建一个类Centrun,代码如下:

Centrun这个类为核心类,在之后的代码编写中可以不做更改,getVolume函数用来求椎体的体积,即利用抽象类getArea进行适应性计算。 4、创建一个包myshape,在其中先创建一个Circle类,代码如下:

Circle是对抽象类shape的继承(记得导入shape包),在Circle类中,利用对getArea 函数代码的重写操作,具体实现了求圆的面积这一操作。【此处的具体实现应该放入该图形的具体面积求法。】 5、创建一个包Test,对以上三个包中的代码进行具体实现,代码如下: 导入myshape包,在main函数中通过向上转型,实例化shape包中的抽象类Shape,然后调用函数输出圆锥的体积。 6、在求出实验结果1,即调试好shape、myshape、centrun这三个包后,不再更改shape、centrun包,而是在myshape包下新建所需的类,如本次实验所需的三角形、矩形; 7、在myshape包下创建一个类Rectangular,代码如下:

8、在myshape包下创建一个类Triangle,需注意的是,求三角形的面积需要判断三角形的三边能否构成三角形(不能构成时返回0),代码如下:

实验结果: 1、Test测试包最终代码:

子类继承和调用父类构造方法的执行顺序

子类继承和调用父类构造方法的执行顺序 1.如果子类没有定义构造方法,则调用父类的无参数的构造方法,. 2.如果子类定义了构造方法,且其第一行没有super,则不论子类构造方法是有参数还是无参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。 若子类构造方法中第一行是有参数或无参数的super,则直接转到对应的有参或无参父类构造方法中,而不再是首先执行无参构造方法; 3.如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的构造方法,且该语句做为子类构造方法中的第一条语句。 4.如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条. 说白了:原则就是,先调用父亲的.(没有就默认调,有了就按有的调,反正只要有一个就可以了.) package test; class Father{ String s = "Run constructor method of Father"; public Father(){ System.out.println(s); } public Father(String str){ s= str; System.out.println(s); } } class Son extends Father{

String s= "Run constructor method of son"; public Son(){ //实际上在这里加上super(),和没加是一个样的 System.out.println(s); } public Son(String str){ this();//这里调用this()表示调用本类的Son(),因为Son()中有了一个super()了,所以这里不能再加了。 s = str; System.out.println(s); } public Son(String str1, String str2){ super(str1+""+str2);//因为这里已经调用了一个父类的带参数的super("---")了,所以不会再自动调用了无参数的了。 s = str1; System.out.println(s); } } public class MyClass9 { public static void main(String[] args){ 1 Father obfather1 = new Father(); 2 Father obfather2 = new Father("Hello Father"); 3 Son obson1 = new Son(); 4 Son obson2 = new Son("hello son"); 5 Son obson3 = new Son("hello son","hello father"); } } =============== 结果: 1 Run constructor method of Father

c++实验8继承与派生上机练习题

1. 定义一个哺乳动物类Mamma,l 并从中派生出一个狗类Dog,要求: ( 1) 添加Dog 类的颜色数据成员,访问属性为私有,通过函数来对颜色进行设置和获取。 ( 2) 分别为基类和派生类添加相应的构造函数(有参、无参) 测试。 class Mammal { protected: int itsAge; int itsWeight; public: int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal { // 定义Dog 类的数据成员和成员函数 }; 改: #include #include using namespace std; class Mammal { protected: int itsAge; int itsWeight; public: Mammal(); ~Mammal(); int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal {下面给出Mamma类的定义,SetColor 和GetColor 成员和析构函数,并进行

继承与派生练习题

继承与派生练习题

习题八 第八章继承与派生 1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变 )是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员) A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性 )是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。 A.派生类自己的构造函数B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 5. C++类体系中,能被派生类继承的是( B.虚函数)。 A.构造函数 B.虚函数 C.析构函数 D.友元函数 6. 设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承) A. 私有继承 B.保护继承

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