java语言进阶篇4——继承

1、继承的概念

  • 面向对象三大特征:封装性,继承性,多态性。继承是多态的前提,没有继承就没有多态。
  • 继承主要解决的问题:共性抽取
  • 继承关系当中的特点:①子类可以拥有父类的“内容”;②子类还可以拥有自己的内容。
  • 在继承关系中,“子类就是一个父类”。也就是说,子类可以被当做父类来看,如父类是员工,子类是讲师,那么,“讲师就是员工”。
    继承

2、继承的格式

  • 定义父类(一个普通的类定义):
    public class 父类名{}
  • 定义子类:
    public class 子类名 extends 父类名{}
public class Employee { //父类
    public void method(){
        System.out.println("父类方法执行");
    }
}
public class Teacher extends Employee{ //子类1
    //什么也没有
}
public class Assistant extends Employee{ //子类2
    //什么也没有
}
public class DemoJicheng {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.method(); //父类方法执行  子类可以拥有父类的内容
        Assistant assistant = new Assistant();
        assistant.method();  //父类方法执行
    }
}

3、继承中成员变量的访问特点

  • 在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式:
  1. 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找;
  2. 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找。
  • 区分子类方法中重名的三种变量:
  1. 局部变量:直接写成员变量名;
  2. 本类的成员变量:this.成员变量名
  3. 父类的成员变量:super.成员变量名
public class Fu { //父类
    int num =10; //父类成员变量
}
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  父类的成员变量
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  //30 20 10
    }
}

4、继承中成员方法的访问特点

  • 在父子类的继承关系中,创建子类对象,访问重名成员方法的规则:创建的对象是谁,就优先用谁,如没有,则向上找。
  • 无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找子类。

5、继承中方法的覆盖重写

  • 重写(Override):在继承关系中,方法的名称一样,参数列表也一样。
  • 重载(Overloa):方法名称一样,参数列表不一样。
  • 方法覆盖重写的特点:创建的是子类对象,则优先用子类方法。

6、方法重写的注意事项

  • 覆盖重写必须方法名称一样参数列表也一样,在子类重写方法前写上@Override可以用来检测是否是有效正确的覆盖重写。(也可省略,推荐写上)
  • 子类方法的返回值必须小于等于父类方法的返回值类型。
  • 子类方法的权限必须大于等于分类方法的权限修饰符。(public>protected>不写>private)
  • 什用时候用:对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性的内容,并添加改动新的内容——继承、重写

7、继承中构造方法的访问特点

  • 子类构造方法中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行子类的构造。
  • 子类构造可以通过super关键字来调用父类重载构造。
  • super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造。
  • 所以,子类必须调用父类构造方法,不写则赠送super(),写了则用写的指定的super调用,super只能有一个,且必须是第一个语句

8、super关键字的用法

  • 在子类的成员方法中,访问父类的成员变量。
  • 在子类的成员方法中,访问父类的成员方法。
  • 在子类的成员方法中,访问父类的构造方法。
public class Fu { //父类
    int num =10; //父类成员变量
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {  //子类
    int num = 20; //本类的成员变量
    public Zi(){
        super();   //访问父类构造方法
    }
    public void methodZi(){
        System.out.println(super.num);  //访问父类成员变量
    }
    public void method(){
        super.method();  //访问父类成员方法
        System.out.println("子类方法");
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  //父类方法 
                      //子类方法
    }
}

9、this关键字的用法

  • 在本类的成员方法中,访问本类的成员变量。
  • 在本类的成员方法中,访问本类的另一个成员方法。
  • 在本类的成员方法中,访问本类的另一个构造方法。
  • this(…)调用也必须是构造方法的第一个语句,唯一一个
public class Fu { //父类
    int num =30; //父类成员变量
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {  //子类
    int num = 20; //本类的成员变量
    public Zi(){
        this(123);   //本类的无参构造调用本类的有参构造
    }
    public Zi(int n){
        this(1,2);  //调用本类中另一个构造方法
    }
    public Zi(int n,int m){  //不能再有this()
    }
    public void showNum(){
        int num = 10;
        System.out.println(this.num); //本类的成员变量 10
        System.out.println(super.num); //父类的成员变量 30
    }
    public void methodA(){
        System.out.println("AAA");  //访问父类成员变量
    }
    public void methodB(){
        this.methodA();  // 调用本类中另一个成员方法
        System.out.println("BBB");
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.showNum();  // 20 30
        zi.methodB();  // AAA BBB
    }
}

10、super与this关键字的内存图

super与this关键字的内存图

11、java继承的三个特征

  • 一个类的直接父类只能有唯一一个。
  • java语言可以多级继承。
  • 一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类。
    java继承的三个特征
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值