1.
在以上的代码中,main方法调用的是public void println(Object x),这一方法调用了String类的valueOf方法,valueOf方法内部调用Object. toString方法:
1 public String toString(){ 2 return getClass().getname()+"@"+Integer.toHexString(hashCode()); 3 }
hashCode方法是本地方法,作用是返回该对象的哈希码值,由JVM作者实现:
public native int hashCode();
2.
在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
3.
class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends Parent{ public int myValue=200; public void printValue() { System.out.println("Child.printValue(),myValue="+myValue); } }
上述代码的特点是:子类和父类定义了一模一样的字段和方法,运行后得出结论:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(); ((Child)parent).myValue++; parent.printValue(); } }
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的。
4.Java编译器是如何为多态代码生成字节码指令,在程序运行过程中,多态特性又是如何实现的:除了static,final,private和构造器是静态绑定的,如果要调用的方法依赖于隐式参数的实际类型,那么必须使用动态绑定。虚拟机会为每个类的方法建立一个方法表(method table),当真正调用这个方法时,会在这个方法表中寻找匹配的相关方法,先查当前的类的方法中有没有匹配的,然后在查当前类的父类的方法表,找到后虚拟机调用这个方法。使用多态最大的好处是: 当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小。
标签:Java,parent,子类,动脑,printValue,动手,父类,方法,public From: https://www.cnblogs.com/sgle0722/p/16803763.html