Java面向对象:子类与继承

今天听java课程感觉难度突然增加,因此注意上课记录关键笔记,提醒自己回顾。

JAVA 子类与继承

image-20221229180846503

子类与父类

问题:哪些父类的变量与方法可被子类继承?与访问权限有关

前提知识:java中一个子类只可以继承一个父类。

  • private变量/方法:子类不可继承

  • 友好型(默认的)变量/方法:同package里的子类可以继承

  • protected/public:子类均可继承

以包的角度来看:

  1. 子类、父类在同一个包中:子类可以继承除了private以外的所有成员变量/方法。(如果子类中定义的实例方法访问不了父类变量/方法,则说明没继承过来)

  2. 子类、父类不在同一个包中:子类可以继承父类public、protected的变量、方法。友好和private都不行。

对protected的说明:一个类A的protected成员变量和方法都可被子类和孙类C继承。但是访问呢?对于孙类C在自己方法内创建的对象,可以访问变量和方法。但是对于另外一个类other里创建的该孙类对象,想过通过孙类C访问C的protected变量和方法,则必须和C在同一个包;要是other类的对象创建孙对象C,想访问A的变量和方法,则必须要求其和A在同一个包里!

instanceof运算符

instanceof是双目运算符”是实例吗?“,左操作数是对象,右操作数是类。如果左边的对象是右边的类或该类的子类创建的对象,返回true。

子类对象特点

当创建子类对象时,子类的成员变量都会被分配内存,同时其父类的所有成员变量也都被分配内存空间,但是只有被继承的那一部分被分配给子类对象作为其变量。没有被继承的父类变量在内存中仍然有空间,这包括父类中的private、不与子类在一个包里的父类的protected变量

那么这些没有被继承的变量,怎么被子类访问呢?通过调用继承过来的父类的特定方法去操作这些变量

成员变量的隐藏与方法重写

变量隐藏:

如果子类声明了和继承来的变量同名的对象(类型可以不同),则子类就会隐藏掉被继承的这个父类变量,以后通过.操作该变量,都是在操作自己声明的子类同名变量。不过,仍然可以通过调用父类的特定方法去操作这些变量。

方法重写:

子类若从父类继承了一个方法,则子类可以使用相同的方法名、参数列表、返回值,来重写这个方法,此时原来父类继承来的方法被隐藏了。

注意

  • JDK1.5之后,重写方法时参数可以不一样,而可以是原来方法参数的子类。
  • 重写方法时,不可以缩小权限。如可以把protected重写成public,但不可以写private/友好

重写的目的:子类如果不想沿用父类的行为,就可定义自己的。

多态

当父类的某个实例方法被多个子类各自重写时,可以各自产生自己独特的行为。

super关键字

被子类隐藏的父类变量、重写的父类方法,都不再归属于子类实例化的对象,而是归属于super.

因此,子类可以通过super.访问被隐藏/重写的变量和方法:

image-20221229201829908

super与子类构造方法

子类的构造必须调用父类的构造方法:

  1. 使用super()调用父类构造方法
  2. 使用this()调用本类中另外的构造方法,其中包含父类构造
  3. 若没有做到,系统自动调用无参构造

image-20221229202538478

final关键字

  1. final类:不允许被继承的类。例如JAVA的String类对于编译器和解释器很重要,因此用final修饰。
  2. final方法:这是最终版本的方法,不允许子类重写该方法。
  3. final常量:被修饰的量是常量,不允许被修改。

对象的上转型对象

若A是B的父类,我们声明了一个父类对象a,用子类的构造方法实例化该对象a,用子类的构造方法再实例化一个子类对象b,则a是b的上转型对象。具有如下特点:

  1. a不可操作b新增的成员变量和方法。
  2. a可以操作、调用b继承的变量和方法,以及b隐藏变量和重写的方法。也就是说,若子类重写了父类某个实例方法,则a调用的是子类重写的方法,而不是父类的原方法,这也是上转型对象与父类对象的区别
posted @ 2022-12-29 21:02  丘丘王  阅读(245)  评论(0编辑  收藏  举报
鼠标点击页面特效

尝试在空白处点击鼠标