文档库 最新最全的文档下载
当前位置:文档库 › Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序

Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序

Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序

Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序对Java对象的创建过程、成员初始化顺序(尤其是涉及到组合和继承的情况下)作一下梳理总结。

java编程思想书中第4章初始化与清理中对Java对象的创建过程总结如下:

假设有个名为Dog的类

当首次创建型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。

然后载入Dog.class(这将创建一个Class对象),有关静态初始化的动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

当你用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。

这块存储空间会被清零,这就自动地将Dog中的所有基本类型数据设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被置成了null。

执行所有出现于域定义处的初始化动作。

执行构造器。

没有涉及到继承的时候,这个过程描述已经很清晰了,那么如果涉及到继承呢,看下面一段示例代码:

Java代码

Java代码

// Mouse4j.java

package com.mouse4j.simpletest;

// 静态字段类

class StaticField {

private String s;

StaticField(String s) {

this.s = s;

System.out.println("I am static field " + s);

}

}

// 与静态字段相对的普通字段

class NormalField {

private String s;

NormalField(String s) {

this.s= s;

System.out.println("I am mormal field " + s);

}

}

// 特点类

class Characteristic {

private String s;

Characteristic(String s) {

this.s = s;

System.out.println("Creating Characteristic " + s); }

}

// 描述类

class Description {

// 注释1:在此例中如果用于组合的类中也包含static字段

// public static StaticField dStr = new StaticField("Description");

// 注释2:在此例中如果用于组合的类中也包含在域定义处初始化

// private NormalField dStr1 = new NormalField("Description");

private String s;

Description(String s) {

this.s = s;

System.out.println("Creating Description " + s);

}

}

class Animal {

public static StaticField AnimalStr = new StaticField("Animal");

private Characteristic c = new Characteristic("Animal Characteristic"); private Description d = new Description("Animal Description");

Animal() {

System.out.println("Animal()");

}

}

class Mouse extends Animal{

public static StaticField MouseStr = new StaticField("Mouse");

private Characteristic c = new Characteristic("Mouse Characteristic"); private Description d = new Description("Mouse Description");

Mouse() {

System.out.println("Mouse()");

}

}

public class Mouse4j extends Mouse{

public static StaticField Mouse4jStr = new StaticField("Mouse4j");

private Characteristic c = new Characteristic("Mouse4j Characteristic"); private Description d = new Description("Mouse4j Description");

Mouse4j() {

System.out.println("Mouse4j()");

}

public static void main(String[] args) {

new Mouse4j();

}

}

程序执行输出如下:

Console 写道

Java代码

I am static field Animal

I am static field Mouse

I am static field Mouse4j

Creating Characteristic Animal Characteristic Creating Description Animal Description Animal()

Creating Characteristic Mouse Characteristic Creating Description Mouse Description Mouse()

Creating Characteristic Mouse4j Characteristic Creating Description Mouse4j Description Mouse4j()

从程序输出可以看出:

当首次创建型为Mouse4j的对象时,Java解释器查找类路径,定位Mouse4j.class文件。Java解释器会根据Mouse4j.class定位其基类Mouse.class、再根据Mouse.class定位到基类Animal.class文件,有关静态初始化的动作从基类到子类依次执行。

当你用new Mouse4j()创建对象的时候,首先将在堆上为Mouse4j对象(包括其基类Mouse和Animal中的域)分配足够的存储空间。

这块存储空间会被清零,这就自动地将Mouse4j中的所有基本类型数据(包括其基类Mouse和Animal中的)设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用(包括其基类Mouse和Animal中的)则被置成了null。

执行基类Animal中所有出现于域定义处的初始化动作。

执行基类Animal构造器。

执行基类Mouse中所有出现于域定义处的初始化动作。

执行基类Mouse构造器。

执行子类Mouse4j中所有出现于域定义处的初始化动作。

执行子类Mouse4j构造器。

第5~10步过程总结如下:

在为所创建对象的存储空间清零后,找到继承链中最上层的基类,执行a、b两步:

