在java开发实战经典里有这么一段话:在父类里定义了private的成员方法,再到其子类里声明同名的权限为default的成员方法,那么这不算是方法覆写。
可是如下代码执行结果:
public class Person
{
private String name="abc";
private void printMessage(){System.out.println("Person----->print()"+"name="+name); }
private void printMessage2() { System.out.println("Person----->print2()");}
public void fun()
{
this.printMessage();
this.printMessage2();
}
}; public class Student extends Person
{
private String name="xyz";//属性覆写
void printMessage()
{
System.out.println("Student----->print()"+"name="+name+", sex="+sex);
}
public void printMessage2()
{
System.out.println("Student----->print2()");
}
}; public class Main
{
public static void main(String[] args)
{
new Student().printMessage();
new Student().printMessage2();
new Student().fun();
}
}
netbeans里执行结果为:
Student----->print()name=xyz, sex=null
Student----->print()name=xyz, sex=null
Student----->print2()
Person----->print()name=abc, age=0
Person----->print2()
请教是什么原因?谢谢!
可是如下代码执行结果:
public class Person
{
private String name="abc";
private void printMessage(){System.out.println("Person----->print()"+"name="+name); }
private void printMessage2() { System.out.println("Person----->print2()");}
public void fun()
{
this.printMessage();
this.printMessage2();
}
}; public class Student extends Person
{
private String name="xyz";//属性覆写
void printMessage()
{
System.out.println("Student----->print()"+"name="+name+", sex="+sex);
}
public void printMessage2()
{
System.out.println("Student----->print2()");
}
}; public class Main
{
public static void main(String[] args)
{
new Student().printMessage();
new Student().printMessage2();
new Student().fun();
}
}
netbeans里执行结果为:
Student----->print()name=xyz, sex=null
Student----->print()name=xyz, sex=null
Student----->print2()
Person----->print()name=abc, age=0
Person----->print2()
请教是什么原因?谢谢!
这一块你的变量都没有声明哦,还有父类私有的东西子类是不会继承的,对子类是透明的,那么子类中即使写了和父类同样的方法声明,这个也不叫覆盖,是子类自己的方法,谈不上覆盖!!
Person----->print2()对吧??? 我觉得你应该看一下动态绑定。。
默认的访问限定符是protected ,如果子类和父类在同一个包中,子类继承父类除private的成员变量(以及方法)作为自己的成员变量(作为自己的方法);
如果子类和父类不在同一个包中,子类继承父类的protected,public成员变量,并继承父类的protected、public方法作为子类的方法。但不能继承父类的友好变量和友好方法。
我学的太少了,一方面还没搞清楚“子类可以继承的不是父类的所有成员”,另一方面是对覆盖需要再好好理解,再就是要看看动态绑定。
是的,代码贴的有些乱,以后多注意些。
刚学java,请大家多多指导。谢谢!
作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×