因为 void method1() 是声明为private 的,你把private 去掉就得到你想要的结果了。
解决方案 »
- 利用JNI 调用MessageBox 只闻其声不见其形
- 为什么java.lang.Math.sqrt(2)=1.4142135623730951
- 在java里面如何把2进制专成8进制,或者10进制,有具体的函数么
- 初学 applet的问题
- 树型控件中如何在我选中的节点上面点击右键时出现下拉菜单?
- jar 文件的运行问题
- 关于JVM种类的初始化,牛人请进。
- jboss and tomcat are independed each other?or not ?
- 本人有意学JAVA希望各位大侠给点建议~要的不?谢谢!!!
- java网络读取遇到-1的疑惑
- 怎样把一个字符串中的\\u变为\u,急?
- 如何让控件随着窗口的大小变化?
Child里面的mothed1()实际上是自己的
跟父类的不相干
请问楼主,这是什么意思?
你调用的就是method2()啊,Child里没有method2(),当然调用其父类的啊
{
private void method1()
{
System.out.println("Parent's method1()");
}
public void method2(Child c)
{
System.out.println("Parent's method2()");
c.method1();
}
}class Child extends parent
{
public void method1()
{
System.out.println("Child's method1()");
}
public static void main(String args[])
{
Child c = new Child();
parent obj=new Child();
obj.method2(c);
}
}我猜想楼主的思想是想用paret里的method2()去调用Child里的method1()函数,如果是这样的话,那么我想应该在调用父类的method2()时传递一个子类的引用给它,然后再用这个子类的引用去调用子类的方法,不知道我说得对不对,请大家指正.
子类的方法:public void method1()这两个的修饰符是不一样,所以不形成函数重写,如果将它们的修饰符改成一样就可以实现楼主的想法了.
如果这两个方法是在同一个类里,那可以形成函数重载,因为函数重载只需参数表类型或个数不同,修饰符可以不同,而函数重写需要完全相同.
Java调用对象方法的执行过程:
1、编译器检查对象声明类型和方法名;
2、编译器检查方法调用中提供的参数类型;
3、如果方法是private、static、final的,或者是一个构造器,编译器就能准确地知道应该调用哪个方法。(称为静态绑定)对于其他方法,根据隐式参数的实际类型来决定,在运行时执行动态绑定。
4、当程序运行并且使用动态绑定方法时,虚拟机就必须调用同obj所指向的对象的实际类型相匹配的方法。
从这个程序看,首先obj会检查Parent和Child两个类里面所有的method2()方法,发现只有Parent类里面有method2()方法,所以就执行它;然后继续检查method1()方法,发现Parent和Child类里面各有一个,这时编译器发现Parent类里面的方法是private,所以执行静态绑定,运行Parent类里面的method1()方法。
如果将Parent类里面的method1()方法改为public,则会变成动态绑定,根据第4个原则,执行Child类里面的method1()方法。
这下我对静态帮定明白多了.
其实我也懵懵懂懂,看了贴后实践了一下,然后再查书才明白的:)
大家对Java的机制理解越深才能编出更好的程序
如果写成
public class Parent
{
public void method1()
{
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
}class Child extends Parent {
public void method1() {
System.out.println("Child's method1()");
}
public void method2() {
System.out.println("Child's method2()");
}
public static void main(String args[]) {
Parent obj = new Child();
obj.method1();
//Child obj0 = new Parent();
}
}
在eclipse下显示的obj.method1 为什么会是parent.method1呢?运行的结果却是Child's method1()
还望多多指教
静态branding
Parent obj = new Child();
obj.method1();
}
你这个就是属于后期绑定正好与静态绑定向反,多态就是后期绑定,属于向上转型,Java的内部机制会找到相应的method执行的。
-------
| Parent|
-------
↑
-------
| Child |
-------
1.向上转换问题(UP—CASTING)问题,就是说子类和父类的关系是IS-A关系,不过我目前还是对这个不太明白,希望大家能给我讲解一下啊,在这个例子中:
Parent obj = new Child(); //创建的过程是怎么样的呢?是不是先是右边通过类Child的构造函数
//创建一个Child的对象,然后赋给Parent的对象obj 呢?
由此我还有对强制转换的问题
比如:int a;
folat 3f;
a=(int)(3f+1);
这个就是强制转换啊,可int 和float是不同的数据类型,和父类子类的继承有什么关系呢? 上面的问题是不是能有一个原理来解释呢?2.override重置/复写的问题
这个词在英语里好象是超越的意思,这里涉及的是子类继承父类时override父类方法的问题,
好象原则是只能使开放度变的更私有,就是说public->private而不能private->public.这就应该和
真正执行机制有关系对吗?有介绍JVM执行机制的资料推荐吗?谢谢!
偶是这么理解的!
class Parent
{
static
{
System.out.println("Parent's static block");
}
public Parnet()
{
System.out.println("Parent's constructor");
}
private void method1()
{
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
}class Child extends Parent
{
static
{
System.out.println("Child's static block");
}
public Child()
{
System.out.println("Child's constructor");
}
public void method1()
{
System.out.println("Child's method1()");
}
public static void main(String args[])
{
Parent obj=new Child();
obj.method2();
}
}
建议好好看看TIJ的有关继承的章节,里面讲的很清楚。