a.执行其出现在域定义处的初始化动作

b.然后再执行其构造器

然后从基类到子类依次执行这两步操作。

到这里,涉及到继承Java对象创建过程和成员初始化顺序就理清楚了~(《编程思想》中关于这一点的描述让我有点晕~还是用程序实践一下思路会比较清晰)

再看组合的情况,将程序代码中的注释1和注释2去掉,考虑用于组合的类Description 中也包含static字段和在域定义处初始化的情况,程序执行结果如下:

Console 写道

Java代码

I am static field Animal

I am static field Mouse

I am static field Mouse4j

Creating Characteristic Animal Characteristic

I am static field Description

I am mormal field Description

Creating Description Animal Description

Animal()

Creating Characteristic Mouse Characteristic

I am mormal field Description

Creating Description Mouse Description

Mouse()

Creating Characteristic Mouse4j Characteristic

I am mormal field Description

Creating Description Mouse4j Description

Mouse4j()

可见Description对象的创建过程与成员初始化顺序与本文开头的Dog对象的例子一致

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

C++程序设计复习题及参考答案

《C++程序设计》课程复习资料 一、单项选择题: 1.下列字符串中可以用作C++标识符的是[ ] -ld 2.定义变量int a=6,则a++的值是[ ] .6 C 3.已知字母A的ASCII码为65,则表示字符常量A 错误的是[ ] A. '\101' B. '\x41' C. 65 D.“A” 4.结构化程序由三种基本结构组成,不包括[ ] A.顺序结构 B.选择结构 C.控制结构 D.循环结构 5.己知有定义: const int D 5; int i=1; double f=; char c=15; 则下列选项错误的是[ ] A.++i; B. D--; C. c++; D. --f; 6.若有定义为“int *r =new int [10];”,则释放指针所指内存空间的操作是[ ] A. delete [ ]r; B. delete *r C. delete r; D. delete r[ ]; 7.下列哪个是C++语言的不正确的标识符[ ] B. Ab1 C. bgc D. int 8.下列哪个是C++语言的合法的字符常量[ ] A. ”\0” B. '054' C. '\x89' D. '\092' 9.定义整型变量x,y,z并赋初始值6的正确语句是[ ] A. int x=y=z=6; B. int x=6,y=6,z=6; C. x=y=z=6; D. int x,y,z=6; 10.用C++语言编写的代码程序[ ] A.可立即执行 B.是一个源程序 C.经过编译即可执行 D.经过解释才能执行 11.将两个字符串连接起来组成一个字符串时,选用的函数是[ ] A. strlen () B. strcpy () C. strcat () D. strcmp () 12.在程序中,预处理命令开头的字符都是[ ] A. * B. # C. & D. @ 13.在C++语言中,表示一条语句结束的符号是[ ] A. “#” B. “;” C. “}” D. “下面的循环语句中循环体执行的次数为 [ ] for(int i=0; in/2) break; 2 2+1 C.n/2-1 15.在下面的一维数组定义中,有语法错误的语句是[ ] A. int a[ ]={1,2,3}; B. int a[10]={0}; C. int a[ ]; D. int a[5]; 16.下面的保留字中,不能作为函数的返回类型[ ] A. void B. int C. new D. long 17.下面的函数声明中,“void BC(int a, int b);”的重载函数是[ ] A. int BC(int x, int y); B. void BC(int a, char b); C. float BC(int a, int b, int c=0); D. int BC(int a, int b=0); 18.假定AB为一个类,则该类的复制构造函数的声明语句为[ ] A. AB&(AB x); B. AB(AB x); C. AB(AB* x); D. AB(AB&);

java继承与接口实验三

