java中方法的继承

java中方法的继承
java中方法的继承

ava中方法的继承,覆盖

(2011-01-17 02:13:42)转载▼

标签:杂

首先要明确一点,子类在继承父类时,构造函数是不能被继承的。当创建子类的实例时,子类的构造函数要调用父类的构造函数,也就是说父类要先于子类构造。子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。当父类中没有定义任何构造函数时,编译器就会为它指定一个参数为空的默认的构造函数;如果父类中定义了构造函数,那么编译器就不会为它指定一个参数为空的默认构造函数了。因此,如果某个类有可能成为其他类的父类,为了避免发生不必要的编译错误,最好为它编写一个参数为空的构造函数。父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类Sub 中也没有定义构造函数,编译程序也会为它指定一个参数为空的默认的构造函数,并且会在这个默认的构造函数中调用父类的参数为空的构造函数。

public class Sub extends Sup{

//子类中没有定义构造函数

public static void main(String args[]){

Sub sub=new Sub();

}

}

class Sup{

//父类中没有定义构造函数

}

父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类定义了一个带整型参数的构造函数,在这个构造函数中子类没有显式调用父类的构造函数,所以编译器为在它里面调用父类中参数为空的构造函数。

public class Sub extends Sup{

//子类中定义类一个带整型变量参数的构造函数

public Sub(int i){

//

}

public static void main(String args[]){

Sub sub=new Sub(1);

}

}

class Sup{

//父类中没有定义构造函数

}

父类中定义了一个带整型参数的构造函数,因此编译器不再为它指定参数为空的默认的构造函数。子类中也定义了一个带整型参数的构造函数。编译时,编译器将试图在子类的构造函数中调用父类的参数为空的构造函数,但是父类中没有定义参数为空的构造函数,所以编译程序将会报

错。排错的方法时在子类的构造函数中显示调用父类的构造函数,或者在父类中添加一个带空参数的构造函数。

public class Sub extends Sup{

//子类中定义类一个带整型变量参数的构造函数

public Sub(int i){

//

}

public static void main(String args[]){

Sub sub=new Sub(1);

}

}

class Sup{

//父类中定义了一个带整型参数的构造函数

public Sup(int i){

//

}

}

public class Sub extends Sup{

//子类中定义类一个带整型变量参数的构造函数

public Sub(int i){

super(i);//调用父类中的构造函数

}

public static void main(String args[]){

Sub sub=new Sub(1);

}

}

class Sup{

//父类中定义了一个带整型参数的构造函数

public Sup(int i){

//

}

}

排错方法2:

public class Sub extends Sup{

//子类中定义类一个带整型变量参数的构造函数

public Sub(int i){

//

}

public static void main(String args[]){

Sub sub=new Sub(1);

}

}

class Sup{

//父类中定义了一个带整型参数的构造函数

public Sup(int i){

//

}

//定义一个带空参数的构造函数

public Sup(){

//

}

}

类方法和实例方法在继承过程中的问题:

overiding 重写父子类相同方法名,返回值,参数类型

如果子类的实例方法和父类的实例方法具有相同的标记,子类的方法将覆盖父类的方法。但是如果子类的方法和父类的方法具有相同的标记,但是具有不同的返回值类型,编译程序将会报错。排错的方法是修改子类中这个方法的返回值类型,使它父类中相同标记的方法的返回值一样。public class Sub extends Sup{

//子类中的这个方法父类中的方法有相同的标记,

//但返回值不同,编译程序就会报错

int test(){

return 1;

}

}

class Sup{

void test(){

//

}

}

排错:

public class Sub extends Sup{

//子类中的方法正确覆盖了父类中的方法

void test(){

//

}

}

class Sup{

void test(){

//

}

}

同样如果子类的类方法和父类的类方法具有相同的标记,那么子类的类方法将隐藏父类的类方法。注意这里不叫覆盖,而叫隐藏,两者的区别将在后面讨论。同样,如果子类的类方法和父类的类方法具有相同的标记和不同的返回值,编译程序也会报错。解决的问题的方法同实例方法一

实例方法不能覆盖类方法(编译时报错):

public class Sub extends Sup{

//实例方法不能覆盖类方法,编译时报错

void test(){

//

}

}

class Sup{

static void test(){

//

}

}

类方法不能隐藏实例方法(编译时报错): public class Sub extends Sup{

//类方法不能隐藏实例方法,编译时报错

static void test(){

//

}

}

class Sup{

void test(){

//

}

}

