继承
今天继续,复习了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!明儿见!