信息与计算科学专业实验报告 课程名称Java课程设计总实验学时: 16 第3 次共6 次 实验项目名称继承与接口本次实验学时数: 3 实验类 型 验证 日期20 12 年 3 月6 日星期二年级 学生姓名学号课任教师 1.实验目的 巩固如下概念:子类的继承性、子类对象的创建过程、成员变量的继承与隐藏、方法的继承与重写;掌握上转型对象的使用;掌握接口回调技术。 2.实验要求 实验前,应事先熟悉相关知识点,拟出相应的实验操作步骤,明确实验目的和要求;实验过程中,服从实验指导教师安排,遵守实验室的各项规章制度,爱护实验仪器设备;实验操作完成后,认真书写实验报告,总结实验经验,分析实验过程中出现的问题。 3.实验内容 1、继承 编写一个Java应用程序,除主类外,该程序中还有4个类:People、ChinaPeople、AmericanPeople和BeijingPeople类。要求如下:People类有访问权限是protected的double 型成员变量:height和weight,以及public void speakHello()、public void averageHeight()、public void averageWeight()方法;ChinaPeople类是People的子类,新增了public void chinaGongfu()方法。要求ChinaPeople重写父类的public void speakHello()、public void averageHeight()、public void averageWeight()方法;AmericanPeople类是People的子类,新增public void americanBoxing()方法。要求AmericanPeople重写父类的public void speakHello()、public void averageHeight()、public void averageWeight()方法;BeijingPeople类是ChinaPeople的子类,新增public void beijingOpera()方法。要求BeijingPeople重写父类的public void speakHello()、public void averageHeight()、public void averageWeight()方法;请按模板要求,将【代码】替换为Java程序代码。 2、上转型对象 编写一个Java应用程序,要求有一个abstract类,类名为Employee。Employee的子类有YearWorker、MonthWorker和WeekWorker。YearWorker对象按年领取薪水,MonthWorker按月领取薪水,WeekWorker按周领取薪水。Employee类有一个abstract方法:public abstract double earnings(); 子类必须重写父类的earnings()方法,给出各自领取报酬的具体方式。有一个

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# 类的初始化顺序 继承类的static数据成员的初始化器, 继承类的static构造器 (在类名, 第一次被引用时, 调用, 如果, 没有这个构造器, 则static数据成员何时被初始化, 是不可预测的) 继承类的实例型数据成员的初始化器 在执行继承类的构造器的内容之前; 基类的static数据成员的初始化器即 static int a = 1; /// 类数据成员的定义 基类的static 构造器 ,(如果,基类的类名, 先于继承类被引用, 则先执行基类的static构造器) 基类的实例型数据成员的初始化器 基类的构造器 接着执行继承类的构造器的内容; Example : public class Base { A: private static int Number = 12; B: private int localNumner = 1; C: static Base() { /// } D: public Base() { } }

