1、在进行多态调用对象时,如:
class A
{
int i=99;
public void run()
{
}
}
class B extends A
{
int i=1;
}
public static void main(String [] args)
{
A a=new B();
System.out.println(a.i);
}
此时输出的属性i的值应该是99。因为在JAVA中属性没有覆盖之说,只有隐藏。而此时,a的值就是A类对象。因此调用ia.i输出的自然是99.
当然,当第17行改成 B b=new B();的时候,输出的就会是B类中的值1。
2、在多态当中,一个子类继承父类的时候,子类就会将父类中的所有方法继承下来,也就是说,子类(还是上面的 A,B类)B中方法run还是有的,而且 new B的时候,同样会给run 方法分配空间;
但是属性就不同,尽管子类会隐藏父类的属性,(B中也新建了一个i 但是父类A中的并不是不存在了,这个i同样会在new B的时候分配一个给父类的i。也就是说,但新建一个B的实例的时候,会有两个i,想要调用父类的i就得通过关键字 super.
这里可以理解成,父类的i其实是在子类中的,但是为了区分开来,就必须用super关键字。
3、进行覆盖的时候,程序看到的是子类最新覆盖的程序。
class A
{
public A()
{
m1();
}
int i=99;
public void m1()
{
System.out.println("Show in A");
}
public void run()
{
}
}
class B extends A
{
int i=1;
}
@Override
public void m1()
{
System.out.println("Show in B");
}
public static void main(String [] args)
{
A a=new B();
System.out.println(a.i);
a.m1();
}
如上面的这个代码,问这个代码的输出结果是什么?
结果是
Show in B
99
Show in B
———————-
为什么会出现这个结果呢?
虽然新建一个B的对象的时候A的构造方法会启用,该构造方法会调用方法m1( )
但是在后面的子类B当中,对m1( ) 的方法进行了覆盖,因此程序就只能见到最新覆盖的方法了、
4、子类如果向上转换了,如 A a =new B(); 这个时候a就不能调用B中的新增属性或方法。
后记:以上内容都是今天课堂的内容,我已经好几节课没去上了,自以为老师讲的我已经会了,事实上,有很多实验室那天讨论会讨论的内容老师轻易的解决了。
以后还是要多去听听课的。