简述Java继承

本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。

继承
简述:描述的是事物之间的所属关系,这种关系是is-a的关系。例如野牛属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
特点

  1. 提高了代码复用性。
  2. 让类与类之间产生了关系,继承是多态的前提。

扩展:
子类继承父类,子类拥有了父类的所有属性和方法。
程序验证,父类的私有属性和方法子类是无法直接访问的。当然私有属性可以通过public修饰的get和set方法访问到的,但是私有方法不行。
假设:子类不能够继承父类的私有属性和方法
那么:分析内存后会发现,当一个子类被实例化的时候,默认会先调用父类的构造方法对父类进行初始化,即在内存中创建一个父类对象,然后再父类对象的外部放上子类独有的属性,两者合起来成为一个子类的对象。
所以:子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法是对的,只不过父类的私有属性和方法,子类是无法直接访问到的。即只是拥有,但是无法使用。
注意
Java语言只支持单继承,不支持多继承,但支持多层继承。
千万不要为了获取其他类的功能,简化代码而继承。必须是类与类有所属关系才可以继承,所属关系is-a
重写(覆盖)
当子类出现和父类一模一样的函数时,当子类对象调用该函数时,会运行子类的内容。如同父类的函数被覆盖一样。
这就是函数的另一个特征,重写(覆盖)。
当子类继承父类,沿袭了父类的方法到子类中,但是子类虽然具有该方法,但是方法的方法体却和父类的不一样,这是没必要定义新的功能,而是使用覆盖特征,保留父类的方法的定义,并重写方法体的内容。
重写的注意事项:

  • 子类要重写父类的某方法时,必须保证子类的权限大于等于父类权限,才可以覆盖,否则编译失败。
  • 静态方法可以被继承,但不能被重写,如果父类中有个静态方法,子类中也有与其方法名、参数类型、参数个数都一样的方法,并且该方法也是静态的,那么该子类的方法会把原来继承过来的方法隐藏,而不是重写。通俗的讲就是父类和子类的方法是两个没有关系的方法,具体调用哪一个方法主要看是哪个对象的引用;这种父子类方法是不存在多态的性质。《Java编程思想》中这样提到"只有普通的方法调用可以是多态的"。
  • 还有一种情况,当父类某方法的权限为private时,子类是不能重写该方法的,但我们可以重新定义和父类该方法一样的方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    supper和this的含义
    super:代表父类中的存储空间标识(可以理解为父类的引用)。
    this:代表当前对象的引用(调用谁,就代表谁)。
    在这里插入图片描述
    子父类中的构造函数:
    在对子类对象进行初始化时,父类构造函数也会运行。那时因为子类的构造函数默认第一行有一条隐式的语句super()
    该语句会访问父类中的无参构造器,而且子类中所有的构造器默认第一行都是super()。
    为什么子类一定要访问父类中的构造函数?
    因为父类中的非私有数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据初始化的。所以子类在对对象初始化时,要先访问以下父类中的构造函数。如果要访问父类中的指定构造函数,可以通过手动定义super语句的方式来指定,注意:super语句一定定义在子类构造函数的第一行。
    结论:
    子类所有的构造函数,默认都会访问父类中的空参构造器,因为子类每一个构造函数的第一行都有一句隐式的super();。当父类中没有空参构造器时,子类必须手动通过super语句来指定要访问父类中的构造函数。当然,子类的构造函数第一行可以手动指定this语句来访问类中的其他构造函数。子类中至少得有一个构造函数会访问父类或者子类中的构造函数。
    构造方法的名字和类名一致,所以子类是无法继承父类的构造函数的。
    final:最终,作为一个修饰符。
  • 可以修饰类、函数、变量。
  • 被final修饰的类不可以被继承,为了避免被继承。
  • 被final修饰的方法不能重写。
  • 被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰修饰局部变量。(当在描述事物时,一些数据出现的值是固定的,那么为了阅读性,都给这些值起个名字,方便阅读,并且这个值不需要改变,所以加上final修饰)
  • 内部类定义在类中的局部位置时,只能访问该局部被final修饰的局部变量。

扩展:
构造方法、静态方法(static)、最终方法(final)和私有方法(private)都不能声明为抽象方法,关键字abstract和final不能同时使用。

抽象类
简述:父类中的方法,被它的子类们重写,子类各自的实现不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法体则没有了存在的意义。我们把没有方法主体的方法称为"抽象方法"。Java语法规定,包含抽象方法的类就是抽象类。
**抽象方法:没有方法体的方法。
抽象类:包含抽象方法的类。
abstract使用格式:修饰符 abstract 返回值类型 方法名(参数列表)(抽象方法)| abstract class 类名 (抽象类)
抽象类的使用:
继承抽象类的子类必须重写所有抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
注意事项:

  • 抽象类不能创建对象。理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
  • 抽象类中,可以有构造方法,是供给子类创建对象时,初始化父类成员使用的。子类的构造方法中,有默认的super(),需要访问父类构造方法。
  • 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 抽象类的子类,必须重写抽象类中的所有抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值