关于Java 的继承问题,子类会继承父类的哪些东西?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java 的继承问题,子类会继承父类的哪些东西?相关的知识,希望对你有一定的参考价值。

When you do this, you automatically get all the fields and methods in the base class
---摘自《Thinking in Java》 Reusing class一章。
当继承时,会自动得到基类中的所有的域和方法。
关于这句话如何解读?
1、private修饰的成员能够继承下来吗?
2、final修饰的成员能继承下来吗?
3、static修饰的成员能继承下来吗?
4、构造方法呢?

我自己找到答案了。谢谢两位回答的网友。
书中说的是没有错的。域和方法都会被继承。
在第四版《Thinking in Java》第8.2.4及8.2.5节有相关的回答。
域和方法都会被继承。
对于方法来说,只有非private,或者非final方法(private 方法自动是隐式final的)才能被覆盖。
对于域:最佳实践,我们会将域设置为private型的,并提供公开的get/set方法。但是从语法角度来说,可以设置为包,public,protected。任何域访问操作都将由编译器解析,因此不是多态(后期绑定)的。如果在子类中要访问基类版本的域,需要显式的使用super.field才能访问。

对于静态的,因为和域一样,是前期绑定,所以直接用类名.staticMember访问就行了。

和C++类似,可以继承基类的公共属性和方法。

在Java继承里,父类的属性还有方法在声明时,如果是public关键字即公共属性,则在子类继承时,这些属性和方法都会被子类继承。受保护的也可以继承

但是私有的类属性成员和方法则无法继承。
.子类继承父类的成员变量
  当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
  1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
  2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
  2.子类继承父类的方法
  同样地,子类也并不是完全继承父类的所有方法。
  1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
  2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
参考技术A 除了用private修饰的成员, 其他都可以继承;final成员能继承,但不能修改;
static成员能继承,而且能修改;构造方法也是可以继承的
参考技术B

除了用private修饰的成员, 其他都可以继承;

final成员能继承,但不能修改;

static成员能继承,而且能修改;

构造方法也是可以继承的

参考技术C 除了用private修饰的成员, 其他都可以继承 参考技术D 应该都能继承,只是一类对象能不能调用的问题

JAVA 继承

一、继承的基本语法:

在Java语言中,用extends关键字表示一个类继承了另一个类。

比如: 子类 extends 父类{

}

子类类到底继承了父类类的哪些东西呢?有 以下两种情况:

① 当子类类和父类类位于同一个包中:子类类继承父类类中public、Protected和默认访问级别的成员变量和成员方法

② 当子类类和父类类位于不同的包中:子类类继承父类类中public和protected访问级别的成员变量和成员方法

【在JAVA 中一个子类只能有一个直接的父类。】

所有的Java类都直接或间接地继承Java.lang.Object类。Object类是所有java类的祖先。

 

二、方法重载(OverLoad)

对于类的方法(包括从父类中继承的方法),如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法

注:

重载方法必须满足以下条件:

① 方法名相同

② 方法的参数类型、个数、顺序至少有一项不相同

③ 方法的返回类型可以不相同

④ 方法的修饰符可以不相同

三、方法覆盖(Override)

覆盖方法必须满足多种约束:

① 子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致

② 子类方法不能缩小父类方法的访问权限

③ 子类方法不能抛出比父类方法更多的异常

④ 方法覆盖只存在于子类和父类之间,在同一个类中的方法只能被重载,不能被覆盖

⑤ 父类的静态方法不能被子类覆盖为非静态方法

⑥ 子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法

⑦ 父类的非静态方法不能被子类覆盖为静态方法

⑧ 父类的私有方法不能被子类覆盖

⑨ 父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法 二是子类重新声明父类的抽象方法

⑩ 父类的非抽象方法可以覆盖为抽象方法

四、方法覆盖与方法重载的异同

相同点:

要求方法相同

都可以用于抽象方法和非抽象方法之间

不同点:

方法覆盖要求参数签名必须一致,而方法重载反之

方法覆盖要求返回类型必须一致,而方法重载不做限制

方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法

方法覆盖对方法的访问权限和抛出的异常有特殊要求,而方法重载无限制

父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次

五、super关键字

super和this关键字都可以用来覆盖java语言的默认作用域,使被屏蔽的方法或变量为可见。

注:

在程序中,在以下情况会使用super关键字:

①在类的构造方法中,通过super语句调用这个类的父类的构造方法

②在子类中访问父类的被屏蔽的方法和属性

 

六、继承的利弊和使用原则

利弊:

继承关系最大的弱点:打破封装

七、比较组合与继承

 

以上是关于关于Java 的继承问题,子类会继承父类的哪些东西?的主要内容,如果未能解决你的问题,请参考以下文章

子类可以继承父类的啥

java 类的继承,子类变量的获取

关于java中子类继承父类的构造方法

关于JAVA

什么是类的继承性?Java中子类和父类有什么关系?

JAVA 继承