public class Child : Base { E: private static int ChildNumber = 14; F: private int local_child_number = 7; G: static Child() { /// } H: public Child() { I: /// } } Child child = new Child(); 初始化顺序为 E G F H A C B D I; static构造器的调用时刻是, 第一次引用该类的类名; public class Test { static Test() { } public staitc int Account { get { return 1; } } /// 只是举例 public static int GetAccount() { return 1;

C类构造函数初始化列表

类构造函数初始化列表 初始化列表地定义在使用编程地过程当中,常常需要对类成员进行初始化,通常地方法有两种:一种是构造函数内对类地成员赋值,一种则是使用初始化列表地构造函数显式地初始化类地成员. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔地数据成员列表,每个数据成员后面跟一个放在括号中地初始化式.例如:{ : ; ; 构造函数初始化列表(): ()() {} 构造函数内部赋值() { ; ; } }; 从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别.第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑初始化列表地必要性初始化和赋值对内置类型地成员没有什么大地区别,像上面地任一个构造函数都可以.但在一些情况下,初始化列表可以做到构造函数做不到地事情: 、类里面有类型地成员,它是不能被赋值地,所以需要在初始化列表里面初始化它; 、引用类型地成员(也就是名字成员,它作为一个现有名字地别名),也是需要在初始化列表里面初始化地,目地是为了生成了一个其名字成员在类外可以被修改而在内部是只读地对象;

、需要调用基类地构造函数,且此基类构造函数是有参数地; 、类里面有其他类类型地成员,且这个“其他类”地构造函数是有参数地. 举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数地构造函数. { : ( ) { ... } }; 因为有一个显式声明地构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建地一个实例. * ; 出错!! * (); 如果是另一个类地成员,你怎样初始化它呢?答案是你必须使用成员初始化列表. { ; : (); }; 必须使用初始化列表来初始化成员 () : () {……} 没有其它办法将参数传递给. 情况和其实一样地道理.如果成员是一个常量对象或者引用也是一样.根据地规则,常量对象和引用不能被赋值,它们只能被初始化. 初始化列表与构造函数赋值地效率比较首先把数据成员按类型分类并分情况说明: .内置数据类型,复合类型(指针,引用) 在成员初始化列表和构造函数体内进行,两者在性能和结果上都是一样地 .用户定义类型(类类型) 两者在结果上相同,但是性能上存在很大地差别. 因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以对于用户自定义类型(类),在初始化列表中只会调用类地构造函数,在构造函数体中赋值就会先调用一次类地构造函数,然后再调用一次类地赋值操作符函数. 显然后者在性能上有所损失,特别对于构造函数和赋值操作符都需要分配内存空间地情况,使用初始化列表,就可以避免不必要地多次内存分配. 举个例子:假定你有一个类具有一个类型地成员,你想把它初始化为" .".你有两种选择: 、使用构造函数赋值()

数据结构实验

实验1:顺序表基本操作 一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表 的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集 等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.编写程序实现顺序表的下列基本操作: (1)初始化顺序表La。 (2)将La置为空表。 (3)销毁La。 (4)在La中插入一个新的元素。 (5)删除La中的某一元素。 (6)在La中查找某元素,若找到,则返回它在La中第一次出现的位置, 否则返回0。 (7)打印输出La中的元素值。 2.编写程序完成下面的操作: (1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。 (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用 union_Sq操作实现A=A∪B。 四、思考与提高 假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B ? 实验2:单链表基本操作 一、实验目的 1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二、实验要求

1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La中第i个元素之前插入一个新结点。 (3)删除La中的第i个元素结点。 (4)在La中查找某结点并返回其位置。 (5)打印输出La中的结点元素值。 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。 3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。 (即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。) 四、思考与提高 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点? 实验3:循环队列基本操作 一、实验目的 1.熟悉并能实现循环队列的定义和基本操作。 2.了解用队列解决实际应用问题。 二、实验要求 1.进行队列的基本操作时要注意队列“先进先出”的特性。 2.复习关于队列操作的基础知识。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容 1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。

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.wendangku.net/doc/e06639493.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

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测试包最终代码:

java题

二、编写程序题 1、按以下要求编写程序 (1) 创建一个Rectangle类,添加width和height两个成员变量 (2) 在Rectangle中添加两种方法分别计算矩形的周长和面积 (3) 编程利用Rectangle输出一个矩形的周长和面积 public class Rectangle{ double width; double length; public Rectangle(){ this.width=width; this.length=length; } public double zhouzhang(){ return (width+length)*2; } public double mianji(){ return width*length; } public static void main(String[] args){ Rectangle R=new Rectangle(); System.out.println("周长为:"+R.zhouzhang()); System.out.println("面积为:"+R.mianji()); } } 运行结果: 周长为:0.0 面积为:0.0 2、按以下要求编写程序 (1) 编写Animal接口,接口中声明run() 方法 (2) 定义Bird类和Fish类实现Animal接口 (3) 编写Bird类和Fish类的测试程序,并调用其中的run()方法 3、设计类A和A的派生类B,要求: 1)A有两个数据成员a和b(都为int型);B中继承了A中的a和b,又定义了自己的数据成员c(int型)。 2)为A添加含有两个参数的构造方法,对a和b初始化。 3)为B添加含有一个参数的构造方法,对c初始化。 4)完成主控方法,在主控方法中用B e1=new B 5)创建对象,把a、b、c分别初始化成3、4、5,最后输出它们的和。 三、简答题

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:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?