覆盖和隐藏的区别。对于隐藏的方法,运行时系统调用当前对象引用的编译时类型中定义的方法;对于覆盖的方法,运行时系统调用当前对象引用运行时类型中定义的方法。一个是调用编译时类型中定义的方法,一个是调用运行时类型中定义的方法。通过下面这个例子可以直观的看出两者之间的差别。

class Planet {

public static void hide() {

System.out.println("The hide method in Planet.");

}

public void override() {

System.out.println("The override method in Planet.");

}

}

class Earth extends Planet {

public static void hide() {

System.out.println("The hide method in Earth.");

}

public void override() {

System.out.println("The override method in Earth.");

public static void main(String args[]) {

Earth earth = new Earth();

Planet planet = (Planet) earth;

planet.hide(); // result:"The hide method in Planet."

planet.override(); // result:"The override method in Earth."

}

}

(1)子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和

返回类型一致。例如以下代码将导致编译错误。

public class Base{

public void method(){…}

}

public class Sub extends Base{

public int method(){//编译错误,返回类型不一致

return 0;

}

}

Java编译器首先判断Sub类的method()方法与Base类的method()方法的参数名,由于两者一致,因此Java编译器认为Sub类的method()方法试图覆盖父类的方法,既然如此,Sub类的method()方法就必须和被覆盖的方法具有相同的返同类型。

以下代码中子类覆盖了父类的一个方法,然后又定义了一个重载方法,这是合法的。public class Base{

public void method(){…}

}

public class Sub entends Base{

public void method(){…} //覆盖Base类的method()方法

public int method(int a){ //重载method()方法

return 0;

}

}

(2)子类方法不能缩小父类方法的访问权限。例如以下代码中子类的method()方法是私有的,父类的method()方法是公共的,子类缩小了父类方法的防问权限,这是无效的方法覆盖,将导致编译错误。但可以放大。

public class Base{

public void method(){…}

}

public class Sub extends Base{

private void method(){…}//编译错误,子类方法缩小了父类方法的访问权限

}

public class Base{

void method(){…}

}

public class Sub extends Base{

public void method(){…}//这是可以的。

}

(3)子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常是父类方法抛出的异常类的子类。

(4)方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖

(5)父类的静态方法不能被子类覆盖为非静态方法。

(6)子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。在编译时,子类定义的静态方法也必须满足与方法覆盖类似的约束:方法的参数名一致,返回类型一致,不能缩小父类方法的访问权限,不能抛出更多的异常。

(7) 父类的非静态方法不能被子类覆盖为静态方法。

(8)父类的私有方法不能被子类覆盖。

(9)父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。

(10)父类的非抽象方法方法可被覆盖为抽象方法。

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

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("战斗机移动!!!");

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.360docs.net/doc/b99622186.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中继承的相关知识总结

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

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()); }

在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;

JAVA继承、抽象类、接口

JA V A继承、抽象类、接口 编辑人:星辰·樱 联系QQ:838826112 一.类的继承 通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。一个父类可以拥有多个子类,但一个类只能有一个直接父类,这是因为JA V A语言中不支多重继承。 子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量或成员方法。 JA V A语言中有一个名为https://www.360docs.net/doc/b99622186.html,ng.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。 1.子类的创建 类的继承是通过extends关键字来实现的,在定义类时若使用ectends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。新定义的类称为子类,它可以从父类那里继承所有非private的成员作为自己的成员。 子类的创建: * 格式:class SubClass extends SuperClass * { * . * . * . * } 2.调用父类中特定的构造方法 在没有明确地指定构造方法时,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。在子类的构造方法中可以通过super()来调用父类特定的构造方法。 例://以Person作为父类,创建学生子类Student,并在子类中调用父类里某指定的构造方法。 class Person2 { private String name; private int age;

public Person2()//定义Person2类的无参构造方法 { System.out.println("调用了Person2类的无参构造方法"); } public Person2(String name,int age)//定义Person2类的有参构造方法 { System.out.println("调用了Person2类的有参构造方法"); https://www.360docs.net/doc/b99622186.html,=name; this.age=age; } public void show() { System.out.println("姓名:"+name+" 年龄:"+age); } } class Student2extends Person2//定义继承自Person2类的子类Student2 { private String department; public Student2()//定义Student2类的无参构造方法 { System.out.println("调用了学生类的无参构造方法Student2()"); } public Student2(String name,int age,String dep)//定义Student2类的有参构造方法 { super(name,age);//调用父类的胡参构造方法 department=dep; System.out.println("我是"+department+"学生"); System.out.println("调用了学生类的有参构造方法Student2(String name,int age,String dep)"); } } public class App8_2 { public static void main(String[] args) { Student2 stu1=new Student2();//创建对象,并调用无参构造方法 Student2 stu2=new Student2("李小四",23,"信息系");//创建对象并调用有参构造方法 stu1.show(); stu2.show(); } } /*在子类中访问你类的构造方法,其格式为super(参数列表)。

