动手动脑6
1、ExplorationJDKSource.java示例
此示例中定义了一个类A,它没有任何成员:
class A { }
示例直接输出这个类所创建的对象
public static void main(String[] args) {
System.out.println(new A());
}
源程序:
public class ExplorationJDKSource {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new A());
}
}
class A{}
运行结果截图:
运行结果分析:
main方法实际调用的是public void println(Object x),在内部调用String类的valueOf方法;
ValueOf方法内部又调用Object.toString方法:
Public String toString(){
Return getClass()getName()+”@”+Integer.toHexString(hashCode());
}
hashCode方法是本地方法,由JVM设计者实现:
Public native inthashCode();
所以最后输出的是类名A@,后边的输出属于随机的。
2、Fruit.java
代码:
public class Fruit
{
public String toString()
{
return "Fruit toString.";
}
public static void main(String args[])
{
Fruit f=new Fruit();
System.out.println("f="+f);
// System.out.println("f="+f.toString());
}
}
运行结果分析:
main方法实际调用的是public void println(Object x),在内部调用String类的vulueOf方法;
ValueOf方法内部又调用Object.toString方法:
Public String toString(){
Return getClass()getName()+”@”+Integer.toHexString(hashCode());
}
hashCode方法是本地方法,由JVM设计者实现:
Public native inthashCode();
所以最后输出的是类名A@,后边的输出属于随机的。
2、Fruit.java
代码:
public class Fruit
{
public String toString()
{
return "Fruit toString.";
}
public static void main(String args[])
{
Fruit f=new Fruit();
System.out.println("f="+f);
// System.out.println("f="+f.toString());
}
}
注意最后一句,一个字串和一个对象“相加”,得到以下结果:
为何得以上结果?
结果分析:
Fruit类覆盖了Object类的toString方法。在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
2、“方法覆盖(override)”的要点
(1)方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload);
(2)静态方法和最终方法(带关键字final的方法)不能被覆盖;
(3)抽象方法必须在具体类中被覆盖(参见abstract修饰一章)。
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字(最后发现不会用)
源代码:
class A
{
int i=1,j=2;
int plus()
{
return i +j;
}
}
class B extends A
{
int i=10,k=20;//覆盖父类的i
int plus()
{
return i+j+k;//覆盖父类的同名方法
}
}
public class Father {
public void main(String[] args)
{
A a=new A();//定义父类的对象
B b=new B();
System.out.println("a.i="+a.i+","+"a.j="+a.j+","+"a.plus()="+a.plus()); System.out.println("b.i="+b.i+","+"b.j="+b.j+","+"b.plus()="+b.plus());
}
}