一、基础概念
(一)super关键字
super关键字的用法和this相似。this代表的是当前对象。super代表的是父类中内存空间。
子父类中是不会出现同名属性的情况。
(二)继承中、成员变量问题
当成员变量中出现了同名的局部变量,用关键字 this来区分。当父类中出现了同名的成员变量,用关键字 super来区分
(三)继承中,成员函数问题
1、子父类中出现一样的方法(返回值类型、函数名、参数列表等都一样),创建子类对象调用该方法时,运行的是子类中的方法。
2、这种情况称之为函数的另一个特性----(override)覆盖、重写、复写。
3、注意:
子类覆盖父类权限必须大于等于父类的权限。
覆盖中,静态只能覆盖静态,或者被静态覆盖。
(四)继承中,构造函数问题
1、创建子类对象,父类中的构造函数也会运行的原因:子类的所有构造函数中的第一行,都有一个默认访问父类中空参数的构造函数super();
2、调用本类中的构造函数使用this([实参列表])语句。调用父类中的构造函数用super([实参列表])语句。
3、子类实例化的过程,必须先执行父类中的初始化的原因:子类继承了父类中的内容,所以子类在实例化时,必须要先执行父类中的内容。
4、注意:
如果父类中没有空参数的构造函数时,子类的构造函数必须通过super语句指定要访问的父类中的构造函数。
this()语句和super()语句都必须出现在构造函数的第一行。因为初始化的动作要先执行。所以this()语句和super()语句只能存在一个。
二、实例代码(一)
1 class Fu //默认继承 object
2 {3 int num = 4;4 public voidshow()5 {6 System.out.println("父类中的成员函数show ......");7 }8 Fu()9 {10 //默认存在语句superz();11 //显示初始化。12 //构造代码块初始化。
13 System.out.println("父类中的构造函数Fu ......");14 }15 Fu(intx)16 {17 //默认存在语句super();
18 System.out.println("父类中的构造函数Fu ......"+x);19 }20 }21 classZi extends Fu22 {23 //子类和父类的成员变量一样的情况
24 int num = 5;25 //子类和父类的成员函数一样的情况,进行了覆盖
26 public voidshow()27 {28 //局部变量与成员变量也一样的情况
29 int num = 6;30 System.out.println("子类中的成员函数show ......");31
32 System.out.println("num ="+num);//输出子类中局部变量num的值
33 System.out.println("num ="+this.num);//输出子类中成员变量num的值
34 System.out.println("num ="+super.num);//输出父类中成员变量num的值
35 }36 //子类和父类的构造函数一样的情况。子类和父类的语句都执行。
37 Zi()38 {39 //默认存在语句super();
40
41 System.out.println("子类中的构造函数zi ......");42 }43 Zi(intx)44 {45 //默认存在语句super();
46 super(8);//显示指定super的方式来访问父类中的构造函数。必须定义在第一行
47 System.out.println("子类中的构造函数Zi ......"+x);48 }49 }50 classSuperDemo51 {52 public static voidmain(String[] args)53 {54 Zi z1 = newZi();55 z1.show();56 Zi z2 = new Zi(5);57 z2.show();58 }59 }
代码运行
(三)、实例代码(二)
1 classPerson2 {3 privateString name;4 private intage;5
6 //父类Person的构造函数
7 Person(String name,intage)8 {9 this.name =name;10 this.age =age;11 }12 public voidsetName(String name)13 {14 this.name =name;15 }16 public void setAge(intage)17 {18 this.age =age;19 }20 publicString getName()21 {22 returnname;23 }24 public intgetAge()25 {26 returnage;27 }28 }29 //Student继承Person
30 classStudent extends Person31 {32 Student(String name,intage)33 {34 super(name,age);//用super调用父类Person的构造函数。
35 }36 public voidstudy()37 {38 System.out.println("name:"+this.getName()+"age:"+this.getAge()+"study ......");39 }40 }41 //Worker继承Person
42 classWorker extends Person43 {44 Worker (String name,intage)45 {46 super(name,age);用super调用父类Person的构造函数。
47 }48 public voidwork()49 {50 System.out.println("name:"+this.getName()+"age:"+this.getAge()+"work ......");51 }52 }53 classSuperDemo154 {55 public static voidmain(String[] args)56 {57 Student p1 = new Student("xiaohong",18);58 p1.study();59 Worker p2 = new Worker("xiaoming",32);60 p2.work();61 }62 }
代码运行