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

继承

      今天继续,复习了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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值