今天看到了Java中子类继承父类的一个相关讨论,在网上综合了各家的观点,写下了一篇简短的总结。

问题如下,在父类中含有staic修饰的静态方法,那么子类在继承父类以后可不可以重写父类中的静态方法呢?

答案是:不能。

很多人可能会提出疑问,因为他们在写代码的时候出现过以下代码,举例:

父类:Animal.java
public class Animal {

public Animal() {

}

public void run() {

System.out.println("动物可以奔跑");

}

public static void shout() {

System.out.println("动物可以叫");

}

}

子类:Dog.java
public class Dog extends Animal

{

public Dog() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

Dog dog = new Dog();

dog.run();

dog.shout();

}

@Override

public void run() {

System.out.println("狗跑得很快");

}

public static void shout() {

System.out.println("狗的叫声是汪汪汪");

}

}
运行Dog.java结果:
​​

这是不是说明子类实现了对父类中静态方法的重写呢?貌似很有道理,然而我们对Dog.java,稍作改动,即将dog向上转型:

public class Dog extends Animal

{

public Dog() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

Animal dog = new Dog();

dog.run();

dog.shout();

}

@Override

public void run() {

System.out.println("狗跑得很快");

}

public static void shout() {

System.out.println("狗的叫声是汪汪汪");

}

}
运行结果:
​​

说明子类其实并没有实现对父类stati方法的重写,为什么?

在Java中,如果父类含有一个静态方法,且在子类中也含有一个返回类型,方法名、参数列表等都与之相同的的静态方法,在子类中只是对父类的该同名方法进行隐藏,并不是重写。父类与子类含有的其实是两个没有关系的方法,两者的行为不具有多态性。
在上面的例子中,shout方法与类发生了关联,而不是与特定的类的实例相关联,它不在乎什么类型的类正在创建它,而仅仅在意引用的类型。在Animal dog = new Dog()中,dog是一个类Dog在内存中的一个Animal类型的引用,如果一个static方法被调用了,jvm不会检查什么类型正在指向它,他只会调用跟Anima类相关联的方法的实例。
---------------------

Java子类对于父类中static方法的继承的更多相关文章

  1. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

  2. Java基础-重写-子类重写父类中的方法后执行情况

    代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.o ...

  3. java子类和父类中静态块、非静态块、构造函数的执行顺序

    public class qqqq extends Parent{ public static void main(String[] args) { new Child(); } } class Pa ...

  4. java 子类不能继承父类的static方法

    先来看一段代码 /** * Created by bjchengpeng on 2018/7/19. */ /**运行结果 * woof * woofaa * * woof * Basenjiaa * ...

  5. java 子类重写父类的方法应注意的问题

    若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:    重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法 ...

  6. C#中子类调用父类的实现方法

    这篇文章主要介绍了C#中子类调用父类的实现方法,通过实例逐步分析了类中初始化构造函数的执行顺序问题,有助于加深对C#面向对象程序设计的理解,需要的朋友可以参考下     本文实例讲述了C#中实现子类调 ...

  7. 子类可以有跟父类中同名的方法,但是会重写父类中的方法,甚至是root class中的方法

    /* 子类可以重写父类中的方法,甚至是root class中的方法,比如NSObeject 的new方法,但是后提示警告如下 Method is expected to return an insta ...

  8. Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱

    本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java pa ...

  9. Java子类访问父类的私有成员变量

    /**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...

随机推荐

  1. 题目3 : Spring Outing 微软2016校园招聘在线笔试第二场

    题目3 : Spring Outing 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 You class are planning for a spring outin ...

  2. [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv

    Natural Neural Networks Google DeepMind又一神作 Projected Natural Gradient Descent algorithm (PRONG) bet ...

  3. 代理serverSquid3的配置

    1.安装squid3 sudo apt-get install squid3 2,配置squid3 sudo cd /etc/squid3 sudo vim squid.conf /http_acce ...

  4. HDU 4259(Double Dealing-lcm(x1..xn)=lcm(x1,lcm(x2..xn))

    Double Dealing Time Limit: 50000/20000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 卸载了 TortoiseGit,问题太多

    电脑里面同一时候安装TortoiseGit 和 TortoiseSVN,使用tortoiseGIT来跟踪git项目,有一个非常无语的问题,git status显示都是clean的.可是目录图标却始终显 ...

  6. 学习笔记——SQL SERVER2014内存数据库

    sql server2014支持内存数据库功能. 内存可以说是数据库性能的生命线.理论上,如果内存足够,SQL SERVER可以将所有的数据都装载到内存里,访问.修改什么的,都在内存中进行,只有在ch ...

  7. 在Android中创建文件

    import java.io.File; import java.io.IOException; import android.app.Activity; import android.os.Bund ...

  8. 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs

    题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...

  9. 【BZOJ4555】【TJOI2016】【HEOI2016】求和

    题目 传送门 解法 我们可以用容斥来求第二类斯特林数 我们知道, 第二类斯特林数\(S(n, k)\)是\(n\)个元素放进\(k\)个无标号的盒子里, 不可以含有空的. 于是我们可以考虑可以含有空的 ...

  10. Websocket实现前后台通信,demo小测试

    新需求大概如下:用户登录系统,登录成功之后建立websocket连接,实现通信 总体思路:前端不是我负责,只是简单的做个功能,先实现登录,把用户标识存入HttpSeesion,再建立websocket ...