Java实验3 继承与接口

实验3 继承与接口 [实验目的] 1、掌握java 继承中父类及其子类的定义方法。 2、掌握子类重写父类同名方法的方法。 3、掌握接口的用法。 [实验要求] 1、复习理论教学中所学的内容。 2、认真进行实验预习,查阅参考书,书写源程序,书写实验预习报告。 3、认真总结实验并书写实验报告。 [实验课时] 2学时 [实验教学方式] 学生上机实验,教师随堂指导。 [实验内容] 1、定义父类People,分别定义People类的子类ChinaPeople,AmericanPeople和BeijingPeople 并分别重写父类中的各个方法。最后在主方法中分别创建各子类的对象并调用各自的方法打印输出信息。该程序的模板代码如下:请将其补充完整并调试运行。 class People { protected double weight,height; public void speakHello() { System.out.println("yayawawa"); } public void averageHeight() { height=173; System.out.println("average height:"+height); } public void averageWeight() { weight=70; System.out.println("average weight:"+weight); } } class ChinaPeople extends People { 【代码1】 //重写public void speakHello()方法,要求输出类似“你好,吃了吗”这样的 //汉语信息 【代码2】 //重写public void averageHeight()方法,要求输出类似

java练习题-继承

一.extends和super的使用和方法的重写 1.定义一个人的类(属性有名字,年龄。写一个能输出各个属性值 的方法showInfo()),定义一个学生类(属性有性别),学生继承人类 要求:(1)父类的属性赋值用构造方法来实现(分别用有参数构造方法和无参数构造方法实现) (2)子类的属性也用构造方法来赋值。 (3)在子类中重写父类的showInfo()方法 (4)声明学生类的对象,调用学生的显示信息的方法。 2 定义Animal父类,含有属性name,sex,age,方法sleep,run,编写一个子类Person,继承Animal类,然后调用父类的属性和方法二. 1、试编写三个具有继承关系的类,A、B、C(B继承A,C继承B)。 要求A中包含方法a1()、a2(),B类中的方法b1()访问了a1() 和a2(),C类中的方法c1()访问了a1()、a2()、b1()。 提示:(a1(),a2(),b1(),c1()这些方法体除了实现题目要求之外,其余内容可以任意编写。) 2、请编码实现动物世界的继承关系: 动物(Animal)具有行为:吃(eat)、睡觉(sleep) 动物包括:兔子(Rabbit),老虎(Tiger) 这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡

觉的行为是一致的。 请通过继承实现以上需求,并编写测试类AnimalTest进行测试。3、父类Person 包含like()方法子类Son 重写父类方法并打印输出 4、(选做)父类Employee 属性:name、sex ,带一个构造方法Employee(String n, char s) 子类Worker继承自Employee 属性:char category;法()可以调用父类 的所有非私有方法 B) super()可以调用父类的所有非私有构造函数 C) super.属性可以调用父类的所有非私有属性 D) this和super关键字可以出现在同一个构造函数中 8.以下关于final关键字说法错误的是(A,C)(两项) A) final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性 B) final修饰的类肯定不能被继承 C) final修饰的方法不能被重载 D) final修饰的变量不允许被再次赋值 9.访问修饰符作用范围由大到小是(D) A) private-default-protected-public B) public-default-protected-private C) private-protected-default-public D) public-protected-default-private 10.以下(D)不是Object类的方法 A) clone() B) finalize() C) toString() D) hasNext() 11.多态的表现形式有(A) A) 重写 B) 抽象 C) 继承 D) 封装 12.以下对重载描述错误的是(B)

类继承与接口(一)

实验9 类继承与接口(一) 一、实验目的和要求 1. 掌握Java类的继承特点,包括子类声明、对象创建等。 2. 掌握域的继承与隐藏的特点。 3. 掌握方法的继承与重写的特点。 二、实验内容 1. 程序阅读与分析 2. 程序填空:按照需求将代码空缺处补齐。 3. 成员的访问权限 三、实验步骤 1. 程序阅读与分析 执行类ConstructorChain, 请写出输出结果, 并分析出现该结果的原因。提示:参考构造方法链。 class ConstructorChain{ p ublic static void main(String[] args){ new Son(); } } class Grandpa{ Grandpa(){ S ystem.out.println("Grandpa"); } } class Father extends Grandpa{ Father(){ S ystem.out.println("father"); } } class Son extends Father { S on(){ S ystem.out.println("son"); } }

