java继承与覆盖

    java继承是非常重要的一部分。由父类到子孙类,建立起类之间的关系。继承不仅仅可以实现多父类功能的使用和扩展,还可以使程序设计灵活。关键字extends表示类之间的继承关系。还是直接看代码,这样有助于理解。

class Person 
{
    int a;

    Person() 
    {
        a = 10;
        System.out.println("这个是父类的构造器");
    }
}

这个是父类,父类含有一个无参构造函数,下面是子类的实现:

public class men extends Person 
{
    int b;
    men() 
    {
        super(); 
        b = 20;
        System.out.println("这个是子类的构造器");
    }
    public static void main(String[] args) {
        men m = new men();                                   
        System.out.println(m.a + " " + m.b);
    }
}

      men类通过extends关键字实现了对父类Person类的继承。子类也带有一个无参构造方法,最后在main方法里面进行打印输出属性子类对象a和b的值。输出是:

这个是父类的构造器
这个是子类的构造器
10 20

      分析以上程序,子类可以调用父类变量a当然也能引用自身变量b,这一点不难理解,继承当然可以对父类变量进行继承(缺省的访问控制符是friendly)。注意:输出中还输出了父类构造器的标示信息。是不是super()方法的使用呢?将super()方法注释掉以后,结果还是一样。这说明什么问题呢?在这里有必要说一下继承中的显示调用和隐式调用了。

       显示调用:直接在子类中用super()方法进行引用构造函数,可以是带参数构造方法也可不带参数(前面已经详细说过重载)。默认的构造方法时不带参数的,如果在一个类中没有写构造方法,那么系统会自动给该类配一个不带参数的构造方法,但是这个构造方法啥也不做就是了。

      隐式调用:隐式调用在子类对象使用时,解释为一旦使用new关键字创建对象,就会调用父类的无参构造方法。就像上面的实例一样,就算把men类中的构造方法super()注释掉仍然会执行person类的构造方法。可以理解为只要创建对象就会调用该类的无参构造方法

java覆盖

覆盖是继承中经常需要面对的技术。还是先来看一段代码:

 class Super 
   { 
     static String greeting() 
       { 
         return "Goodnight"; 
        } 
      String name() 
        {         
         return "Richard"; 
        } 
  } 
   class Sub extends Super 
   { 
       static String greeting() 
       { 
         return "Hello"; 
       }  
       String name() 
       { 
         return "Dick"; 
       } 
   } 
   class Test 
   { 
      public static void main(String[] args) 
       { 
         Super s = new Sub(); 
         System.out.println(s.greeting() + ", " + s.name()); 
       } 
    }

      以上代码摘自java语言规范。结果输出是:Goodnight, Dick。该实例较好得展示了java覆盖特性。 Super s = new Sub();该语句是覆盖成为可能的关键部分。对象s是sub类的实例,但是虽然变量 s的数据类型为 Super 类。这样在s.greeting() s.name()是就产生了覆盖。先来看name()方法,子类和父类同时有name(),且为实例方法非静态方法。那么在创建对象以后,由于对象的特殊性质,子类的name()对父类的name()方法产生了覆盖。这样就比较好理解后一部分输出了。

      根据以上分析似乎不能用在前一部分的输出了,由于 static String greeting() 方法是类方法(也叫静态方法),静态方法此时不被覆盖的,可以说称之为隐藏。这样就能解释前一部分的输出了。

通过以上结论,可以得出:实例方法被覆盖,静态方法被隐藏

其实不管是覆盖还是重载都是多态的一种情况,关于java多态特性后续会说明。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值