# 面向对象的三大特性:
封装,继承,多态
没有继承就没有多态!
继承主要解决的问题就是:共性抽取
java中只能单继承,没有多继承,但是可以多级继承!
# 定义子类的格式:
public class 子类名称 extends 父类名称 {}
# 在继承关系中,变量重名,如何通过子类对象访问
直接通过子类对象访问成员变量:
等号左边是谁,就优先用谁,没有则向上找
间接通过成员方法访问成员变量:
该方法属于谁,就优先用谁,没有则向上找
# 区分重名变量:
局部变量:直接写
父类成员变量:super.变量名
子类成员变量:this.变量名
# 方法覆盖注意事项
1.方法名称必须相同,参数列表也要相同
2.子类方法的返回值必须小于等于父类方法的返回值
3.子类方法的权限必须大于或者等于父类方法的权限
# 继承关系中,父子类构造方法的访问特点
1.子类必须先调用父类构造方法,没写编译器会自动添加一个默认隐含的super()方法,调用父类无参构造方法先执行父类的构造方法,在执行子类自己的构造方法
2.子类构造方法可以通过super关键字来调用父类重载构造
3.super的父类构造的调用必须是子类构造方法的第一个语句,而且有且只能有一个
# super关键字
1.在子类的构造方法中,访问父类的构造方法
2.在子类的成员方法中,访问父类的成员变量
3.在子类的成员方法中,访问父类的成员方法
# this关键字
1.在本类的构造方法中, 访问本类的另一个构造方法
2.在本类的成员方法中, 访问本类的成员变量 //局部变量与成员变量重名
3.在本类的成员方法中, 访问本类的另一个成员方法
this()调用也必须是构造方法中的第一个语句,且唯一
## 注意:
super() 和 this() 两种构造调用不能同时使用
# this & super demo
## 父类
package com.leerep.javabase.extendsDemo.thisDemo;
public class Fu {
String var = "var in Fu";
public Fu(){
}
public Fu(String fu){
System.out.println("父类有参构造,参数为:{"+fu+"}");
}
public void getMethod(){
System.out.println("getMethod in Fu");
}
}
## 子类
package com.leerep.javabase.extendsDemo.thisDemo;
public class Zi extends Fu {
String var = "var in Zi"; //成员变量
public Zi() {
this("[1. this调用本类有参构造]子类无参构造开始执行----> 调用子类有参构造"); //1. this调用本类构造方法
System.out.println("[子类无参构造执行完]");
}
public Zi(String zi) {
super(zi); //1. super调用父类构造方法
System.out.println("{1. super调用父类有参构造}子类有参构造----> 调用父类有参构造");
}
public void getMethod() {
System.out.println("getMethod in Zi");
}
public void getSuperMethod() {
System.out.print("调用getSuperMethod---->{2. super在子类中调用父类getMethod()方法} ");
super.getMethod(); //2. super在子类中调用父类成员方法
}
public void getThisMethod() {
System.out.print("调用getThisMethod---->[2. this在子类中调用父类getMethod()方法} ");
this.getMethod(); //2. this调用本类成员方法
}
//当变量重名时
public void whenVarHasSameName() {
String var = "var in whenVarHasSameName Method"; //局部变量
System.out.println("局部变量:" + var);
System.out.println("3. this访问本类成员变量:" + this.var); //3. this访问本类成员变量
System.out.println("3. super访问父类成员变量:" + super.var); //3. super访问父类成员变量
}
}
## demo
package com.leerep.javabase.extendsDemo.thisDemo;
public class Demo {
public static void main(String[] args) {
System.out.println("创建一个父类:有参构造");
System.out.println("-----------------------------");
Fu fu = new Fu("Fu");
fu.getMethod();
System.out.println();
System.out.println("创建一个子类:有参构造");
System.out.println("-----------------------------");
Zi zi = new Zi("Zi");
zi.getMethod();
zi.getThisMethod();
zi.getSuperMethod();
zi.whenVarHasSameName();
System.out.println();
System.out.println("创建一个子类:无参构造");
System.out.println("-----------------------------");
Zi z = new Zi();
}
}