第一个源代码public class Parent
{ public void test()
{
System.out.println ( "父类中的test方法" ) ;
}
}
class Son extends Parent
{
public void test()
{
System.out.println ( "子类中的test方法" ) ;
}
public static void main ( String[] args )
{
Parent p=new Son();
p.test();
}
}输出:子类中的test方法
第二种源代码public class ParentTest
{ static void youzi ()
{
System.out.println ( "父类中的方法youzi" ) ;
}
}
class SonTest
extends ParentTest
{
static void youzi ()
{ System.out.println ( "子类中的方法youzi" ) ;
} public static void main ( String[] args )
{
ParentTest pt = new SonTest () ;
pt.youzi () ;
}
}输出:父类中的方法youzi
为什么两次会出现不同的结果呢。不解中
第二个父类的方法是static的
虽然用父类声明的变量,用子类实例化。但是static方法,不属于对象,属于类。
所以调用的方法以后打印出父类方法中的内容。 (小弟为新手,若有不对的地方,还请高手指点)
ParentTest pt = new SonTest () ;
pt.youzi () ;
还是不懂呢。两者为什么会不同呢。
第二段代码我也不太懂。
static 不会被重写,但为什么调用的是父类的方法new的是SonTest 我认为应该调用SonTest的方法啊
2是因为,static实际上是通过类访问的,是在编译的时候就决定了的,不过java也允许通过实例去
访问static方法,我觉得java这个是有点让人误解。
变的是引用,实例没变(指向的还是那块内存空间),我认为虚拟机是先去找子类的方法,没有找到就去执行父类的方法第二个源码是打破多态的范列,输出父类的方法是因为static是不支持多态的,只要在类加载时静态成员或方法就会被加载,与对 象无关具体多态是怎么实现的可以看一下虚拟机的原理一书.
<<The JavaTM Virtual Machine Specification Second Edition>>以上是本人愚见,希望高手指点
ParentTest pt = new SonTest () ;
pt.youzi () ;
看到pt前面的那个ParentTest了吗?他的类型是ParentTest,这个时候在内存中new SonTest ()被看成了ParentTest pt = new ParentTest();也就是说子类的对象的特征都显示不出来了,我表达得不是很清楚,
你自己去研究研究!
"这句话不太明白,能详细说一下吗?
(小弟为新手,若有不对的地方,还请高手指点)
等待ing!!!
执行JAVA时,显示
Exception in thread "main" java.lang.NoSuchMethodError: main
这是怎么回事啊?求助........
{ static void youzi ()
{
System.out.println ( "父类中的方法youzi" ) ;
}
}
public class SonTest
extends ParentTest
{
static void youzi ()
{ System.out.println ( "子类中的方法youzi" ) ;
} public static void main ( String[] args )
{
ParentTest pt = new SonTest () ;
pt.youzi () ;
}
}
改下就好了!
说第二种
父类引用指向子类对象:父类中youzi()方法是静态的,其实就是子类中的youzi()并没有覆盖父类中的youzi(),
如果是父类引用ParentTest pt=new SonTest() ,当pt.youzi()时会调用父类中的youzi(),因为子类中的youzi()和父类中的youzi()不是具有类继承关系的方法了,pt会找子类中覆盖了父类的youzi()方法(注意是先找子类中的),找不到,就调用父类中的youzi()方法;
如果是SonTest pt=new SonTest(),那当然会调用子类的youzi()了;其实《Thinking in Java》第四版中也提到过这个问题,当父类中的被覆盖的方法是private或final,父类引用指向子类对象时候,调用的也是父类的方法。