继承的概念及用法

继承:

将多个类抽取一个独立的类,让独立的类和多个类产生继承关系

继承的关键字:extends

格式:

class 子类名 extends 父类名{

...

}

继承的好处:

1)提了代码复用性,解决了代码臃肿的问题;

2)它是多态的前提(多态的前提是必须有继承关系)

 

继承的特点:

子类继承父类,是继承了父类所有的东西(成员变量,成员方法,包括私有方法),但是子类不能使用私有的东西,只能通过父类的公共的访问间接的让子类访问它

继承的另外一个特点:

Java中,继承只支持单继承,不支持多继承(子类名 extends 父类名1,父类名2,...)

但是,Java是可以支持多层继承的。

类和类之间的关系:继承关系

类和接口之间的关系:实现关系

可以这样理解:(多层继承)(以下成员方法默认为public)

GrandFather类,其成员方法是function()

Monther类,其成员方法是method()

新建一个Father类继承(extendsGrandFather类,也就继承了GrandFather类的成员方法function(),并且该Father类还有一个自己的成员方法show()

新建一个Son 继承(extendsFather类,也就继承了Father类的成员方法function()show(),并且该Son类还有一个自己的成员方法playGame()

因此在测试时可以看出:Son类,就一共有三个成员方法,其中两个都是继承而来的。Son s = new Son();

s.function();

s.show();

s.playGame();

 

继承中的注意事项:

1)构造方法不能被继承,但是可以通过super关键字去访问;

2)私有的可以间接的去访问;

3)什么时候使用extends?

假设:有一个A类

class A{

public void show1(){}

public void show2(){}

}

有一个B类

class B{

public void show1(){}

public void method(){}

}

按照正常的情况:发现A类和B类中有共同的show1()方法,根据继承的概念,---->让B类继承A类

class B extends A{

public void method(){}

}

这是没有问题的,但是继承了A类,show1(),show2()也继承过来了,可能show2()并不是我想要的功能;对于这种情况不要使用继承

继承体现的是一种"is a"的关系:

如果A是B的一种或者B是A的一种,这个可以使用继承!

水果----------香蕉-苹果-橘子(这三个都属于水果)

 

不要随意的使用继承,只要有"is a"的关系就使用它。


Java开发设计原则:低耦合,高内聚

耦合:类和类之间的关系 ,尽量降低耦合性。

内聚:指的是做一件事情能力(尽量使用一个类完成的事情不要多个类去完成..)


在继承中,成员变量的名称问题

当前子类继承父类的时候,当子类和父类中的成员变量名称不一致的时候,分别输出就可以了;

当子类和父类中的成员变量名称一致的情况:

1)先到子类的局部位置找,如果找到了,就输出,

2)没有找到,到子类的成员位置找,有就输出,

3)在类的成员位置还没有找到,直接父类的成员位置找,有就输出

4)如果还没有,就报错了,不存在这个变量。

 

问题:

要访问这个子类的局部位置的变量,直接可以访问.

需求:要访问Son类的成员位置的这个变量nun,如何访问?

需求:要访问Father类的成员位置的变量nun.如何访问?

Java提供了关键字:super:代表的父类的空间标识(父类的引用或父类的对象)

this和super关键字的用法:

成员变量:

this:

this.成员变量; (访问当前类)

super:

super.成员变量;(访问父类)

构造方法:

this();//无参构造

this("");//访问当前类的有参构造

super()://访问的父类的无参构造

super("")://访问的是父类的有参构造

成员方法:this.xx()

super.xx()

例如

System.out.println(num);//当前类局部位置

System.out.println(this.num); //this代表了当前的类对象 :Son

System.out.println(super.num); //super 代表的父类引用

 

关于继承的成员的问题

构造方法:

子类继承父类,都会默认的访问父类的无参构造方法

这是因为:如果数据还没有被初始化完毕,那么就应该先让父类进行初始化,然后在让子类初始化--->分层初始化

思考:

如果父类的无参构造没有提供?怎么办?

首先肯定报错;

如何解决:

1)可以将父类的无参构造提供出来,

2)可以super关键字去访问父类的带参构造,

3)还可以在子类中通过this(),访问本类中的有参构造,间接的去访问父类有参构造。

子类的构造方法必须有一个(有参构造/无参构造),让父类进行初始化!

 

继承中成员方法的问题

子类继承父类,访问成员方法名不一致的情况,分别调用!

当子类中的成员方法名和父类中的成员方法名一致的情况:

1)现在子类的成员位置找,如果有就调用;

2)如果没有找到,在父类的成员位置找,有就调用。

关于继承的用法:

父类中被private修饰的,是可以继承,但是只能间接的去访问私有的;

父类被private修饰的成员属性,子类不能直接访问的;

子类不能继承父类的构造方法,但是可以通过super访问;

 

子类继承父类,父类先进行初始化,然后子类进行初始化,这就是继承中分层初始化

类名 对象名  = new 类名() ; 这句话,创建了对象,通过构造方法进行初始化(默认初始化,显示初始化)

猜你喜欢

转载自blog.csdn.net/luzhu1234/article/details/79990598