(完整版)C++复习题

复习题 一、选择填空 1.在下列关键字中,用来说明类中公有成员的是( )。 A. Public B. Private C. protected D. friend 答:A。 2.下列的各种函数中,( )不是类的成员函数。 A.构造函数 B.析构函数 C.友元函数 D.拷贝初始化构造函数答:C。 3.作用域运算符的功能是( )。 A.标识作用域的级别的 B.指出作用域的范围的 C.给定作用域的大小的 D.标识某个成员是属于哪个类的 答:D。 4.( )是不可以作为该类的成员的。 A.自身类对象的指针 B.自身类的对象 C.自身类对象的引用 D.另一个类的对象 答:B。 5.( )不是构造函数的特征。 A.构造函数的函数名与类名相同 B.构造函数可以重载 C.构造函数可以设置默认参数 D.构造函数必须指定类型说明 答:D。 6.( )是析构函数的特征。 A.一个类中只能定义一个析构函数 B.析构函数名与类名不同 C.析构函数的定义只能在类体内 D.析构函数可以有一个或多个参数 答:A。 7.通常的拷贝初始化构造函数的参数是( )。 A.某个对象名 B.某个对象的成员名 C.某个对象的引用名 D.某个对象的指针名 答:C。 8.关于成员函数特征的下述描述中,( )是错误的。 A.成员函数一定是内联函数 B.成员函数可以重载 C.成员函数可以设置参数的默认值 D.成员函数可以是静态的

答:A。 9.下述静态数据成员的特性中,( )是错误的。 A.说明静态数据成员时前边要加修饰符static B.静态数据成员要在类体外进行初始化 c.引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算 符 D.静态数据成员不是所有对象所共用的 答:D。 l0.友元的作用( )。 A.提高程序的运用效率 B.加强类的封装性 C.实现数据的隐藏性 D.增加成员函数的种类 答:A。 11.下列关于对象数组的描述中,( )是错误的。 A.对象数组的下标是从0开始的 B.对象数组的数组名是一个常量指针 C.对象数组的每个元素是同一个类的对象 D.对象数组只能赋初值,而不能被赋值 答案:D。 12.下列定义中,( )是定义指向数组的指针P。 A. int*p[5]; B. int(*p)[5]; C. (int *)p[5] D. int*p[]; 答案:B。 13.下列说明中 Const char * Ptr; ptr应该是( )。 A.指向字符常量的指针 B.指向字符的常量指针 C.指向字符串常量的指针 D.指向字符串的常量指针 答案:C。 14.已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中是正确的。 A. void print()const ; B. const void Print( ); C. void const print( ); D. void print (const); 答案:A。 15.关于new运算符的下列描述中,( )是错的。 A.它可以用来动态创建对象和对象数组 B.使用它创建的对象或对象数组,可以使用运算符delete删除

java继承与接口 实验报告

应用数学学院信息与计算科学专业 2 班学号3111008162 姓名许庆平教师评定_________________ 实验题目继承与接口 一、实验目的与要求 实验目的: 1、掌握类的继承关系。 2、掌握接口的定义与使用。 实验要求: 按下列要求编写Java程序: 1、定义接口Printx,其中包括一个方法printMyWay(),这个方法没有形参,返回值为空。 2、编写矩形类,矩形类要求实现Printx接口,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。 3、编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。 二、实验方案 先按要求定义接口Printx,再创建一个矩形类Rectangle,有成员变量length 和width,area()求面积,circle()求周长,用PrintMyWay()显示。 然后定义正方形类,继承Rectangle类,定义求对角线长的函数duijiaoxian()。面积和周长用父类中的area()和circle()实现。用PrintMyWay()显示。最后在主类中实现这两个类。 三、代码如下 interface Printx

