【面向对象】继承

 什么是继承

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

继承格式

class 子类名 extends 父类名 {   } 


实例运行:

 代码实现

可以看到 子类“布偶猫”继承了“猫”的抓老鼠与动物的“吃饭”、“喝水”

子类“哈士奇”继承了“狗”的看家与动物的“吃饭”、“喝水”

public class Animal_test {
    public static void main(String[] args) {
        buou yunyun = new buou();//创建一个布偶猫对象
        yunyun.eat();
        yunyun.drink();
        yunyun.zhualaoshu();
        yunyun.haokan();

        System.out.println("-------------------");

        hashiqi erha=new hashiqi();//创建一个哈士奇对象
        erha.drink();
        erha.eat();
        erha.kanjia();
        erha.chaijia();
    }
}

 运行结果


哪些内容可以被继承 ?

 1.构造方法(构造器)不可继承

 编写一个类时,被 public 修饰的方法必须与文件名一致,当子类继承这个类时,如果开始构造方法,则子类构造的类名违背了构造方法的规则,所以构造方法不能被继承

 例如:我编写了一个GirlFriend 类

public class GirlFriend {

    private int age;
    private int length;
    public GirlFriend() {
    }

    public GirlFriend(int age,int length) {
        this.age = age;
        this.length=length;
 }

 我让子类 Animal_test 继承父类 GirlFriend,此时new一个对象Animal,可以看到带参方法a1报错,而a2不报错的原因是a2并不是继承下来的如果一个类中没有构造方法,那么系统会自动给你添加一个默认的构造方法,这个a2就是子类默认原有的方法,并不是继承自GirlFriend

public class Animal_test extends GirlFriend{
    public static void main(String[] args) {

        Animal a1=new Animal(12,34); //报错
        Animal a2=new Animal(); //不报错
    }
}

2.成员变量可以继承

 Animal_test 继承 GirlFriend 后可以对 GirlFriend 的成员变量age、lenght进行调用

public class Animal_test extends GirlFriend{
    public static void main(String[] args) {

        Animal_test a1 = new Animal_test();
        a1.age=18;
        a1.length=15;
        System.out.println(a1.age);
        System.out.println(a1.length);
    }
}

 父类中被 private 修饰的成员变量也可被子类调用,方法仍为set、get

public class Animal_test extends GirlFriend{
    public static void main(String[] args) {

        Animal_test a1 = new Animal_test();
        a1.setAge(18);
        a1.setLength(15);
        System.out.println(a1.getAge());
        System.out.println(a1.getLength());
    }
}

 3.成员方法 虚方法 可以继承

 虚方法的特征:

非private修饰、非static修饰、非final修饰

在所有子类的默认父类 object 中有5个虚方法,所以任何类都可调用object中的5个方法

 在父类中编写一个方法run

public void run()
    {
        System.out.println("她正在跑");
    }

 因为run是只由public定义的虚方法,所以子类可以调用父类方法run

public class Animal_test extends GirlFriend{
    public static void main(String[] args) {

        Animal_test a1 = new Animal_test();
        a1.run();
    }
}

 运行结果


 成员变量继承的特点 this、super

 输出成员变量时,变量打印寻找顺序为就近原则本方法成员>本类成员>父类成员。使用 this 为优先输出本类中的成员变量,super 为优先输出父类中的成员变量,啥都不加即为就近原则

public class Animal_test {
    public static void main(String[] args) {

        Zi z = new Zi();
        z.ziShow();
    }
}
     class Fu {
        String name="父类中的name";
    }
    class Zi extends Fu{
        String name="本类中的name";
        public void ziShow()
        {
            String name="此方法中的name";
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(super.name);
        }
    }

运行结果:


 方法的重写

 当父类中的方法,不能满足子类现在的需求时,我们就需要把这个方法进行重写。

子类中重写的方法上面需要加上@override

比如说下图的 “buou” 类继承了父类 “cat” 的方法,使buou也可以进行 “猫在抓老鼠”,但是buou还有一个 “上蹿下跳” 的特性,而从父类继承的方法显然没有“上蹿下跳”,无法满足需求,此时可以使用@override对方法 “zhualaoshu” 进行重写,为其添加一个 “上蹿下跳” 的方法

父类:

public class Cat extends Animal{
    public void zhualaoshu()
    {
        System.out.println("猫在抓老鼠");
    }
}

 子类:

public class buou extends Cat{
    public static void main(String[] args) {

        buou q = new buou();
        q.zhualaoshu();
    }

    @Override
    public void zhualaoshu()

    {
        super.zhualaoshu();
        System.out.println("猫在上蹿下跳");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值