Java第二阶段---12继承---第一节 继承

1.概念

继承的概念很简单但是很强大:当你要创建一个新类并且已经有一个包含所需代码的类时,可以从现有类中派生新类。这样,你可以重复现有类的字段和方法,而不必自己编写(和调试)它们。

子类从其父类继承所有成员(字段,方法和嵌套类)。构造方法不是吵成员,因此它们不会被子类继承,但是可以从子类中调用父类的构造方法。

从一个类派生的类称为子类(也可以是派生类,扩展成子类)。派生子类的类称为超类(也称为基类或父类)。

继承也是面对对象的三大特征之一。

2.如何使用继承

语法

public class 子类名 extends 父类名 {

}

示例

package com.cyx.inheritance;

public class Father {

    public String name;

    public String sex;

    public void eat(){
        System.out.println("吃饭");
    }

    public void sleep(){
        System.out.println("睡觉");
    }
}
package com.cyx.inheritance;

public class Child extends Father{

    public void show(){
        System.out.println(name);//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
        System.out.println(sex);
        eat();
        sleep();
    }

}
package com.cyx.inheritance;

public class FatherTest {

    public static void main(String[] args) {
        Child child = new Child();
        child.name = "张三";
        child.sex = "男";
        child.show();
    }

}

继承的属性和方法

不论子类在什么包中,子类会继承父类中所有的公开的和受保护的成员(包括字段和 方法)。如果子类和父类在同一个包中,子类也会继承父类中受保护的成员。

子类不会继承父类中定义的私有成员。尽管如此,如果父类有提供公开或者受保护的访问该字段的方法,这些方法也能在子类中被使用。

示例

package com.cyx.inheritance;

public class Father {

    protected String name;

    public String sex;

    void eat(){
        System.out.println("吃饭");
    }

    public void sleep(){
        System.out.println("睡觉");
    }
}

package com.cyx.inheritance;

public class Child extends Father{

    public void show(){
        System.out.println(name);//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
        System.out.println(sex);
        eat();
        sleep();
    }

}
package com.cyx.inheritance.p1;

import com.cyx.inheritance.Father;

public class Child extends Father {

    public void show(){
        System.out.println(getName());//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
        System.out.println(sex);
        eat();//受包保护  所以报错 即默认修饰符用不了
        sleep();
    }

}


package com.cyx.inheritance;

public class FatherTest {

    public static void main(String[] args) {
        Child child = new Child();
        child.name = "张三";
        child.sex = "男";
        child.show();
    }

}

3.应用场景

思考如下代码存在什么问题?

public class Programmer{
    private String name;
	private String sex;
    private int age;
    private String level;
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getSex(){
        return sex;
    }
    public void setSex(String sex) { 
        this.sex = sex; 
    }
    public int getAge() { 
        return age; 
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level; 
    }
    public void programming(){
        System.out.println("程序员编程"); 
    }
    public void eat(){ 
        System.out.println("程序员吃饭");
    }  
}
public class Doctor{
    private String name;
	private String sex;
    private int age;
    private String professional;
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getSex(){
        return sex;
    }
    public void setSex(String sex) { 
        this.sex = sex; 
    }
    public int getAge() { 
        return age; 
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getProfessional(){
        return professional;
    }
    public void setProfessional(String professional){
        this.professional = professional;
    }
    public void cure(){
        System.out.println("医生治病"); 
    }
    public void eat(){
        System.out.println("医生吃饭"); 
    }
}

直接看代码,初学者可能无法直观的看出问题所在,可以使用类图进行对比

有类图可以看出, Programmer 和 Doctor 两个类中存在大量重复的代码,可以使用继承来进行优化,以减少重复的编码

package com.cyx.inheritance.p2;

public class Person {

        private String name;

        private String sex;

        private int age;

        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getSex(){
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }

        public void eat(){
            System.out.println("吃饭");
        }

}

package com.cyx.inheritance.p2;

public class Doctor extends Person {
    private String professional;

    public String getProfessional() {
        return professional;
    }

    public void setProfessional(String professional) {
        this.professional = professional;
    }
    public void cure(){
        System.out.println("医生治病");
    }
}

package com.cyx.inheritance.p2;

public class Programmer extends Person {

    private  int level;

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public void programming(){
        System.out.println("程序员编程");
    }
}

package com.cyx.inheritance.p2;

public class PersonTest {

    public static void main(String[] args) {
        //原来造对象的方式
        Doctor d  = new Doctor();
        d.setName("Miss Zhang");
        d.setSex("女");
        d.setAge(18);
        d.setProfessional("临床医疗");
        d.cure();
        d.eat();

        //父类造对象 子类来赋值
        Person p1 = new Doctor();//医生是人
        p1.setName("Miss Zhang");
        p1.setSex("女");
        p1.setAge(18);
        p1.eat();

        Person p2 = new Programmer();//程序员是人
        p2.setName("马化腾");
        p2.setSex("男");
        p2.setAge(48);
        p2.eat();
    }
}

package com.cyx.inheritance.p2;

public class PersonTest {

    public static void main(String[] args) {
        //原来造对象的方式
        Doctor d  = new Doctor();
        d.setName("Miss Zhang");
        d.setSex("女");
        d.setAge(18);
        d.setProfessional("临床医疗");
        d.cure();
        d.eat();

        //父类造对象 子类来赋值
        Person p1 = new Doctor();//医生是人
        p1.setName("Miss Zhang");
        p1.setSex("女");
        p1.setAge(18);
        p1.eat();
        //利用强制类型转换来调用特有属性 int number = (int)1.0;
        ((Doctor)p1).cure();

        Person p2 = new Programmer();//程序员是人
        p2.setName("马化腾");
        p2.setSex("男");
        p2.setAge(48);
        p2.eat();
        ((Programmer)p2).programming();
    }
}

子类与父类的关系是is-a关系,表示是一个

如果一个对象赋值给其父类的引用,此时想要调用该对象的特有的方法,必须要进行强制类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值