小码哥杯java程序比赛复习(三)继承与super

来源:互联网 发布:asm算法简介 编辑:程序博客网 时间:2024/05/16 19:11

继承

      今天继续,复习了Java的继承多态有关知识点,做出一些总结,欢迎拍砖。

      一.Java的继承具有单继承的特点。

      二.继承的好处是:子类拥有父类的所有属性和方法。(注:属性和方法为private修饰的不可被继承)

      三.方法重写的规则:返回值类型,方法名,参数类型及个数,均需要和父类继承的方法相同。 

      四.继承的初始化顺序:

      1.初始化父类再初始化子类;

      2.先执行初始化对象中的属性,再执行构造方法中的初始化;

      五.final关键字:

          被final关键字修饰的东西是不能被修改的,final可以修饰变量,方法和类。

          被final修饰的:

          类:不允许被继承;

          方法:该方法不允许被覆盖(重写);

          属性:该类的属性不会进行隐式的初始化,(类的初始化属性必须有值);

            或在构造方法中赋值(但只能选其一)

          变量:该变量的值只能赋一次值,即变为常量。

     

<span style="font-size:18px;">public class Test2 {//final public int age=10;//1.在初始赋值中进行初始化final public int age;public String name;public void eat(){System.out.println("动物具有吃东西的能力");}public Test2(){System.out.println("Test2类执行了...");//2.在构造方法当中进行初始化age=20;}}</span>
      六.super关键字:

        在对象内部使用,可以代表父类对象。

        super的应用:

        1.子类的构造过程当中必须调用其父类的构造方法;(当new子类的构造方法时,它相当于隐式的写了一个super关键字,帮我们调用了父类的构造方法。)

        2.若子类的构造方法没有显示调用父类的构造方法,则系统默认的调用父类无参的构造方法;

        3.若显示的调用构造方法,必须在子类的构造方法的第一行进行调用;
        4.若子类构造方法中既没有显式的调用父类的构造方法,而父类又没有无参的构造方法,则编译出错;



关于对super父类构造器的调用,楼主在这里做一些小小的总结:

       在一个构造器中调用另一个重载的构造器使用this调用来完成,在子类构造器中调用父类构造器使用super调用来完成。

       

class Base{public double size;public String name;public Base(double size,String name){this.size=size;this.name=name;}}public class Test2 extends Base{public String color;public Test2(double size,String name,String color){//通过super调用来调用父类构造器的初始化过程super(size,name);this.color=color;}public static void main(String[] args){Test2 tt = new Test2(5.6,"测试对象","红色");//输出Test2对象的三个实例变量System.out.println(tt.size+"--"+tt.name+"--"+tt.color);}}
运行结果为:5.6--测试对象--红色

       通过这个例子发现,使用super调用和使用this调用很像,区别在于super调用的是其父类的构造器,而this调用的是同一个类中重载的构造器。因此,使用super调用父类构造器也必须出现在子类构造器执行体的第一行,所以this调用和super调用不会同时出现。

       不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会隐式的调用父类的无参构造器一次,子类构造器调用父类构造器分为如下三种情况:

       1.子类构造器执行体的第一行使用super显示调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器;

       2.子类构造器执行体的第一行代码使用this显示调用本类中重载的构造器,系统将根据this调用里传入的实参列表调用本类中的另一个构造器。同时,执行本类中另一个构造器时也会调用父类构造器。(这点注意!很容易判断错!)

      3.子类构造器执行体中既没有super调用,也没有this调用时,系统将会隐式的调用父类无参数构造器。

      不管上面哪种情况,当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行其父类构造器...依此类推,创建任何Java对象,最先执行的都是java.lang.Object类的构造器.

       好啦,我们来一个例子,猜猜结果是多少呢?

class Creature{public Creature(){System.out.println("Creature无参数的构造器");}}class People extends Creature{public People(String name){System.out.println("People带一个参数的构造器,"+"该人的name为"+name);}public People(String name,int age){//使用this调用同一个重载的构造器this(name);System.out.println("People带两个参数的构造器,"+"其age为"+age);}}public class Test2 extends People{public Test2(){//显式调用父类又两个参数的构造器super("王嘉鹏",20);System.out.println("Test2无参数的构造器");}public static void main(String[] args){new Test2();}}

运行结果如下:(童鞋们自己运行看看吧~)

       从结果可知,创建任何对象总是从该类所在继承树的最顶层类的构造器开始执行,然后依次向下执行,最后才执行到本类的构造器。如果父类通过this调用了同类中重载的构造器,就会依次执行此父类的多个构造器。

       最后想借用王安石的话和大家分享下最近学习的心得:

       世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。

       编程花时间,算法花时间,再加上学习的考研课程更花时间,但是正是非常时期才能锻炼出自己的学习能力和时间管理的能力,go!明儿见!

1 0
原创粉丝点击