Java类的继承与方法覆盖

1.继承

1.什么是继承

继承就是子类继承父类的一些属性和方法,继承后在子类中可以调用父类的方法以及访问父类的属性

2.继承的语法格式

【修饰符列表】 class 类名 extends 父类名{

 }

3.继承的作用

继承的基本作用是代码复用,但是继承最重要的作用是有了“继承”才有后面的方法覆盖与多态

4.继承的范围 

  • 除了私有属性不支持继承,构造函数不支持继承,其他所有数据都支持继承。
  • 虽然Java中只支持单继承,但是一个类可以间接继承其他类【比如A继承B,B继承C,那么A直接继承B,间接继承C】
  • Java所有类都默认继承JavaSE库中提供的java.lang.Object类

5.继承实例演示 

比较下面两个代码的不同之处
代码1:
//父类
public class School2 {
   static String name="春晖中学";
   private String xiaozhang;

   public int add(){
       return 1;
   }
}

//子类
class School2Text{
    public static void main(String[] args) {
        //创建一个School2Text对象
        School2Text tea=new School2Text();
        //调用School2的add()方法
        System.out.println(tea.add());//显然这是不行的,因为School2Text没有这个方法
        //访问School2Text的name属性
        System.out.println(tea.name);//显然这也是不行的,因为School2Text没有这个属性

    }
}


将School2Text继承School2
代码2:

//父类
public class School2 {
   static String name="春晖中学";
   private String xiaozhang;

   public int add(){
       return 1;
   }
}

//子类
class School2Text extends School2{//继承School2
    public static void main(String[] args) {
        //创建一个School2Text对象
        School2Text tea=new School2Text();
        //调用School2的add()方法
        System.out.println(tea.add());//1
        //访问School2Text的name属性
        System.out.println(tea.name);//春晖中学

    }
}

6.注意:

继承严格上来说不能继承父类的私有属性,但是可以通过get与set访问访问父类的私有属性,简单的说就是如果你的子类属性和父类属性一致,那么不需要再子类中再定义属性,只需要调用父类的get与set方法就就可以使你的子类对象也拥有父类的属性,看看下面的例子

//父类(银行系统)
class InHeritText{
    private int age;//开户时间
    private String name ;//用户名字
    private int num;//用户余额
    private int test;//用户信誉额度
    static  String khh="中国农业银行";//开户行

    //开户时间——>set、get

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //用户名字——>set、get

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //用户余额——>set、get

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    //用户信誉额度——>set、get

    public int getTest() {
        return test;
    }

    public void setTest(int test) {
        this.test = test;
    }
}

//子类(用户账户)
public class InHerit extends InHeritText{


    public static void main(String[] args) {
        //创建一个用户(子类)
        InHerit user1=new InHerit();
        //调用银行系统的setAge方法为user1用户注册开户时间
        user1.setAge(2022);
        //输出开户时间
        System.out.println(user1.getAge());//可以看到我们的子类并没有age属性,但是也可以为其赋值
    }
}

2.方法覆盖

1.什么是方法覆盖

当父类中的方法无法满足子类的需求时,子类可以在自己类中对该方法进行重写,这个重写的过程叫方法覆盖【简单的说方法覆盖就是对方法的重写,重写后的方法会覆盖父类的方法,所以子类对象在调用时候调用的是自己的方法

2.方法覆盖的要求

在有继承的两个类中,方法覆盖要求重写的方法必须与原方法一模一样,{}里面的Java语句除外

3.方法覆盖与方法重写的区别

前面我们说过,方法重载是当在同一个类中定义多个同名的方法,但这些方法具有不同的参数类型或者参数个数不同,以满足多个方法功能相似时候,可以调用同一个方法满足所有的业务需求,而方法覆盖是在不同的类定义相同的方法,当父类的方法无法满足子类的业务需求时候进行的,我们来看看下面的代码更好的了解两者的不同

public class schol {
    //这是方法重载
    public static int add(int a,int b){
        int A=a+b;
        return A;
    }
    public static double add(double a,double b){
        double A=a+b;
        return A;
    }
}
class ool extends schol{
    //因为这个类继承了上面的类,所以这个类的对象可以调用上面的方法
    //但是现在我们的需求发生变化,上面的add方法无法满足我们的减法需求,进行方法重写
    public static int add(int a,int b){
        int A=a-b;
        return A;
    }
}
//测试
class CeShi{
    public static void main(String[] args) {
        ool ool1=new ool();
        System.out.println( ool1.add(12,10));//2
        //可以看到重写后的方法就不再执行上面的加法操作


    }
}

4.方法覆盖实例

通过上面的代码我们大体可以明白方法覆盖的大概用法,下面写一个更直观的实例加深大家的印象

//班级类
public class FuGai {

    public void some(){
        System.out.println("所有班级都在读书");
    }
}

//101班继承班级类
class Fg101 extends FuGai{

}

//102继承班级类
class FG102 extends FuGai{

}

//测试类
class FuGai2{
    public static void main(String[] args) {
        FuGai Stu=new FuGai();
        Stu.some();//所有班级都在读书
        Fg101 Stu2=new Fg101();
        Stu2.some();//所有班级都在读书
        FG102 Stu3=new FG102();
        Stu3.some();//所有班级都在读书
//可以看到所有的输出都是一样的,但是每个班的活动是不同的,那么就有必要进行方法重写


    }


}


把代码更改为下面的代码:

//班级类
public class FuGai {

    public void some(){
        System.out.println("所有班级都在读书");
    }
}

//101班继承班级类
class Fg101 extends FuGai{
//101班在唱歌,这里进行方法重写
public void some(){
    System.out.println("101班在唱歌");
}
}

//102继承班级类
class FG102 extends FuGai{
//102班在跳舞,这里进行方法重写
    public void some(){
        System.out.println("102班在跳舞");
    }

}

//测试类
class FuGai2{
    public static void main(String[] args) {
        FuGai Stu=new FuGai();
        Stu.some();//所有班级都在读书
        Fg101 Stu2=new Fg101();
        Stu2.some();//101班在唱歌
        FG102 Stu3=new FG102();
        Stu3.some();//102班在跳舞
//此时不同的班级对象就有了各自的动作
    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值