面向对象之继承

继承的基本概念:

        1、继承是从已有的类中建立新类的过程

        2、继承是面向对象的三大特征之一

        3、被继承的类被称为父类(超类),继承父类的类叫做子类(派生类)

        4、继承是指一个对象直接使用另一个对象的方法和属性(非私有的)

        5、通过继承可以实现代码的重用

举例类图的如下: 

面向对象之继承_第1张图片 

li“猫、狗、鸡,猪”,都属于动物类,所以“猫、狗、鸡,猪”这四个类是动物的派生类,而动物则是超类,派生类可以继承超类的属性和方法,比如动物类中有“跑”、“吃”等方法,派生类可以直接继承过来,不需要重新书写代码。而“家鸡、野鸡”又是鸡的派生类,可以继承“鸡的方法”,而鸡的又继承了“动物”类,所以这里的“家鸡、野鸡”同时也继承了“动物类”的方法和属性(非私有)


举例:Dog类为父类

 class Dog {//Dog作为父类
        private String Name;
        private String Sex;
        public void eat() {
            System.out.println("吃饭");
        }

    }

派生类为HomeDog类以及HaSkyDog类

 class HomeDog extends Dog {//HomeDog继承Dog类
//        继承一个父类只能继承非私有的属性和方法
        public void print() {
            System.out.println("我是一只家狗,wangwang");
        }
    }

    class HaSkyDog extends Dog {
        public void show() {
            System.out.println("我是一只哈士奇,我能跳舞");
        }
    }

 如果此时想要在print,show方法中使用父类的Name属性,代码就会报错

面向对象之继承_第2张图片

因为父类的Name属性是私有的,为此给出了两种解决方案,第一种就是对父类的私有属性记性封装(getter && setter)进行简介继承 ;第二种就是使用访问权限修饰符‘protected’,在继承关系中使用,在父类中被protected修饰的属性可以被子类继承。


继承过程中不能继承构造方法

import com.sun.org.apache.bcel.internal.generic.NEW;

import javax.naming.Name;

/**
 * Created by 25037 on 2021/11/28.
 */
public class jicheng01 {
    public void main(String[] args) {
        HomeDog homeDog = new HomeDog();
        homeDog.print();

    }

    class Dog {//Dog作为父类
        protected String Name;
        private String Sex;

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

        public Dog() {
            System.out.println("我是Dog的构造方法");
        }
    }

    class HomeDog extends Dog {//HomeDog继承Dog类

        public HomeDog() {
            System.out.println("我是HomeDog的构造方法");
        }

        //        继承一个父类只能继承非私有的属性和方法
        public void print() {
            System.out.println(Name + "我是一只家狗,wangwang");
        }
    }

    class HaSkyDog extends Dog {
        public HaSkyDog() {
            System.out.println("我是HaSkyDog的构造方法");
        }

        public void show() {
            System.out.println(Name + "我是一只哈士奇,我能跳舞");
        }
    }
}

 执行结果:

面向对象之继承_第3张图片

ps: 创建子类对象时,会先执行父类的构造方法。(因为子类要使用父类的数据,那么就要通过父类的构造方法进行初始化操作),如果创建子类对象的时候使用的默认构造方法,那么父类的默认构造方法也会被调用;如果创建的子类对象没有使用默认的构造方法,那么父类的默认方法一样会被调用

import com.sun.org.apache.bcel.internal.generic.NEW;

        import javax.naming.Name;

/**
 * Created by 25037 on 2021/11/28.
 */
public class jicheng01 {
    public static void main(String[] args) {
        HomeDog homeDog = new HomeDog();
        homeDog.print("旺财");

    }

    static class Dog {//Dog作为父类
        protected String Name;
        private String Sex;

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

        public Dog() {
            System.out.println("我是Dog的构造方法");
        }
    }

    static class HomeDog extends Dog {//HomeDog继承Dog类

        public HomeDog() {
            System.out.println("我是HomeDog的构造方法");
        }

        //        继承一个父类只能继承非私有的属性和方法
        public void print(String Name) {
            this.Name=Name;
            System.out.println(Name + "我是一只家狗,wangwang");
        }
    }

    class HaSkyDog extends Dog {
        public HaSkyDog() {
            System.out.println("我是HaSkyDog的构造方法");
        }

        public void show() {
            System.out.println(Name + "我是一只哈士奇,我能跳舞");
        }
    }
}

执行结果:

面向对象之继承_第4张图片

 

你可能感兴趣的:(java,intellij-idea,面向对象编程)