(1) 运行结果: (2) 分析继承链上各个类构造方法的调用次序: 分析是否是超类构造方法调用在前: Son();Father();Grandpa(); 沿着继承链从子类开始一直到object为止 (2)在命令行上键入java –verbose ConstructorChain, 并回车, 观察各个类的加载次序. 各个类的加载次序是: 分析是否超类先加载: 各个类的加载顺序依次是:class Grandpa->class Father extends Grandpa->class Son extends Father 是,在加载某个类的时候,如果它的某个超类还没有被加载,那么必须首先加载这个超类;继承链上加载超类的顺序是:从object类开始知道当前类。就是继承链上接近object的超类,越优先被加载;默认情况下,同一个类仅需加载一次,既不会重复多次加载同一个类。 2.程序填空。按照以下需求将代码空缺处补齐: 类的继承 ?需求分析: ?校务管理系统,设计类来描述系统中的两个角色:教师与学生 ?public class Teacher ?public class Student ?抽取共性 ?public class Person ?考虑在Person中设计教师与学生的公有域 已知部分代码设计如下

Java语言接口与继承本质区别

Java语言接口与继承本质区别 大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。 设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。 假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一返回一个Connection对象,并且都有一个close方法,用于关闭连接。只需要针对你的DBMS,选择不同的类,就可以用了,但是我的用户他会使

用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口: package org.bromon.test; public interface DB { java.sql.Connection openDB(String url,String user,String password); void close(); } 这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java: Package org.bromon.test; import java.sql.*; public class Mysql implements DB { private String url=”jdbc:mysql:localhost:3306/test”; private String user=”root”; private String password=””; private Connection conn; public Connection openDB(url,user,password) { //连接数据库的代码

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();

JAVA复习习题(继承)

类的继承习题 一、选择题 1. Java语言的类间的继承关系是( B )。 A) 多重的B) 单重的C) 线程的D) 不能继承 2. 以下关于Java语言继承的说法正确的是( C )。 A)Java中的类可以有多个直接父类B)抽象类不能有子类 C)Java中的接口支持多继承D)最终类可以作为其它类的父类 3. 现有两个类A、B,以下描述中表示B继承自A的是(D)。 A) class A extends B B) class B implements A C) class A implements B D) class B extends A 4. A) 5. A) 6. Java 7. A)Java C)Java 8. A) class C) class 9. 现有类 A) class C) class 10. A) 11. A) 12. A) 13. java A) 14. 饰符是( A) 15. A) 16. A)public B) protected C) private D) final 17. 下列选项中,表示终极方法的修饰符是:(B) A)interface B) final C) abstract D) implements 18. 下列选项中,定义接口MyInterface的语句正确的是:(A) A)interface MyInterface{ } B) implements MyInterface { } C) class MyInterface{ } D) implements interface My{ } 19. 如果子类中的方法mymethod()覆盖了父类中的方法mymethod(),假设父类方法头部定义如下:void mymethod(int a),则子类方法的定义不合法的是:(C) A)public void mymethod(int a) B) protected void mymethod(int a) C) private void mymethod(int a) D) void mymethod(int a) 二、填空题 1. 如果子类中的某个变量的变量名与它的父类中的某个变量完全一样,则称子类中的这个变量________了父类

Java实验4__继承与接口

.实验继承与接口 [实验目的] 1、掌握java 继承中父类及其子类的定义方法。 2、掌握子类重写父类同名方法的方法。 3、掌握接口的用法。 [实验内容] 1、定义父类People,分别定义People类的子类ChinaPeople,AmericanPeople和BeijingPeople 并分别重写父类中的各个方法。最后在主方法中分别创建各子类的对象并调用各自的方法打印输出信息。该程序的模板代码如下:请将其补充完整并调试运行。 class People { protected double weight,height; public void speakHello() { System.out.println("yayawawa"); } public void averageHeight() { height=173; System.out.println("average height:"+height); } public void averageWeight() { weight=70; System.out.println("average weight:"+weight);

} } class ChinaPeople extends People { 【代码1】//重写public void speakHello()方法,要求输出类似“你好,吃了吗”这样的 //汉语信息 【代码2】//重写public void averageHeight()方法,要求输出类似//“中国人的平均身高:168.78厘米”这样的汉语信息【代码3】//重写public void averageWeight()方法, //要求输出类似“中国人的平均体重:65公斤”这样的汉语信息 public void chinaGongfu() { 【代码4】//输出中国武术的信息,例如:"坐如钟,站如松,睡如弓"等 } } class AmericanPeople extends People { 【代码5】//重写public void speakHello()方法,要求输出类似//“How do you do”这样的英语信息。

相关文档
最新文档