Java之继承

继承

概述

  如果多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个累就无需再定义这些属性和行为,只要去继承这个单独的类即可。

  其中,多个类称为子类,派生类,单独的那一类称为父类、超类、基类。

  一般情况下,父类更通用,子类更具体。我们可以通过继承,使多种事物之间形成一种关系。

定义

  

继承的格式

  通过 extends关键字,可以声明一个子类继承另一个父类:

public class FuClass{
	//...
}
public class ZiClass extends FuClass{
	//...
}

代码演示:

/*
  定义一个员工类Employee,父类
*/
public class Employee {
     String name;// name属性
     int id;//  工号属性
    // 定义一个员工的工作方法
    public void work() {
        System.out.println( name + "努力的工作!");
    }
}
/*
    定义讲师类Teacher  继承  员工类Employee
*/
public class Teacher extends Employee {
    
    // 定义讲师类中的专有的方法
    public void teach() {
        System.out.println(name + "在教课");
    }
}
/*
   定义一个测试类
*/
public class TestExtendsDemo01 {
    public static void main(String[] args) {
        // 创建一个讲师类
        Teacher t = new Teacher();
        
        // 为该员工类的name属性赋值
        t.name = "小张";
        // 调用该员工中的教课的方法
        t.teach();
        
        // 调用Teacher类继承过来的work()方法
        t.work();
    } 
}

继承后的特点——成员变量

 成员变量不重名

  如果子类父类中定义的成员变量名字不重名,这时的的访问没有任何影响。

 成员变量重名

  在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:

  • 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有会向上找
  • 子父类中出现了重名的成员变量时,在子类中想要访问父类中的非私有的成员变量时,需要使用super关键字,修饰父类的成员变量,类似于this操作。

 使用格式:

super.父类的成员变量名

 备注:
  Fu类中的成员变量是非私有的,子类中可以直接访问,若Fu类中的成员变量私有

了,子类不能直接访问。通常编码时,我们遵循的是封装的原则,使用private关键字

修饰成员变量,那么如何访问父类中的私有成员变量呢?可以借助于父类中的提供的

公共的setXxx和getXxx方法。

继承后的特点——成员方法

 成员方法不重名

  如果子类父类中出现不重名的成员方法,这时的调用是没有【任何影响的】,对

象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在该方法那么就执行

类中的方法,若子类中不存在该方法那么会执行·父类中的成员方法。

public class Fu {
     int num = 10; 
    // 展示
     public void show() {
         System.out.println("Fu类中show方法在执行!");
         System.out.println("Fu类中的成员变量num:" + num)
     }
}
public class Zi extends Fu {
    int num = 20;
    // 展示
    public void show2() {
        System.out.println("Zi类中的show方法在执行!");
        System.out.println("Zi类中的成员变量num:" +num);
    } 
}
public class TestExtends {
    
    public static void main(String[] args) {
        // 构建子类对象
        Zi zi = new Zi();
        zi.show();// 调用父类当中的show方法   Fu类中show方法在执行!  10 
        zi.show2();// 调用子类当中的show2方法 Zi类中的show方法在执行!20 
    }  
}

成员方法重名——重写(Override)

 如果父子类中出现了重名的成员方法,这时的访问是一种特殊情况。叫做方法重写。

  • 方法重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列

表),会出现覆盖效果,也称为重写或者复写,简称“【声明不变,重新实现】”。

重写的应用

 子类可以根据需要,定义特定于自己的行为,即沿袭了父类的功能名称,有根据子类

的需要重新实现父类方法,从而进行功能拓展。

 重写:方法的名称一样,参数列表【一样】,返回值类型【也一样】,重写前提有继

承关系

 重载:方法的名称一样,参数列表【不一样】,返回值类型无要求,在本类中。

 注意事项:

  • 子类方法重写父类方法,必须要保证权限要大于等于父类权限
  • 子类方法覆盖父类方法,返回值类型、方法名称和参数列表必须要一模一样。

继承后的特点-----构造方法

  1. ​ 构造方法的名字和类名要保持一致,所以子类是无法继承父类当中的构造方法

  2. ​ 构造方法的作用一般是用来初始化成员变量,所以子类在初始化的过程中,必须先执行父类中的初始化动作。子类的构造方法当中默认有一个super()方法,表示调用的父类的构造方法,父类的成员变量初始化之后,才可以给子类使用

public class Fu {
    private int n;
    public Fu(){
        System.out.println("Fu()");
    }  
}
public class Zi extends Fu {
    public Zi() {
        // super() 调用父类中的构造方法  隐式调用
        System.out.println("Zi()");
    }  
}
public class TestExtendsDemo04 {
    
    public static void main(String[] args) {
        Zi zi = new Zi();      
    }  
}
// 输出结果
// Fu()
// Zi()

super 和 this

 父类空间优先于子类对象产生

  在每次创建子类对象的时候,先初始化父类空间,再创建子类对象。目的在于子类

对象中包含了其对应的父类空间,便可以包含父类的成员,如果父类成员非私有,则子

可以随意使用父类成员,代码体现在子类的构造方法调用时,会先调用父类的构造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值