java图书类及其继承_java系统学习(六) --------继承

什么是继承

在java语言中,继承是针对类来说的。

继承,就是在已经存在类的基础上,进行扩展,从而产生新的类。已经存在的类称为父类、超类或基类,而新产生的类称为子类或派生类。

在Java中,父类所拥有的一切,子类都可以继承。父类拥有白己的属性字段和方法,这些子类都可以继承。子类继承了父类所有的属性和方法,就可以使用它们。另外子类除了拥有父类的属性和方法,也可以创建自己的特性。根据这些特性,总结出继承的关系图,如图:

2a9f1bb8bab30f95d8903bd0fe5ae5bd.png

如何实现继承

继承通过关键字extends来实现。用extends表明当前类是子类,并表明其是从哪个类继承而来。

用法

汽车类

{

汽车有四个轮子属性

引堆属性

方向盘属性

如何驾驶它()//方法

如何保养它()//方法

}

宝马厂家的敞篷跑车 extends 汽车类

{

如何打开敞篷()//方法

}

例子

class Person //关于人的类

{

int age; //年龄属性

int height; //身高属性

void eat(){}; //吃的方法

void sleep(){}; //睡觉的方法

}

class Student //关于学生的类

{

int age; //年龄属性

int height; //身高属性

void eat(){}; //吃的方法

void sleep(){}; //睡觉的方法

int score; //学生分数属性

void study(){}; //学生学习的方法

}

从以上的代码段,可以看出,"Person"类和`Student”类有很多参数相同。`Student”类包含了“Person`类所有的参数,这种情况,就需要使用继承。上面的代码可以修改如下:

class Person //关于人的类

{

int age; //年龄属性

int height; //身高属性

void eat(){}; //吃的方法

void sleep(){}; //睡觉的方法

}

class Student extends Person //继承人的类

{

int Score;//学生分数属性

void study(){};//学生学习的方法

}

构造函数的使用

什么是构造函数

class Person{

Person(){};

}

代码中“Person(){}”就是类“Person”的一个构造函数,使用它来构造对象。在实际开发中,往往不需要书写构造函数,因为它是系统默认的,可写可不写。

但系统默认的构造函数不带参数,如果需要带参数,就必须自己书写构造函数。

构造函数的名称与类的名称一样,这就是构造函数能区别于类内其他函数的标志。再举个有关构造函数的例子:

class Color

{

Color(){}; //无参构造函数

Color(int red){}; //带一个参数的构造函数

Color(int red,int green){},//带两个参数的构造函数

}

如果要使用构造函数构造对象,就需要使用new关键字,如下面的代码段:

Color col=new Color();

Color col=new Color(int red);

Color col=new Color(int red,int green);

这个例子使用了3个不同的构造函数,可以构造出3个不同的对象:不带参数、带一个参数和带两个参数,这就是构造函数重载。

根据上面所述,对构造函数的概念总结如下:

1.构造函数名字与类名相同(包括大小写)。

2.一个类可以有多个不同的构造函数。

3.构造函数没有返回值,但不用写void关键字。

4.构造函数总是和new运算符一起被调用。

继承中的构造函数初始化

创建类对象时,系统会调用构造函数对其所属成员进行初始化,那么针对那些继承自父类的成员又该如何初始化呢?

实际上,在创建子类对象时,先执行父类的构造函数,然后执行子类的构造函数,最后完成对象的创建。正如先有父母,然后才一有子女一样。在创建子类对象时,会先调用父类构造函数,初始化继承自父类的成员,随后调用子类构造函数,初始化子类的成员。

例如:

class Person //父类

{

int a;

Person() //父类的构造函数

{

a=10;

System.out.println(”这个是父类的构造函数”);

}

}

public class men extends Person //子类

{

int b;

men() //子类的构造函数

{

//super() //调用父类无参构造函数

b=20;

System.out.println(”这个是子类的构造函数”);

}

public static void main(String[] args)

{

men m=new men(); //创建对象m

System.out.println(m.a+“ ”+m.b) //输出相应信息

}

}

输出结果

这个是父类的构造函数

这个是子类的构造函数

10 20

替代父类和本身的方式

"super()”代表父类的构造函数,可以使用“super”代替父类中的属性或方法。

使用“this”来代替引用对象自身,同样“this()”用来代替对象的构造函数。

class Person //父类

{

int a;

Person() //无参构造函数

{

a=1; //为成员变量a赋值

}

Person(int a) //带参构造函数

{

this.a=a;//通过关键字调用成员变量

}

public class mea1 extends Person //子类

{

int b;

mea1(int a,iat b) //带参构造函数

{

super(a);

this.b=b; //通过关键字调用成员变量

}

public static void main(String[]args)

{

mea1 m=new mea1(10,20); //创建对象m

System.out.println(m.a+”‘’+m.b);//输出相应信息

}

}

运行结果:

10 20

java中的单继承性

Java规定一个类只能继承一个父类,这就是单继承。

继承中的覆盖现象

在对象继承的过程中,子类中可以直接使用父类所继承下来的属性和方法,就如自己的一样。但是如果在子类中又声明了相同名称的属性的话,那么当直接使用时,调用的是子类的属性和方法呢?还是父类的属性和方法呢?    调用的是子类中的属性和方法。也就是子类把父类的覆盖了。下面通过一个具体实例来详细介绍。

//定义了一个父类

class parent

(

int a;

void f(int a){......……}

private int g(int a,int b){.

}

//定义了一个子类,继承上面的父类

//在子类中覆盖了父类的g方法

class child extends parent

{

int b;

void f(int a){.....··……}

public int g(int a,int b){......……}//覆盖g万法

}

类之间的关系

类与类之间最常见的关系主要有以下3种:

依赖(或uses-a)

聚合(或has-a)

继承(或is一a)

依赖

依赖关系是类中最常见的关系,例如订单类(order)需要访问用户的账户类(account) , 所以在订单类中需要引用账户类,即订单类依赖账户类,但图书类不需要依赖账户类。

聚合

因为订单需要指明订购什么图书,这就涉及图书类,即包含了图书类。聚合与依赖关系的不同在于,订单类可以不拥有所有账户类对象,但是必须拥有所有图书类对象。

继承

继承就是一个类能调用另一个类的所有方法和属性,并在当前类中不需要再重新定义这些方法和属性。

继承层次图

虽然Java语言中,继承为单继承而不是多继承,但是类却可以实现多层继承。多层继承就是一个类的子类还可以有子类,子类还可以有子类.其原理如图所示。

fd8f82617b5585d42fe3bde1677b1dfc.png

如何设计好继承

1.把通用操作与方法放到父类中,因为一个父类可以有好几个子类。把通用的操作放到父类中,带来的好处是多方面的:一是避免代码重复,二一是避免了人为因素导致的不一致。

2.不要使用受保护字段,也就是protected字段。

3.尽管类的继承给开发带来了好处和方便,但如果不希望自己的类再被扩展,也就是不希望再产生子类时,可在类的声明之前加上final关键字,这样此类就不能再被继承。

常见问题

1. Java不支持多继承,如何处理一个类继承多个父类的情况

答:在c++中支持一个类的多继承,而在Java中不支持,那么遇到需要继承多个类的情况时,Java通过实现接口的方式,来解决这个问题。

2.如果出现了带参数的构造函数,可否不在代码中写出来写出来 答:不行。因为系统默认的构造函数是不带参数的,如果带参数的构造函数不在代码中写出来,会造成整个程序的混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值