一 继承
面向对象的三大特征:封装性、继承性、多态性;
继承是多态的前提,如果没有继承,就没有多态;
继承是面向对象设计方法的主要特征
1. 继承的格式:
定义父类:
public class 父类名称 {
//...
}
定义子类的格式:
public class 子类 extends 父类{
//...
}
2. 继承中成员变量/方法的使用:
如果父类和子类的成员变量重名,则创建子类对象时,访问有两种方式:
- 通过子类对象直接访问成员变量(就近原则)
- 通过成员方法间接访问成员变量,成员变量的访问,取决于成员方法的归属
public class Zi extends Fu {
int num = 200;
public void method(){
//num在子类中就存在,所以优先使用子类的num
System.out.println(num);
}
}
当父类中有重名变量num时,调用子类方法,将会优先使用子类中的成员变量num
继承中(重名)成员方法的访问和成员变量的访问相同,创建的子类对象归属是谁,就优先用谁,没有则向上查找。
3. 区分子类方法中重名的三种变量:
- 局部变量:直接写成员变量名
- 本类的成员变量: this.成员变量名
- 父类的成员变量: super.成员变量
public class Zi extends Fu{
int num = 20;
public void method(){
int num = 30;
System.out.println(num);//30局部变量
System.out.println(this.num);//20本类成员变量
System.out.println(super.num);//10父类成员变量
}
}
4. 方法重写:
重写(覆盖、覆写) | 重载 |
---|---|
(Override)方法名称,参数列表、返回值类型相同 | (Overload)方法名称相同,参数列表不同 |
方法覆盖重写:创建的是子类对象,则优先用子类方法
注意:
@Override
为注解,写在方法前,用于检测是不是有效的覆盖重写- 子类方法的返回值必须小于等于父类方法的返回值范围
记:java.lang.Object
是所有类的公共最高父类 - 子类方法的权限必须大于等于父类方法的权限修饰符
记:public> protected> (default) >private
其中default代表留空 - 普通方法可以重写,静态方法不能重写。
5. 继承中构造方法的访问特点:
对于有继承关系的子类,父类的构造方法先打印,子类后打印。
- 子类构造方法中有一个默认的"super()"调用,所以总是父类构造先执行,子类构造后执行。
- 子类构造可以通过super关键字来调用父类的构造。
- super的父类构造调用,必须是子类构造方法的第一个语句,且是唯一的。
6. super关键字的三种用法:
- 在子类的成员方法中访问父类的成员变量
- 在子类的成员方法中访问父类的成员方法
- 在子类的构造方法中访问父类的构造方法
public class Zi extends Fu{
int num = 20;
public Zi(){
super();//访问父类的无参构造方法
}
public void method(){
System.out.println(super.num);//父类中的num
}
public void me(){
super.me();//访问父类的me方法
}
}
7. this关键字的三种用法:
- 在本类的成员方法中访问本类中的成员变量
- 在本类的成员方法中访问本类中的成员方法
- 在本类的构造方法中访问本类中的构造方法
注意:this在构造方法中,也必须是第一个语句,且唯一,因此不能与super方法一起使用
public class Zi extends Fu{
int num = 20;
public Zi(){
this(10);//本类的无参构造,调用本类的有参构造
}
public Zi(int n){
}
public void method(){
this.me();//访问本类中的成员方法
}
public void me(){
System.out.println(this.num);//访问本类中的成员变量
}
}