看下面的代码:

public class Demo {public static void main(String[] args) {// 子类SonB继承父类Father,子类可以获取父类的所有属性和方法,无论是静态的还是非静态的。// 表明静态属性和静态方法可以被继承SonB sonB = new SonB();System.out.println(sonB.staticStr);// 获取父类的静态变量System.out.println(sonB.notStaticStr);// 获取父类的成员变量(非静态变量)sonB.staticMethod();// 调用父类的静态方法sonB.notStaticMethod();// 调用父类的非静态方法(成员方法)System.out.println("=============================================");// 表明在使用多态的情况下,静态属性和静态方法又可以被继承Father sonBF = new SonB();System.out.println(sonBF.staticStr);// 多态获取父类的静态变量System.out.println(sonBF.notStaticStr);// 多态获取父类的成员变量(非静态变量)sonBF.staticMethod();// 多态调用父类的静态方法sonBF.notStaticMethod();// 多态调用父类的非静态方法(成员方法)System.out.println("=============================================");System.out.println("=============================================");// 子类SonA继承父类Father,并且重写了父类的属性和方法。// 表明父类的静态属性和静态方法可以被覆盖SonA sonA = new SonA();System.out.println(sonA.staticStr);// 获取子类重写后的静态变量System.out.println(sonA.notStaticStr);// 获取子类重写后的成员变量(非静态变量)sonA.staticMethod();// 调用子类重写后的静态方法sonA.notStaticMethod();// 调用子类重写后的非静态方法(成员方法)System.out.println("=============================================");// 表明父类的静态属性和静态方法可以被覆盖,但覆盖后就没有多态了Father sonAF = new SonA();System.out.println(sonAF.staticStr);// 多态获取子类重写后的静态变量System.out.println(sonAF.notStaticStr);// 多态获取子类重写后的成员变量(非静态变量)sonAF.staticMethod();// 多态调用子类重写后的静态方法sonAF.notStaticMethod();// 多态调用子类重写后的非静态方法(成员方法)Father.staticMethod();SonA.staticMethod();}
}/*** 父类*/
class Father {public static String staticStr = "父类的静态变量";public String notStaticStr = "父类的成员变量(非静态变量)";public static void staticMethod() {System.out.println("父类的静态方法");}public void notStaticMethod() {System.out.println("父类的成员方法(非静态方法)");}
}/*** 子类继承父类,改写静态变量和方法*/
class SonA extends Father {public static String staticStr = "子类改写后的静态变量";public String notStaticStr = "子类改写后的成员变量(非静态变量)";public static void staticMethod() {System.out.println("子类改写后的静态方法");}@Overridepublic void notStaticMethod() {// 成员方法是可以被子类重写的,这里仅作说明System.out.println("子类改写后的成员方法(非静态方法)");}
}/*** 子类继承父类中的所有属性和方法,但不修改*/
class SonB extends Father {}/*打印结果:父类的静态变量父类的成员变量(非静态变量)父类的静态方法父类的成员方法(非静态方法)=============================================父类的静态变量父类的成员变量(非静态变量)父类的静态方法父类的成员方法(非静态方法)==========================================================================================子类改写后的静态变量子类改写后的成员变量(非静态变量)子类改写后的静态方法子类改写后的成员方法(非静态方法)=============================================父类的静态变量父类的成员变量(非静态变量)父类的静态方法子类改写后的成员方法(非静态方法)父类的静态方法子类改写后的静态方法*/

可以看到父类的静态方法和变量可以被覆盖,也允许在子类中定义同名的静态变量和静态方法,但没有多态。

即“Java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏”。原因如下:

  • 静态方法和属性是属于类的,与类绑定在一起的,调用的时候直接通过类名,不需要继承机制就可以调用。如果子类里面定义了同名的静态方法和属性,那么这时候父类的静态方法和属性称之为“隐藏”,也就是上面第三段代码所表现出来的结果。如果要调用父类的静态方法和属性,直接通过父类名调用方法或属性即可完成。
  • 多态的实现是依赖于继承、接口和重写,有了继承和重写才可以实现父类的引用指向不同子类的对象。重写后子类的优先级要高于父类的优先级,但是隐藏没有这个优先级。
  • 静态属性和静态方法都可以被继承和隐藏而不能被重写,因此不能实现多态,也就不能使用父类的引用指向不同的子类对象。

总结:

  • 如果子类定义了与父类同名的静态属性和静态方法,那么在子类调用的一定是子类的静态属性和静态方法。
  • 如果子类没有定义与父类同名的静态属性和静态方法,那么在子类调用的一定是父类的静态属性和静态方法。

参考链接:

  • JAVA静态方法是否可以被继承?
  • Java中静态变量与静态方法的继承

Java中静态变量与静态方法的继承相关推荐

  1. java中静态变量和静态方法分别有什么特点?

    java中静态变量和静态方法分别有什么特点? 悬赏分:0 - 解决时间:2006-4-10 10:28 提问者: vv_clear - 二级 最佳答案 为什么问了两次?再贴上另一篇 Thinking: ...

  2. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  3. java中静态变量和成员变量的区别

    java中静态变量和成员变量的区别 1.静态变量. 由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其 ...

  4. Java中父类的静态变量和静态方法的继承问题

    1.普通父类的静态变量和方法,可以通过子类的名称访问和调用 2.普通父类的静态变量和方法,可以通过子类的实例对象访问和调用 3.抽象父类的静态变量和方法,可以通过具体子类的名称访问和调用 4.抽象父类 ...

  5. JAVA的静态变量、静态方法、静态类

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

  6. java中静态变量的作用_Java中static变量作用和用法详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  7. java 中静态变量(类变量)与实例变量 静态方法与实例方法

    静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: 1 public class Demo{ 2 3 int i1=0; 4 ...

  8. python中静态变量和静态方法_【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)...

    在java.c#等高级语言中我们用static来定义静态方法和静态变量,那么在python中如何定义静态方法和静态变量呢. python提供了@classmethod和@staticmethod来定义 ...

  9. JAVA中静态变量及类加载顺序

    1.静态变量.非静态变量的区别 ①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量另一种没有static修饰,为成员变量 通俗点说: 类的静态变量在内存中只有一 ...

最新文章

  1. 通过forms来创建用户注册
  2. mysql 5.3 build4.234_mysql版本3.23跟4.1区别
  3. android 耳机检测,android – 检测耳机是否有麦克风
  4. 细节决定成败,做网站也是如此
  5. CRM和ERP的Sales Organization的映射关系
  6. 电脑技巧:键盘失灵怎么办?
  7. Quartus DSE 初步应用
  8. leetcode976. 三角形的最大周长(又是你得不到的简单题)
  9. MaxCompute 挑战使用SQL进行序列数据处理
  10. 春运渡劫?Python 帮你 12306 抢回家的火车票!
  11. 机器人车间气管_大开眼界!机器人焊装车间火力全开
  12. chrome 通过插件来监控zabbix
  13. 最难数独的快速解法 - python
  14. php 按钮美化,input(file)按钮样式美化第二种
  15. matlab实对称矩阵对角化,基于Matlab的实对称矩阵对角化
  16. CTF小工具下载整理
  17. 可用于龙芯2F的gmp
  18. 深度解析,抖音对口型唱歌类短视频内容制作流程,步骤技巧分享
  19. 掌握4点职场技巧,打破测试人中年危机
  20. 算是我看源码时的一个小技巧吧~

热门文章

  1. 浅谈两大交互动画创作利器Sparkle 与 Flash
  2. Shell中的Sed命令详解
  3. 中文信息处理发展报告(2016)
  4. 计算机发展的三大定律,计算机体系结构发展的四个时代介绍
  5. 验证视图状态 MAC 失败,配置machineKey
  6. 我31岁,做美工一月8K,后面我该咋办?
  7. 如何通过手机或电脑对三菱PLC进行远程监控及维护
  8. 弘辽科技:拼多多怎么通过关键词提升销量?
  9. EXCEL中设置滚动条初始位置在最左边
  10. 以视频搜视频?智能视频检索或将诞生新曙光