A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sanguodouble1 中级黑马   /  2014-4-19 17:14  /  1132 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sanguodouble1 于 2014-4-20 19:56 编辑
  1. package com.test;

  2. public class Test3 {
  3.         public static void main(String[] args) {
  4.                 Father f = new Son();
  5.                 f.normal();
  6.                 f.sMethod();
  7.                 f.pMethod();
  8.         }
  9. }

  10. class Father {
  11.         public void normal() {
  12.                 System.out.println("父类普通方法被调用");
  13.         }
  14.         public static void sMethod() {
  15.                 System.out.println("父类静态方法被调用");
  16.         }
  17.         private void pMethod() {
  18.                 System.out.println("父类私有方法被调用");
  19.         }
  20. }

  21. class Son extends Father {
  22.         public void normal() {
  23.                 System.out.println("子类普通方法被调用");
  24.         }
  25.         public static void sMethod() {
  26.                 System.out.println("子类静态方法被调用");
  27.         }
  28.         private void pMethod() {
  29.                 System.out.println("子类私有方法被调用");
  30.         }
  31. }
复制代码


如上所示,
sMethod方法调用的是父类的方法,而pMethod直接编译器报错,
谁能解释一下为什么多态不能重写父类的静态方法和私有方法吗?
我问的是底层的实现机制



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
1.静态方法是属于类的
2.私有属性当然不能被覆盖,例如生活中,别人私有的东西,他没有共享出来,你能拿到?
回复 使用道具 举报
你问的根本就不是多态问题,你问的是继承问题,毕老师视频关于这个问题还专门讲解了一下,你自己再仔细去看看继承那几集视频吧
回复 使用道具 举报
菜小徐 发表于 2014-4-19 17:21
你问的根本就不是多态问题,你问的是继承问题,毕老师视频关于这个问题还专门讲解了一下,你自己再仔细去看 ...

我问的就是多态,没看到子类里面还是写了一模一样的方法吗?
这是这个方法跟父类的方法没有实现重写而已

所以,为什么这样写Java就会判定他是没有重写的?
Java关于重写的底层机制是什么?
回复 使用道具 举报
SyouRai_Tsk 发表于 2014-4-19 17:20
1.静态方法是属于类的
2.私有属性当然不能被覆盖,例如生活中,别人私有的东西,他没有共享出来,你能拿到? ...

静态方法确实是属于类
但现在子类内部有两个同名称的静态方法了,
如果这时候调用子类对象的那个静态方法的话,虚拟机是不会去找父类方法的。我问的是这个机制怎么实现的?
回复 使用道具 举报
以毕老师视频将static关键字的例子为例. 一个父亲,一个儿子,父亲是中国人,儿出生也应该是中国人吧,可是儿子移民出国了,改了国籍,比如美国。那么儿子是不是就是美国人了呢。下面再举个例子,
父亲   小明   = new 儿子(小明),此时我问父亲是哪国的,答案是中国,小明是哪国的,因为移民了,是美国。静态方法和静态属性道理是一样的。所以结论是,静态的方法属性是可以继承的,但是子类如果有同名的静态方法和属性,不是重写,只是隐藏了,能说小明不是中国人么!  我是这样理解的..
回复 使用道具 举报
左拉 中级黑马 2014-4-19 18:38:50
7#
本帖最后由 左拉 于 2014-4-19 18:40 编辑
  1. package com.test;

  2. public class Test3 {
  3.         public static void main(String[] args) {
  4.                 Father f = new Son();
  5.                 f.normal();
  6.                 f.sMethod();
  7.                 f.pMethod();
  8.         }
  9. }

  10. class Father {
  11.         public void normal() {
  12.                 System.out.println("父类普通方法被调用");
  13.         }
  14.         public static void sMethod() {
  15.                 System.out.println("父类静态方法被调用");
  16.         }
  17.         private void pMethod() {
  18.                 System.out.println("父类私有方法被调用");
  19.         }
  20. }

  21. class Son extends Father {
  22.         public void normal() {
  23.                 System.out.println("子类普通方法被调用");
  24.         }
  25.         public static void sMethod() {
  26.                 System.out.println("子类静态方法被调用");
  27.         }
  28.         private void pMethod() {
  29.                 System.out.println("子类私有方法被调用");
  30.         }
  31. }
复制代码


1:静态方法是属于类独有的,所以不可能继承,类似于private,可以重写静态方法,但重写后的静态方法不支持多态。本质是因为对静态方法在运行期只查找显式声明的类的内存,这就意味着不可能是多态。
2:f.pMethod();报错是因为Father f = new Son();是在其他的类中,pMethod()在子类和父类中都是私有访问权限,根本对外部不可见,一个类怎么可以访问其他类中的私有方法?
3:重写方法时有个良好习惯是:扩大访问权限,所以改成public吧= =、

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马