• 什么是继承?


    继承的概念

    继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,同时还可以在子类中重新定义以及追加属性和方法。
    格式:class 子类 extends 父类 { }

    猫猫狗狗 举个例子:猫猫狗狗 猫猫与狗狗都有相同的属性特征,他们都是动物,所以可以把相同的属性特征抽出来做成一个动物类。 代码如下:
    // 动物类(父类)
    class Animal {
        public void eat() {
            System.out.println("动物吃东西");
        }
    }
    
    // 狗狗类(子类)
    class Dog extends Animal {
    }
    
    // 猫猫类(子类)
    class Cat extends Animal {
    }
    
    // Demo类
    public class InheritanceDemo {
        public static void main(String[] args) {
            Dog erha = new Dog();
            erha.eat();
    
            Cat tom = new Cat();
            tom.eat();
        }
    }
    

    运行结果

    动物吃东西
    动物吃东西
    

    代码解读

    1. 首先我们定义了一个父类Animal类,使所有动物都有个相同的属性就是吃东西,因此我们再定义一个eat()方法。
    2. 然后我们再定义两个子类Dog类与Cat类,猫猫与狗狗也是动物的一种,因此我们在Dog类与Cat类后使用extends关键字继承了Animal类。
    3. 最后在测试的时候,我们直接new的是子类,子类对象被new出来后,因为继承了父类Animal类,因此这个子类对象可以直接访问父类Animal类的eat()方法,这就是继承。

    继续探究

    既然可以访问到父类的方法,那父类的变量是不是也可以访问到呢?
    答案是肯定的,上代码

    // 动物类(父类)
    class Animal {
        public int age = 2;
        public void eat() {
            System.out.println("动物吃东西");
        }
    }
    
    // 狗狗类(子类)
    class Dog extends Animal {
    }
    
    // 猫猫类(子类)
    class Cat extends Animal {
    }
    
    // Demo类
    public class InheritanceDemo2 {
        public static void main(String[] args) {
            Dog erha = new Dog();
            erha.eat();
            System.out.println(erha.age);
    
            Cat tom = new Cat();
            tom.eat();
            System.out.println(tom.age);
        }
    }
    

    运行结果

    动物吃东西
    2
    动物吃东西
    2
    

    新问题

    在上面例子中,子类调用eat()方法,输出的都是是“动物吃东西”,但是,猫猫与狗狗爱吃的东西是不一样的,能不能把猫猫狗狗吃的东西详细表现出来呢?直接修改父类里面的方法显然是不行的,在子类里面新添加一个新的方法显然也违背了继承的本意。那么这时候就是方法重写登场的时候了,具体可以参考再来个小记,Java方法重写(Method Overriding)
    这边直接上代码:

    // 动物类(父类)
    class Animal {
        public void eat() {
            System.out.println("动物吃东西");
        }
    }
    
    // 狗狗类(子类)
    class Dog extends Animal {
        public void eat() {
            System.out.println("狗狗吃骨头");
        }
    }
    
    // 猫猫类(子类)
    class Cat extends Animal {
        public void eat() {
            System.out.println("猫猫吃鱼");
        }
    }
    
    // Demo类
    public class InheritanceDemo3 {
        public static void main(String[] args) {
            Dog erha = new Dog();
            erha.eat();
    
            Cat tom = new Cat();
            tom.eat();
        }
    }
    

    运行结果

    狗狗吃骨头
    猫猫吃鱼
    

    super关键字

    如果在子类中,我就要我一定要调用父类的方法,或者访问父类中的成员变量,那就该用到这个super关键字。

    // 动物类(父类)
    class Animal {
        public int age = 2;
        public void eat() {
            System.out.println("动物吃东西");
        }
    }
    
    // 狗狗类(子类)
    class Dog extends Animal {
        public int age = 3;
        public void eat() {
            System.out.println("狗狗吃骨头");
            super.eat(); // 获取父类的eat()方法
        }
    
        public void getAge(){
            System.out.println(super.age); // 获取父类的age
        }
    }
    
    // 猫猫类(子类)
    class Cat extends Animal {
        public int age = 4;
        public void eat() {
            System.out.println("猫猫吃鱼");
            super.eat(); // 获取父类的eat()方法
        }
    
        public void getAge(){
            System.out.println(super.age); // 获取父类的age
        }
    }
    
    // Demo类
    public class InheritanceDemo4 {
        public static void main(String[] args) {
            Dog erha = new Dog();
            erha.eat();
            erha.getAge();
    
            Cat tom = new Cat();
            tom.eat();
            tom.getAge();
        }
    }
    

    运行结果

    狗狗吃骨头
    动物吃东西
    2
    猫猫吃鱼
    动物吃东西
    2
    
  • 相关阅读:
    UIWindowLevel详解 一片
    关于博客的原创和转载的一点儿看法 一片
    UIViewController生命周期学习笔记 一片
    UINavigationController详解 一片
    UIColor,CGColor,CIColor三者间的区别和联系 一片
    subview事件响应范围 一片
    viewWithTag获取subview规则详解 一片
    FirstResponder 释放问题 一片
    UITabBarController详解 一片
    做IOS开发这一年 一片
  • 原文地址:https://www.cnblogs.com/Subaru/p/15666823.html
Copyright © 2020-2023  润新知