读书人

一个神奇的现象究竟是无意的摆弄呢?

发布时间: 2013-11-18 11:57:15 作者: rapoo

一个神奇的现象,究竟是无意的摆弄呢?还是命运的使然——子类继承父类的方法的问题(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就放在子类中编译
没有看底层的编译 过程 所以 猜测了下 欢迎指正

读书人网 >Java相关

热点推荐