Java子类对于父类中static方法的继承
今天看到了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方法的继承的更多相关文章
- java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数
一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构
- Java基础-重写-子类重写父类中的方法后执行情况
代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.o ...
- java子类和父类中静态块、非静态块、构造函数的执行顺序
public class qqqq extends Parent{ public static void main(String[] args) { new Child(); } } class Pa ...
- java 子类不能继承父类的static方法
先来看一段代码 /** * Created by bjchengpeng on 2018/7/19. */ /**运行结果 * woof * woofaa * * woof * Basenjiaa * ...
- java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一: 重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法 ...
- C#中子类调用父类的实现方法
这篇文章主要介绍了C#中子类调用父类的实现方法,通过实例逐步分析了类中初始化构造函数的执行顺序问题,有助于加深对C#面向对象程序设计的理解,需要的朋友可以参考下 本文实例讲述了C#中实现子类调 ...
- 子类可以有跟父类中同名的方法,但是会重写父类中的方法,甚至是root class中的方法
/* 子类可以重写父类中的方法,甚至是root class中的方法,比如NSObeject 的new方法,但是后提示警告如下 Method is expected to return an insta ...
- Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱
本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java pa ...
- Java子类访问父类的私有成员变量
/**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...
随机推荐
- spring boot 中访问 REST 接口
RestTemplate restTemplate = new RestTemplate(); Object result = restTemplate.getForObject("http ...
- Android平台Airplay的实现方法
Airplay属于局域网内异构设备之间分享多媒体数据的一种通信协议.Airplay设备有客户端和服务器之分,一般将小屏IOS设备实现为Airplay客户端,大屏幕设备实现为Airplay服务器.即iP ...
- Linux下使用popen()执行shell命令【转】
本文转载自:https://my.oschina.net/u/727148/blog/262987 函数原型: #include “stdio.h” FILE popen( const char co ...
- C++ 中的友元(friend)
首先友元不是一个好的设计,它破坏了封装.并且自身有很多局限:比如友元关系不能被继承:友元关系是单向的,不具有交换性:友元关系不具有传递性. 类内声明的 friend 变量(或者函数)在访问该类的成员时 ...
- PHPExcel 使用心得
最近有个项目需要将数据导出成excel,以前都没接触过.便google一下知道了PHPExcel 这个据说很强大的类库. 写这个博文主要目的等同于做笔记 1首先看了下官方的文档.http://phpe ...
- javaweb中的三个域
1.Request域 程序产生数据,显示完了就没用了,就用这个域. 2.Session域 程序产生数据,出了显示用,待会还要用,就用这个域. 3.ServletContext域 程序产生数据,数据显示 ...
- 3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了
题 很简单 就是给一个 三维的迷宫然后 开你起始地点 S 问你能不能到达 出口 E 能的话 需要多长时间 ? #include<stdio.h> #include<string ...
- A - Supermarket
Problem description We often go to supermarkets to buy some fruits or vegetables, and on the tag the ...
- layer的基本使用
layer是layui独立出来的一个弹出层模块 <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- python--5、包
包 包,即一个包含__init__.py文件的文件夹,创建包的目的也就是为了用文件夹将文件(模块)组织起来.python3中,即使包里没有__init__.py文件,仍能import使用.而pytho ...