日期:2014-05-20  浏览次数:20674 次

一个神奇的现象,究竟是无意的摆弄呢?还是命运的使然——子类继承父类的方法的问题(ps:真心被弄迷糊了)

class Base
{
    private String showMe()
    {
        return "Base";
    }

    public void print()
    {
        System.out.print(showMe());
    }
}

public class Sub extends Base
{
    public String showMe()
    {
        return "Sub";
    }

    
//    public void print()
//    {
//        System.out.print(showMe());
//    }
    
    public static void main(String[] args)
    {
        Sub sub = new Sub();
        sub.print();
    }
}

把注释部分取消注释,试试结果如何?
java 继承 方法 private

------解决方案--------------------
引用:
1,首先完全没有改变父类中print()方法的内容,只是显示出来,这个是重写?
2,其次没有将print()显示时,也就是注释掉print()时,子类肯定是继承了print()方法,那么这个所谓的继承究竟是对父类的引用,还是本身已经有实实在在的代码来写上了print()方法只是没显示在界面而已?


按照测试结果来看 应该只是个引用 
本身并没有跟父类完全一样的方法
或者说继承来的 没有显示的方法 是这样的 

public void print()
    {
        super.print();
    }


但是不知道是不是这样  我是这么理解的 
具体还得看java的继承 是怎么个实现的吧?  坐等楼下大牛解答
------解决方案--------------------

public static void main(String[] args)
{
    Sub sub = new Sub(); 
    sub.print(); 
    /*
     sub 自己没有print所以调用的是Base 的print,因为继承了Base。
     Base 的print 方法调用的showome() 是this.showme(),
     Base中的showme 是private 的,不能被重写,所以不会检查子类有没有重写直接调自身的showme()
     ------
     去sub的print注释后,调用shome 直接就是调用自己的print 压根就跟继承没多少关系
     因为你使用的是Sub sub = new Sub(); 非 Base sub = new Sub();
     -----
     试一下把Base 的showme() 改为public ,其它维持原状,相同的程序就会打印sub了。
     调用Base 的print --> print 调用this.showme() ,因为new 的是Sub,而且showme 是public是可被重写的
     就会检查Sub有没有重写showme ,发现重写了调用Sub的showme
     */
}

------解决方案--------------------
看了一下,楼主一直想不明白的是方法的重写,建议好好理解一下吧。

子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。
子类中的私有方法不可以被覆盖。
在子类覆盖方法中,继续使用被覆盖的方法通过super.函数名获取。
------解决方案--------------------
个人的 一个猜测:在子父的继承中  java的类在编译的成.java的字节码的时候 在编译方法的时候
首先会判断方法里面的 变量的修饰符  如果是private(比如这里的 private String showMe()因为返回的是一个字符串 可以看做是变量吧)就直接在父类中编译了
如果 方法里面的变量的修饰符不是 private就放在子类中编译 
没有看底层的编译 过程 所以 猜测了下  欢迎指正