Java 面向对象三大特征之一:继承

继承 使用继承优化设计 使用: 将重复的代码抽取到父类中 继承的优点和实现 优点: 方便修改代码 减少代码量

子类和父类关系是is-a的关系(可以有多个子类,但只能有一个父类)

如何使用继承? class Pet { /公共的属性和方法 } class Dog extends Pet { /子类特有的属性和方法 } class Penguin extends Pet { } //extends:继承关键字 //一个子类只能继承一个父类

理解继承 子类访问父类成员使用super关键字,访问父类构造方法。super代表父类对象 super();调用父类无参构造方法 super(name);调用父类无有参构造方法 在子类构造方法中调用且必须是第一句访问父类属性 super.name; 访问父类方法 super.print();

继承下构造方法的执行过程

父类静态块中方法----子类静态块中方法----父类的非方法代码块(单一{//内容}代码块)--- 父类的构造方法---子类的非方法代码块(单一{//内容}代码块)---子类的构造方法

可以用构造方法为属性赋值

当我们实例化子类无参构造时父类没有自定义构造 系统会自动分配一个无参构造

实例化子类对象默认会先执行父类的构造,在执行子类的构造

super();默认调用父类的无参数构造 注意细节:必须是子类中在构造方法的第一条语句

(无参构造会默认调用)

super(参数列表);调用父类中的有参构造 使用super(参数列表);重复调用父类中的有参构造,默认直接调用父类中的有参数构造,而不会调用父类中的无参数构造

注意: 实例化子类对象时,子类相应的构造,第一行调用父类的哪个构造,就执行哪一个父类构造,,如果没有声明父类构造,默认皆父类的无参构造

子类可以继承父类的哪些资源?

private 不可被继承 子类与父类不在同包,使用默认访问权限的成员不可被继承(默认 友好的 friendly) 构造方法不被继承必须使用super进行访问

论访问修饰符 protected (受保护的): 可以修饰属性和方法 本类,同包,子类可以访问(子类跨包也可以访问)

多重继承关系的初始化顺序? 父类属性>父类构造方法>子类属性>子类构造方法

何时使用继承?  继承与真实世界类似  继承最大的特点是:代码重用(的一种方式)  将子类共有的属性和方法都放在父类当中

构造方法不能被继承,因此不能重写

方法重写的规则:  方法名相同  参数列表相同  返回值类型相同或者是其子类  访问权限不能严于子类

方法重载与方法重写:

方法重写(继承实现):位置在子类,方法名相同,参数表相同,返回值相同或是其子类i,访问修饰符不能比父类更严格 方法重载(一个类中可以有多个同名方法):位置在同类,方法名相同,返回值无关,访问修饰符无关。只与参数列表有关

super关键字来访问父类的成员  super只能出现在子类方法和构造方法中  super调用构造方法时,只能是第一句  super不能访问父类的private成员

 废话不多说,上栗子:

package cn.jbit.epet.inherit2;

/**
 * 狗狗类,宠物的子类。
 * @author 北大青鸟
 */
public class Dog extends Pet {
    private String strain;// 品种

    /**
     * 有参构造方法。
     * @param name   昵称
     * @param strain   品种
     */
    public Dog(String name, String strain) {
        super(name); //此处不能使用this.name=name;
        this.strain = strain;
    }
    
    public void setStrain(String strain) {
        this.strain = strain;
    }
    public String getStrain() {
        return strain;
    }
    
    public void print(){
        super.print();
        System.out.println("我是一只"+this.getStrain()+"犬。");
    }
}
package cn.jbit.epet.inherit2;
/**
 * 企鹅类,宠物的子类。
 * @author 北大青鸟 
 */
public class Penguin extends Pet {
    private String sex;// 性别
    /**
     * 有参构造方法。
     * @param name 昵称
     * @param sex 性别
     */
    public Penguin(String name, String sex) {
        super(name);
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }    
    
    public void print(){
        super.print();
        System.out.println("我的性别是"+this.getSex()+"。");
    }
}
package cn.jbit.epet.inherit2;

/**
 * 宠物类,狗狗和企鹅的父类。
 * @author 北大青鸟
 */
public class Pet {
    private String name = "无名氏";// 昵称
    private int health = 100;// 健康值
    private int love = 0;// 亲密度
    /**
     * 无参构造方法。
     */
    public Pet() {
        this.health = 95;
        System.out.println("执行宠物的无参构造方法。");
    }
    /**
     * 有参构造方法。
     * @param name  昵称
     */
    public Pet(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getHealth() {
        return health;
    }
    public int getLove() {
        return love;
    }
    /**
     * 输出宠物信息。
     */
    public void print() {
        System.out.println("宠物的自白:\n我的名字叫" + 
                this.name + ",我的健康值是" + this.health 
                + ",我和主人的亲密程度是" + this.love + "。");
    }
}
package cn.jbit.epet.inherit2;

/**
 * 测试类,测试类的继承。
 * @author 北大青鸟
 */
public class Test {
    public static void main(String[] args) {
        // 1、创建宠物对象pet并输出信息
        Pet pet = new Pet("贝贝");
        //pet.print();
        // 2、创建狗狗对象dog并输出信息
        Dog dog = new Dog("欧欧", "雪娜瑞");
        dog.print();
        // 3、创建企鹅对象pgn并输出信息
        Penguin pgn = new Penguin("楠楠", "Q妹");
        pgn.print();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏彭湖湾的编程世界

【JavaScript】 JS面向对象的模式与实践

参考书籍 《JavaScript高级语言程序设计》—— Nicholas C.Zakas 《你不知道的JavaScript》  —— KYLE SIMPSON ...

3236
来自专栏技术总结

线性表

1496
来自专栏灯塔大数据

技术 | Python从零开始系列连载(四)

导读 上一期学习了Python的基本运算和表达式的一部分,相信大家都已经熟悉啦,我们这一期就来学习Python的基本运算和表达式剩下的部分吧! Python的基...

4006
来自专栏aCloudDeveloper

LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium

题目: Given an array of integers, find two numbers such that they add up to a spec...

17910
来自专栏诸葛青云的专栏

C语言中你必须知道的几大排序算法

在实际使用数组的过程中,数组不仅可以存储多个同类型的数据,而且要求这些数据按照某种特征进行排序。例如,学生的成绩,需要按照从高到低的顺序排列,这就需要使用排序算...

20
来自专栏Android机动车

Java 基础(五)——集合源码解析 Set

前面我们学了 List 集合。我们知道 List 是一个有序的集合,可以根据元素的整数索引访问元素,并且允许重复。

781
来自专栏Android Note

介绍Kotlin第一部分(翻译篇)

874
来自专栏老九学堂

干货| 期末临近快捷C语言复习

? 盼望着盼望着,寒假近了 当然期末考试也就近了 C 语言,晦涩难懂 对于很多同学来说又是初次接触… 期末考试怎么办 不要担心!老九又出新篇章啦 总结了排序...

3567
来自专栏菩提树下的杨过

scala 学习笔记(07) 一等公民的函数

在scala中一切皆对象,一切皆函数,函数跟Int,String、Class等其它类型是处于同等的地位,换句话说,使用函数跟使用普通的类型一样,没什么区别,因此...

1787
来自专栏有趣的Python

代码模板:python-基础-3(循环控制)

3 循环控制 循环控制主要包括三种: pass 、 continue 、 break 。 pass 表示什么也不做,只是占一行代码的位置; continu...

28210

扫描关注云+社区