{ void PrintMyWay();} class Rectangle implements Printx { int length,width; Rectangle(int x,int y){ length=x; width=y; } int area(){ return length*width; } int circle(){ return 2*(length+width); } public void PrintMyWay(){ System.out.println("矩形的长为:"+length); System.out.println("矩形的宽为:"+width); System.out.println("矩形的面积为:"+area()); System.out.println("矩形的周长为:"+circle()); }

C++类构造函数初始化列表

C++类构造函数初始化列表 初始化列表的定义 在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:一种是构造函数内对类的成员赋值,一种则是使用初始化列表的构造函数显式的初始化类的成员。 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } }; 从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑

初始化列表的必要性 初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但在一些情况下,初始化列表可以做到构造函数做不到的事情: 1、类里面有const类型的成员,它是不能被赋值的,所以需要在初始化列表里面初始化它; 2、引用类型的成员(也就是名字成员,它作为一个现有名字的别名),也是需要在初始化列表里面初始化的,目的是为了生成了一个其名字成员在类外可以被修改而在内部是只读的对象; 3、需要调用基类的构造函数,且此基类构造函数是有参数的; 4、类里面有其他类类型的成员,且这个“其他类”的构造函数是有参数的。 举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。 classCExampleOld { public: CExampleOld(int x) { ... } }; 因为CExampleOld有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建CExampleOld的一个实例。 CExampleOld* pEO = new CExampleOld; // 出错!! CExampleOld* pEO = new CExampleOld(2); // OK 如果CExampleOld是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。class CExampleNew { CExampleOldm_EO; public: CExampleNew(); }; // 必须使用初始化列表来初始化成员m_EO //CExampleNew::CExampleNew() : m_EO(2) {……} 没有其它办法将参数传递给m_EO。 情况3和4其实一样的道理。如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。

在UML中表示Java继承和接口

在UML中表示Java继承和接口 作者:仙人掌工作室本文选自:赛迪网 在上一篇文章中,我们引入了UML类图的概念,比较了在Java编程语言和UML类图中表示类、属性、操作和关联关系的不同之处。下面我们来看看如何在UML中表示两个重要的Java概念——继承,接口。 继承 在Java中,我们可以声明一个类扩展(extends)另一个类,还可以声明一个类实现(implements)一个或者多个接口。下面我们来看看如何在UML中表达这些概念。 下面是三个Java类的基本骨架。第一个类是代表某种支付方式的Payment抽象类,另外两个类分别扩展Payment 类,描述两种不同的支付方式:

图一用UML显示了同样的三个类。在操作和属性声明中,类型和参数之类的细节都没有显示出来,这是为了更

清楚地显示出类的整体结构以及各个类之间的关系。 图一:UML一般化关系 Java中的extends关键词声明了继承关系,相当于UML中的“一般化”(Generalization,也译为“泛化”)关系,在UML图形中用子类向超类的实线空心封闭箭头表示。图一额外增加了一个Sale类,这是为了更清楚地说明UML一般化关系与UML定向关联关系所用箭头的不同。关联关系与一般化关系的另一个不同之处在于,一般化关系的两端不需要说明多重性或角色名称。 显然,UML类图比三个Java源代码文件更清楚直观地显示出了三个类之间的继承关系。如果你要与别人探讨设计思路,绘制UML草图也要比直接使用代码简单快捷得多。 也许有人会说,系统的类结构图就在他们的头脑中,他们只需要直接使用Java代码。实际上,对于规模较大的系统,这种说法显然是不成立的;即使对于规模较小的系统,如果一定的时间之后要由其他程序员修改,没有UML图也会寸步难行——很难保证每一个人都了解你头脑中的类结构图。 在UML中,抽象类的标志是类的名字以斜体显示。在白板或纸张上手工画UML草图时,很难区分字体是否是斜体。为此,一些人建议这些场合可以在类名称的右下角加上{abstract}标记以示区别。 另一些人认为,在白板上写{abstrac t}显得太罗嗦,他们倾向于打破UML常规,在类名称的右下角加上一个0表示零个实例,如果在该位置写上1,则表示该类是一个singleton类(永远只有一个实例的类);如果在该位置写上N,则表示它是一个枚举类(拥有固定实例数量的类,如一星期中的天数,彩虹的颜色,等等)。不过,这一切都不是标准的UML,只能用于手工绘制UML图的场合,看来也不可能得到UML建模工具的支持。 历史知识:UML首先由Rational公司的一个工作组发明,Ration公司是UML建模工具Rose的生产者。UML于1995年的OOPSLA会议上被公诸于世,随后,OMG(对象管理组织)于1997年采用了UML规范。不难理解,继

