目录
1.子类继承父类
当子类继承父类后,就可以直接使用父类公共的属性和方法了。私有的需要使用get set方法使用
2.继承的特点
3.成员变量、成员方法的调用
在子类方法中访问成员(成员变量、成员方法)满足:就近原则
也可以通过关键字来访问该成员变量(子类使用this.变量名,父类使用super.变量名)
//父类 public class father { public String name = "父类name"; public int age = 60; void say() { System.out.println("父类say方法"); } } //子类 public class son extends father { public String name = "子类name"; public String job = "无工作"; public void say() { System.out.println("hello wodddd"); } public void view() { System.out.println(name); //调用子类name System.out.println(this.name); //调用子类name this System.out.println(super.name); //调用父类name super say(); //调用子类say方法 this.say(); //调用子类say方法 super.say(); //调用父类类say方法 } }
4.方法重写(覆盖)
方法重写发生在继承关系中 在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
注意1.重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
2.私有方法不能被重写。
3.子类重写父类方法时,访问权限必须大于或者等于父类(缺省<protected <public)
4.子类不能重写父类的静态方法,如果重写会报错的
/** * 重载 可以出现在一类中,也可以出现在继承关系。 */ public double pf(double d) { return d * d; } /** * 重写 覆盖 只能出现继承关系 */ public int pf(int i) { System.out.println("B....pf(int i)"); return i * i; }
5.继承后构造器的特点
子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
原因:
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
- 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化
事实上,在子类的无参和有参构造器中默认存在super(),无论是否书写都会调用父类的构造器,并且在子类构造器执行之前执行
//父类 public class People{ public people(){ System.out.println("父类无参构造器生成!"); } public people (String name){ this.name = name; System.out.println("父类有参构造器生成"); } } //子类 public class men extends People{ public men(){ //super(); System.out.println("子类无参构造器生成!"); } public men(String name){ //super(); this.name = name System.out.println("子类有参构造器生成!"); } } //main函数 public static void main(String[] args){ men man = new men(); System.out.println("--------------------"); men man1 = new men("爸爸"); } //输出结果: //父类无参构造器生成! //子类无参构造器生成! //-------------------- //父类有参构造器生成 //子类有参构造器生成!
super调用父类有参构造函数的作用:
●初始化继承自父类的数据
如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?
●会报错。因为子类默认是调用父类无参构造器的。
如何解决?
●子类构造器中可以通过书写super(...),手动调用父类的有参数构造器
6. 继承中的this和super
通过前面我们大致可以知道this和super的用法以及super在构造器中的作用,那么this有什么用呢?举个例子,子类有参构造器中有两个成员变量,分别是name、age,而在初始化对象的时候,忘记自己的年龄了,只填写了name的值,此时是无法创建对象成功的,然而有了this就不需要但心这个问题了,this的可以使子类中的构造器重构,在创建对象的时候,为其补上未填写的变量。
//子类 public class men extends People{ public men(){ //super(); } public men(String name){ //当使用this时,super自动消失,因此必须放在第一行 this(name,18)//18是在创建对象时补充的值 } public men(String name,int age){ //super(); this.name = name; this.age = age; } } //main函数 public static void main(String[] args){ men man1 = new men("儿子"); }
this(...)和super(...)使用注意点:
子类通过this(...)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的
注意: this(...) super(...)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中