关于JAVA多态的一些笔记

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中的新增属性或方法。

后记:以上内容都是今天课堂的内容,我已经好几节课没去上了,自以为老师讲的我已经会了,事实上,有很多实验室那天讨论会讨论的内容老师轻易的解决了。
以后还是要多去听听课的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值