一个神奇的现象,究竟是无意的摆弄呢?还是命运的使然——子类继承父类的方法的问题(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
[解决办法]
按照测试结果来看 应该只是个引用
本身并没有跟父类完全一样的方法
或者说继承来的 没有显示的方法 是这样的
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就放在子类中编译
没有看底层的编译 过程 所以 猜测了下 欢迎指正