原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

静态方法

通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制:

  • 它们仅能调用其他的static 方法。
  • 它们只能访问static数据。
  • 它们不能以任何方式引用this 或super。

无论是static修饰的变量,还是static修饰的方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,只分配一块存储空间,所有此类的对象都可以操控此块存储空间;

:这里要说明的时,当子类没有与之同名的static变量(或方法时),子类的对象也可以操控这块内存空间。但是子类并没有继承父类中static修饰的变量和方法。因为static修饰的变量和方法是属于父类本身的。

//————————以上我相信我们每个人都比较清楚。

但是,不知道你有没有注意到这种情况,当存在继承关系时,父类中有一个static修饰的变量(或方法),而子类中也存在一个同名的static修饰的变量(或方法)时,他们到底是否满足“重写”,而最终体现出多态的效果呢??

下面来看一个例子。 
父类中有一个static修饰的方法和一个普通的方法,子类中也有一个同名的static方法和一个普通的方法。如下

父类


public class Parent { public static void staticMethod(){ System.out.println("Parent staticMethod run"); } public void method(){ System.out.println("Parent method run"); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

子类


public class Son extends Parent { public static void staticMethod(){ System.out.println("Son staticMethod run"); } public void method(){ System.out.println("Son method run"); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试类

package com.wrh.teststaticmethod;public class Test { public static void main(String[] args) { Parent child=new Son(); child.staticMethod();//输出:Parent staticMethod run Son s=new Son(); s.staticMethod(); child.method();//这样才存在多态 } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行后的结果如下:

Parent staticMethod run 
Son staticMethod run 
Son method run

从结果可以看出:对于静态方法在子类中是不存在“重写”这一说的,就像前面我们提到的,用static关键字修饰的方法和变量都是属于类自己本身的,即使存在继承关系,子类并没有继承父类的static修饰的变量和方法,所以说即使子类和父类中都有同样的static方法和变量,他们是没有任何关系的,他们是相互独立的,他们是属于各自类本身的。因此也是不存在多态特性的。而对于普通方法的调用是存在“重写”而最终呈现出多态特性的。

同样的道理:对于static修饰的变量,当子类与父类中存在相同的static变量时,也是根据“静态引用”而不是根据“动态引用”来调用相应的变量的。

而在父类和子类中对于非static变量和方法,是根据“动态引用”来调用相应的变量和方法。

然而,接着会有这样的问题存在:java中 子类会不会继承父类的static变量和static方法

1)先说static方法:子类会不会继承父类的static方法呢??答案是:不会的,但是是可以访问的。

看如下的代码

public class Parent { public static void staticMethod(){ System.out.println("Parent staticMethod run"); } } public class Son extends Parent { //... }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试类

package com.wrh.teststaticmethod;public class Test { public static void main(String[] args) { Parent child=new Son(); child.staticMethod();//输出:Parent staticMethod run Son s=new Son(); s.staticMethod();//输出:Parent staticMethod run } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果如下

Parent staticMethod run 
Parent staticMethod run

从上面的运行结果可以看出,static方法是可以被子类访问的。

2)接着来看父类的static修饰的变量,是否能够被子类继承呢?? 
答案:也是不可以的。但是也是可以被子类访问的。

小结

1)子类是不继承父类的static变量和方法的。因为这是属于类本身的。但是子类是可以访问的。 
2)子类和父类中同名的static变量和方法都是相互独立的,并不存在任何的重写的关系。

转载于:https://www.cnblogs.com/mumu122GIS/p/10361119.html

转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性相关推荐

  1. Java 中子类是否只继承父类的非私有变量和方法?

    今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法(原贴在此).大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的. 首先我们明确一下&quo ...

  2. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...

    java定义接口时需要使用的关键字是 定义接口复使用的关键字是"interface",中文意思"接口.解释:通常接口都是制为了定义百某些规范,而在接口中只定义了方法,而没 ...

  3. Java中子类对象赋值给父类变量

    1. 在Java中将一个字类对象赋值给父类变量是合法的,这也是实现多态(即方法的动态分派)的前提条件之一. 2. 在Java中父类赋值同样也适用于数组.可以将一个子类数组赋值给一个父类数组变量.但可能 ...

  4. 子类能不能继承父类的成员变量

    1.关于私有成员变量无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected ...

  5. Java中的主类概念以及public static void main方法的分析

    1. 首先一定要有main()函数,不然你说从哪个函数开始执行呢 2. 包含main函数的类名不需要和文件名一致 因为字节码文件名只和类名有关,执行java程序时,也只是"java 类名&q ...

  6. java中子类怎样调用父类的属性_java的继承、重载(overload)、覆盖(override)的总结...

    java为了解决相似属性和行为能共用相同的代码,也是为了便于标准模块化.减少相同代码要多次重复编写的问题,提供了继承.重载和覆盖的功能.继承是针对类,重载和覆盖是针对方法的. 一.继承:为了便于理解. ...

  7. java中子类能否继承 重写父类的静态方法

    文章目录 1.疑问 子类能否继承父类的静态变量和静态方法 子类能否重写父类的静态方法 2. 原因 1.疑问 子类能否继承父类的静态变量和静态方法 首先,子类是可以继承父类的静态变量和静态方法的. cl ...

  8. java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...

    为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...

  9. Java继承-子类不可以继承父类的构造方法

    子类不可以继承父类的构造方法,只可以调用父类的构造方法. 子类中所有的构造函数都会默认访问父类中的空参数构造函数,这是因为子类的构造函数内第一行都有默认的super()语句. super()表示子类在 ...

最新文章

  1. 深度学习中的最大似然估计简介
  2. Windows下搭建PHP开发环境
  3. 世界上将出现一种新职业
  4. 新一代平板电脑 三星Galaxy Note 10.1将于本月末发布 - TECH2IPO创见
  5. 安卓百度地图附近poi搜索以及到指定poi的换乘方案
  6. Inno Setup入门(三)——指定压缩方式
  7. uni-app框架介绍
  8. python 日期的周数_术业有专攻:日期时间模块datetime
  9. 惠普计算机X9W2AV参数,MAX220CPE,MAX220CPE pdf中文资料,MAX220CPE引脚图,MAX220CPE电路-Datasheet-电子工程世界...
  10. docker进阶(1):使用cAdvisor监控容器
  11. Leetcode第412题——Fizz Buzz
  12. 【WEB】web www http html hypermedia hypertext 技术名词的意思
  13. FTP成功连接服务器后,出现乱码问题
  14. Python+Django+Mysql电影推荐系统 基于用户、项目、内容的协同过滤推荐算法 MovieRecommendSystemPython python实现协同过滤推荐算法实现 源代码下载
  15. PHP GD竖排文字写法
  16. 软件设计师——数据流图
  17. 注册表知识:HKEY_LOCAL_MACHINE根键详解
  18. 推荐三个开发C程序的工具(适用各种场合)
  19. 计算机主板维修高手,计算机电路基础与维修高手
  20. 翻译小程序源码1.2最新版

热门文章

  1. 背包问题——01背包问题——Charm Bracelet
  2. ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory解决方案
  3. mysql markdown_mysql+数据库学习笔记(markdown)
  4. cnn神经网络_神经网络之CNN和RNN
  5. lua调用c 模块linux,Lua 调用自定义C模块
  6. 华为智慧屏鸿蒙挂安卓9,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片...
  7. java把map值放入vector_Thinking in java基础之集合框架
  8. lnmp 1.4 mysql_lnmp1.4配置https教程
  9. android微信支付回调方法,Android接入支付宝和微信支付的方法
  10. Python 解释器中使用help()命令如何退出