JAVA继承类求几何图形面积周长代码

class shap2D { static double getArea; //面积 static double getPerimeter; //周长 } class circle extends shap2D { double r; double getRadius(){return r=2;} double getArea() {return Math.PI*r*r;} double getPerimeter() {return 2*Math.PI*r;} public String toString() { String s; return s="周长:"+getPerimeter()+"面积:"+getArea(); } } class Triangle extends circle { double a,b,c; Triangle (double x,double y,double z) {a=x; b=y;c=z;} void setA(double x){a=x;} double getA(){return a;} public double getPerimeter() {return a+b+c;} public double getArea() { double s=(a+b+c)/2; return Math.sqrt(s*(s-a)*(s-b)*(s-c)); } public boolean isTriangle() { boolean flag=false; if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&c+b>a) flag=true; return flag; } } class rectangle extends circle { double a,b;

软件开发一系列按照特定顺序组织的计算机数据和指令的集

软件开发:一系列按照特定顺序组织的计算机数据和指令的集合。 系统:DOS、windows Linux 应用软件:扫雷、QQ 实现了人与计算机间更好的交互 交互方式:图形化界面、命令行方式 Dos常见的命令行: SUN(Stanford University Network)斯坦福大学网络公司 JEE企业版(Servlet JSP等)是开发企业环境下的应用程序提供的一套解决方案,主要针对WEb应用程序开发 JSE标准版是为开发普通桌面和商务应用程序 JME小型版开发电子产品和嵌入式设备 跨平台性:通过JA V A语言编写的应用程序在不同的系统平台上都可以应用 原理:在要运行的java应用程序的操作系统上,先安装一个java虚拟机(jvm java virtual machine)有JVM来负责JA V A程序在该系统中的运行。 JA V A语言的环境搭建: JRE:RUNTIME ENVIRONMENT java运行环境和java程序所需的核心类库等 JDK:java开发工具包(DEVELOPMENT KIT)提供java开发人员使用的,包含了java的开发工具包,也包含了JRE (javac 编译工具)(jar 打包工具) 电脑、属性、高级、环境变量、Path:将要执行的Javac路径放置在或者说告诉windows。Path=D:\Java\jdk1.6.0_21\bin; haha不好听没有意义:改为JA V A_HOME Haha=D:\Java\jdk1.6.0_21; Path=%Haha%\bin; 临时配置方式:set可以查看或者配置环境变量 Dos只在当前窗口有效。Set path =D:\Java\jdk1.6.0_21\bin;就可以了 在path的基础上再加上新的目录,Set path =D:\Java\jdk1.6.0_21\bin;%Path% start开一个新窗口,沿袭前者的配置。 Hello world :public class Demo,此时类名必须和源文件名称相同,比如123.java、Demo.class,若此时的Demo为Public时源文件必须为Demo.java Set classpath= ;此时什么都没有写的话,就是对环境变量的清空。告诉java去哪找需要加载的类文件。 问题:环境变量path和classpath的作用是什么? 答:.PA TH变量用于列出可执行文件的搜索路径.因为要通过命令行的命令启JA V A,JA V AC等编译工具和解释工具,系统必须要知道他们所在位置,而PA TH则指明了其位置. CLASSPATH变量用于JA V A加载类的路径.只有在classpath设置的路径中的类才能被加载. 注释:******************虚拟机在启动的时候先找的是环境变量classpath **************

相关文档
相关文档 最新文档