面向对象2-继承

  • 继承概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

  • 继承格式 通过extends关键字可以实现类与类的继承

  •  *class 子类名 extends 父类名 {}*
    
  • 单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。

  • 继承可以大大增强代码的复用性和维护性。当很多类都有相同的属性或方法时,我们可以将这些共有的属性方法提取出来,放入父类中,这样,子类在用的时候直接调用就行了。以前我们需要写好几遍的代码,现在只需在父类中写一遍,复用性大大增强。当所有类有个共有属性需要改变时,我们只需改变父类中的属性值即可,子类中的自然就变了。后期易于维护整个程序。最重要的是,继承让类与类直接产生关系,不再是分裂的个体,这是多态的前提之一。

  • 当然,继承也有缺陷。继承使类与类直接的联系增强了,改一个共有属性,所有类的该属性值都会同样改变,这是开发程序的大忌,即耦合性增加。我们希望,在程序当中,不同的程序有不同的功能,最好一个程序能自主完成一个功能(内聚性),但继承恰好违背了这一点。

  • Java支持单继承,不支持多继承。就是说,一个子类只能有一个父类,但一个父类可以有多个子类。同时,Java也支持多层继承,如父亲-自己-儿子。

继承的注意事项:
(1)子类只能继承父类所有非私有的成员(成员方法和成员变量);
(2)子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法;
(3)不要为了部分功能而去继承。
继承的使用情况:简单地说,当一种事物的大部分属性包含于另外一个事物时,我们可以考虑使用继承。

成员变量之间的关系:
(1)当子类中的变量名和父类中的变量名均不相同时,以实际调用的名字为主,这种情况易于理解,这里不做赘述;
(2)当子类中的变量名和父类中的变量名相同时,我们先在子类的局部范围中找,找不到的话在子类的成员范围中找,最后在父类的成员变量中找,要是还找不到,系统就回报错。

关键字:this,super

  • 如果子类和父类中有同名的变量,我们要使用父类中的变量,需要怎么做呢?
    this:代表的是本类对象的引用。就是说,谁调用该方法,this指代的就是谁。 this的一般使用格式:
    this.成员变量名: 调用该成员的变量 this.方法名: 调用该成员的方法 this(参数): 调用本类的构造方法
    super:是父类对象的标识。可以通过关键字,访问父类中的变量和方法。 super.成员变量名: 调用父类成员的变量
    super.方法名: 调用父类成员的方法 super(参数): 调用父类的构造方法

public class MyTest {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.ziTest();
    }
}
class Fu {
    int num = 20;
    int f = 500;
}
class Zi extends Fu {
    int num = 2000;
    int a = 15;
    public void ziTest() {
        int num = 50;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
}
运行结果:
50
2000
20

空参构造方法:
子类中所有的构造方法默认都会访问父类中空参数的构造方法。因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。其实:每一个构造方法的第一条语句默认都是:super()。简单提一句,Object类。否则有人就会针对父类的构造方法有疑问。Object在没有父类了。

父类没有无参构造方法,子类怎么办? a:在父类中添加一个无参的构造方法 b:子类通过super去显示调用父类其他的带参的构造方法
c:子类通过this去调用本类的其他构造方法 本类其他构造也必须首先访问了父类构造

:super(…)或者this(….)必须出现在第一条语句上

class Fu{
    public Fu() {
        System.out.println("父类空参构造方法默认执行");
    }
}
class Zi extends Fu {
    public Zi() {
        System.out.println("子类空参构造方法默认执行");
    }
}
public class MyTest{
    public static void main(String[] args) {
        new Zi();
    }
}
运行结果:
父类空参构造方法默认执行
子类空参构造方法默认执行

方法重写
子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
方法重写的应用:
(1)当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
(2)这样,即沿袭了父类的功能,又定义了子类特有的内容。
方法重写注意事项
(1)父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
(2)子类重写父类方法时,访问权限不能更低
最好就一致,或者比父类方法的权限修饰符高
(3)父类静态方法,不参与重写
(4)子类重写父类方法的时候,最好声明一模一样。

final

  • 由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
  • final关键字是最终的意思,可以修饰类,变量,成员方法。
    被修饰类不能被继承;被修饰的方法不能被重写;被修饰的变量不能被重新赋值,因为这个量其实是一个常量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值