LZ最近在看一些面试的书,发现关于继承和引用这一块之前的知识有点出入,首先是在继承这里,关于调用具体的方法,因为得看具体的代码,比如下面这个代码:
class classA
{
public void printValue()
{
System.out.println("classA");
}
}
class classB extends classA
{
public void printvalue()
{
System.out.println("classB");
}
}
public class Test
{
public static void main(String args[])
{
classB objectB = new classB();
objectB.printvalue();
classA as = (classA)objectB;
as.printValue();
as = new classA();
as.printValue();
}
}
这里输出的classB classB classA,虽然这里被强制转化了,但是仍然执行子类的方法,那么在调用as的方法时候,就会自动调用这个classA的方法。
另外还有一个很容易错的地方:
public class Test5
{
public static void main(String args[])
{
Father father = new Father();
Father child = new Child();
System.out.println(father.getName());
System.out.println(child.getName());
}
}
class Father
{
public static String getName()
{
return "Father";
}
}
class Child extends Father
{
public static String getName()
{
return "Child";
}
}
这个返回的结果是Father和Father。其中这是因为这里的getName方法是static的,也就是静态方法,它们在内存中的地址空间是固定的,而且不存在冲突的问题,也就是说它们占用的是不同的内存地址空间。也就是说静态方法是不能被覆盖的。所以还是都是输出的是Father。如果要能被覆盖,那么得这么改
public class Test5
{
public static void main(String args[])
{
Father father = new Father();
Father child = new Child();
System.out.println(father.getName());
System.out.println(child.getName());
}
}
class Father
{
public String getName()
{
return "Father";
}
}
class Child extends Father
{
public String getName()
{
return "Child";
}
}
将这个静态去掉,这样就可以覆盖方法了,那么我们就可以实现我们想要的结果:Father Child。