第五章 类与继承作业一
- 格式:docx
- 大小:23.72 KB
- 文档页数:3
4.1 继承练习1-继承:1)定义一个父类person,该类包含2个属性(name,age),2个方法吃饭、睡觉;2)设计两个子类Student和Teacher2)让学生类继承Person类,老师类也继承Person。
4)编写测试类Test1,测试Student类和Teacher是否继承了Person类的成员。
定义父类Person,实现继承关系,代码如下:class Person {String name;int age;void eat() {System.out.println("吃饭 ");}void sleep() {System.out.println("睡觉");}}class Student extends Person {int sid; // 学号}class Teacher extends Person {int tid; // 工号void teach() {System.out.println("老师教课");}}2、定义测试类Test1,代码如下:public class Test1{public static void main(String[] args) {Student s = new Student();s.eat();s.sleep();System.out.println("----");Teacher t = new Teacher();t.eat();t.sleep();t.teach();}}运行结果如图4-1所示。
图4-1运行结果总结:1、在Java中,多个类可以继承一个父类,但是一个类不能直接继承多个类,一个类只能有一个直接父类。
2、父类是由子类不断抽取而来的,不断地抽取就形成了体系结构,这个结构称为继承体系结构。
3、子类在继承父类的时候,会自动拥有父类所有的成员。
4、继承的好处是划分了类的层次性,实现了代码重用、扩展了程序功能。
1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。
继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。
它使得某类对象可以继承另外一类对象的特征和能力。
继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。
通过继承方式定义的子类也称为派生类。
2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。
对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。
表5.1列出了不同继承方式下基类成员访问属性的变化情况。
表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。
其余单元格内容为基类成员在派生类中的访问属性。
从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。
在同一类中私有成员和保护成员的用法完全一样。
3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。
具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。
保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。
这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。
继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。
它使得某类对象可以继承另外一类对象的特征和能力。
继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。
通过继承方式定义的子类也称为派生类。
5-2注意:(1)基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2)在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3)在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4)在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
(5)保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。
在同一类中私有成员和保护成员的用法完全一样。
5-3派生类不能直接访问基类的私有成员。
具体的实现方式有:(1)在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。
保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。
这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
这种方式的缺点是在公有派生的情况下,如果把成员设为保护访问控制,则为外界访问基类的保护段成员提供了机会,而这三种派生方式,我们经常使用的是公有派生。
(2)将需访问基类私有成员的派生类成员函数声明为基类的友元这样派生类中的其他成员函数均无权访问它,外界不可能通过派生新类来达到访问基类私有成员的目的。
5-4构造函数的执行顺序:先祖先(基类)、再客人(对象成员),后自己(派生类本身)。
析构函数的执行顺序和构造函数正好严格相反:先自己(派生类本身),再客人(对象成员),后祖先(基类)。
答案:一、单项选择题1.C 2.D 3.A 4.D 5.C6.B 7.A 8.B 9.A 10.D 二、简答题1.面向对象编程的三大特征:封装、继承和多态。
封装:通过设置访问权限等方式封装了内部实现细节,使用者只需要知道外部接口。
继承:子类可以继承父类的成员,又可以新增自己独有的成员,还可以覆盖父类的成员。
多态:同名方法可以具有不同的行为,Java中有两种意义的多态:重载和重写。
2.万物皆是对象,对象都有属性和行为。
属性是对象所拥有的状态、数据,是静态的特征;行为是对象所拥有的功能、对数据的操作,是动态的特征,可能会影响到属性。
类封装了一类对象共有的属性和行为,是对具有相同属性和行为的对象的抽象。
类是创建对象的模板,对象是类的具体实例。
3.(1)定义在类体内、方法外的变量称为成员变量。
定义在方法体内部的变量,以及方法的形式参数,是方法所临时使用的变量,称为局部变量。
(2)成员变量在整个类体中都有效。
而局部变量的有效范围仅限于定义它的方法体内,具体说明如下:①方法的形式参数:在整个方法体内有效;②方法体内独立定义的变量:在方法体中该变量定义之后的语句中有效;③选择、循环等语句块内定义的变量:只在语句块的{ }内有效。
(3)如果定义的成员变量没赋值,则系统为其提供缺省的初始值。
所以成员变量定义后就有了确定的值,就可以使用。
而方法的局部变量必须自行定义而且赋值后才能使用。
(4)类成员变量在程序加载进内存时即开辟空间,实例成员变量在创建对象时开辟空间。
局部变量只在方法调用时开辟空间,方法执行完毕后空间随即释放。
4.多个方法名字相同,但参数个数或者类型不同,称为方法重载。
方法返回值的类型和参数的名字不参与比较,方法重载是多态的一种体现。
当调用方法时,根据传入的实参个数和类型,可以区分出调用的是哪一个方法。
5.构造方法与所在类的类名完全相同,构造方法没有返回值类型,也不用void修饰。
构造方法可以重载,一个类中可以定义多个构造方法。
继承作业一、选择题1. 以下关于继承条件下构造方法执行过程的代码的执行结果是(a )。
(选择一项)class Person {public Person() {System.out.println("execute Person()");}}class Student extends Person {public Student() {System.out.println("execute Student() ");}}class PostGraduate extends Student {public PostGraduate() {System.out.println("execute PostGraduate()");}}publicclass TestInherit {publicstaticvoid main(String[] args) {new PostGraduate();}}//知识点:子类实例化过程,需要知道父类是怎么进行实例化。
A. execute Person()execute Student()execute PostGraduate()B. execute PostGraduate()C. execute PostGraduate()execute Student()execute Person()D. 没有结果输出2. 以下关于this和super关键字的说法错误的是(bd )。
(选择二项)A. this关键字指向当前对象自身,super关键字指向当前对象的直接父类B. 在main方法中可以存在this或super关键字,但不能同时存在。
C. this和super关键字都可以访问成员属性,成员方法和构造方法D. 在一个类的构造方法中可以同时使用this和super来调用其他构造方法3. 给出下面的代码段,在代码说明//assignment x=a,y=b处写入如下( d )个代码是正确的。
第五章类与对象习题一.基本概念与基础知识自测题5.1 填空题5.1.1 引入类定义的关键字是(1)。
类的成员函数通常指定为(2),类的数据成员通常指定为(3)。
指定为(4)的类成员可以在类对象所在域中的任何位置访问它们。
通常用类的(5)成员表示类的属性,用类的(6)成员表示类的操作。
答案:(1)class(2)公有的public(3)私有的private(4)公有的public(5)数据(6)函数5.1.2 类的访问限定符包括(1)、(2)和(3)。
私有数据通常由(4)函数来访问(读和写)。
这些函数统称为(5)。
答案:(1)public(公有的)(2)private(私有的)(3)protected(保护的)(4)公有的成员函数(5)类的接口5.1.3 通常在逻辑上,同一类的每个对象都有(1)代码区,用以存储成员函数。
而在物理上通常只有(2)代码区。
只有在(3)定义,并(4)的函数和加了关键字(5)的函数例外。
答案:(1)独立的(2)共用的(3)在类说明中(4)不包括循环等复杂结构(5)inline5.1.4 C++中支持三种域:(1)、(2)、(3)。
函数域被包括在(4)中,全局域被包括在(5)中。
using指示符以关键字using开头,后面是关键字(6),最后是(7)。
这样表示以后在该名字空间中所有成员都(8)。
如不使用using指示符则在使用时要加::,称为(9)运算符。
答案:(1)局部域(local scope)(2)名字空间域(namespace scope)(3)类域(class scope)(4)局部域(5)名字空间域(6)namespace(7)名字空间名(8)可以直接被使用(9)域5.1.5 引用通常用作函数的(1)和(2)。
对数组只能引用(3)不能引用(4)。
答案:(1)参数(2)返回值(3)数组元素(4)数组名本身5.1.6 构造函数的任务是(1)和(2)。
构造函数无(3),但并不表示(4)。
第五章类与继承作业一
一、填空选择题
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 Fred (intxval) {
x = xval;
}
5、(B)下面程序中类ClassDemo中定义了一个静态变量sum,分析程序段的输出结果。
classClassDemo {
public static int sum=1;
publicClassDemo()
{sum=sum+5;}
}
classClassDemoTest{
public static void main(String args[]) {
ClassDemo demo1=new ClassDemo();
ClassDemo demo2=new ClassDemo();
System.out.println(demo1.sum);
}
}
A) 0 B) 6 C) 11 D) 2
二、编程题
1、编写1个Light类,该类是对灯的描述,该类拥有:
(1)2个成员变量
watts(私有,整型);//用于存放灯的瓦数;
indicator(私有,布尔类型);//用于存放灯的开或关的状态
(2)2构造器方法
Light(int watts) //用于创建具有watts瓦的对象
Light(intwatts,boolean indicator) //用于创建具有watts瓦,开关状态为indicator的对象
(3)3成员方法
public void switchOn() //开灯,即将灯的状态置为开
public voidswitchOff() //关灯
public void printInfo() //输出灯的瓦数信息和开关状态
2、编写1个TubeLight类,该类是对管状灯的描述,它继承于Light类。
还拥有:
(1)2个成员变量
tubeLength(私有,整型) //用于存放灯管的长度
color(私有,String类型) //用于存放灯光的颜色
(2)构造器方法
TubeLight(int watts, inttubeLength,String color) //用于创建具有watts 瓦,灯管长度为tugeLength,颜色为color的对象
(3)成员方法
public void printInfo() //打印输出灯的相关信息,包括瓦数、开关信息、长度以及颜色
3、请写一个测试程序,要求:
(1)创建一个管状灯的实例对象,该灯瓦数为:32;长度为50;白色灯光,状态为开。
(2)打印输出该灯的相关信息。
public class Light{
privateint watts=0;
privateboolean indicator=false;
public Light(int watts){
this.watts=watts;
}
public Light(intwatts,Boolean indicator){
this.watts=watts;
dicator=indicator;
}
public void switchOn(){
dicator=true;
}
public void switchOff(){
dicator=false;
}
public void printInfo() {
intln("watts:" + this.watts);
intln("indicator:" + dicator);
} }
public classTubeLight{
privateinttubeLength=0;
private String color=””;
public TubeLight(int watts, inttubeLength,String color){ super(watts);
this.tubeLength=tubelength;
lor=color;
}
public void printInfo() {
intInfo();
intln("tubeLength:" + this.tubeLength);
intln("color:" + lor);
} }
public class test {
/**
* @paramargs
*/
public static void main(String[] args) {
// TEST
TubeLighttubeLight = new TubeLight(32, 50, "white");
tubeLight.switchOn();
intInfo();}。