目录

7.1、继承的概念

7.2、继承的语法格式

7.3、继承实现电子宠物系统

7.4、Java只能够实现单根继承

7.5、Super关键字浅谈

7.6、继承条件下的构造方法

7.5、继承访问权限的问题


7.1、继承的概念

继承是面向对象的三大特性之一,继承可以解决编程中代码冗余的问题,是实现代码重要的手段之一。继承是软件可重用性的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法,来充实自身内容,这种现象或行为就称为继承。此时新类成为子类,现有的类称为父类。

继承最基本的作用就是使得代码可重用,增加软件的可扩充性。

Java中只支持单继承,即每个类只能有一个直接父类。

继承表达的是“XX is a XX”的关系,或者说是一种特殊的一般的关系,如Dog is a Pet。同样可以让“学生”继承“人”,让“苹果”继承“水果”,让“三角形”继承“几何图形”。

7.2、继承的语法格式

继承的语法格式如下:

[访问修饰符] class <SubClass> extends <SuperClass>{

}

(1)在Java中,继承通过extends关键字实现,其中SubClass称为子类,Super称为父类或基类。

(2)访问修饰符如果是public,那么该类在整个项目中可见

(3)若不写访问修饰符(默认修饰符),则该类只在当前包中可见

(4)在Java中,子类可以从父类中继承以下内容。

1)可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里;

2)可以继承默认修饰符的属性和方法,但是子类和父类必须在同一个包里;

3)无法继承父类的构造方法。

7.3、继承实现电子宠物系统

父类Animal:Dog类和Penguin类中都存在的属性

子类Dog类:Dog类自身所独有的属性,Penguin类中没有的属性

子类Penguin类:Penguin类自身独有的属性,Dog类中没有的属性

1、创建父类,用来存储子类中共有的属性、方法

父类Animal类

package com.bdqn.demo01;public class Animal {/** Animal为父类,Dog类和Penguin类中都存在的属性,将其提取出来*/// 定义属性private String name; // 名字private int health; // 健康值private int love; // 亲密度// 无参构造方法public Animal() {super();}// 有参构造方法public Animal(String name, int health, int love) {super();this.name = name;this.health = health;this.love = love;}// getter()、setter()方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getHealth() {return health;}public void setHealth(int health) {this.health = health;}public int getLove() {return love;}public void setLove(int love) {this.love = love;}// 定义一个输出动物信息的方法(子类Dog类和Penguin类共有的方法)public void print() {System.out.println("动物昵称:" + this.name + ",健康值:" + this.health + ",亲密度"+ this.love);}
}

 2、创建子类Dog类和Penguin类:自身所独有的属性提取出来

Dog子类:

package com.bdqn.demo01;public class Dog extends Animal{//Dog类自身所独有的属性,Penguin类中没有的属性private String strain;//品种public Dog() {super();//调用父类Animal类里的无参构造方法}public Dog(String name, int health, int love, String strain) {super(name, health, love); //调用父类Animal类里的有参构造方法this.strain = strain;}//getter()和setter()方法public String getStrain() {return strain;}public void setStrain(String strain) {this.strain = strain;}}

Penguin子类:

package com.bdqn.demo01;public class Penguin extends Animal{//Penguin类自身独有的属性,Dog类中没有的属性private String sex; //public Penguin() {super();//调用父类Animal类中无参构造方法}public Penguin(String name, int health, int love, String sex) {super(name, health, love);//调用父类Animal类中的有参构造方法this.sex = sex;}//getter()和setter()方法public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}

  测试类Test:

package com.bdqn.demo01;public class Text {public static void main(String[] args) {//通过无参构造方法创建Dog类对象Dog dog1=new Dog();dog1.setStrain("泰迪");dog1.setName("Happy");dog1.setHealth(90);dog1.setLove(88);//System.out.println("品种:"+dog1.getStrain()+",");   //输出Dog类独有的属性Strain-->品种dog1.print();//通过有参构造方法创建对象Penguin penguin1=new Penguin("QQ", 95, 90, "Q妹");     //Penguin penguin1=new Penguin(name, health, love, sex)//System.out.println("性别:"+penguin1.getSex()+",");   //输出Penguin类独有的属性Sex-->性别penguin1.print();}}

输出结果:

7.4、Java只能够实现单根继承

继承是Java中实现代码的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类,但是可以多层次的继承,也就是子类可以继承父类里的资源。

案例:

创建三个类,GeandFather、Father、Son和一个测试类;

①:其中Son类是Father类的子类,Father类是Son的父类

②:其中Father类是GeandFather类的子类,GeandFather类是Father类的父类

即:可以多层次的继承。

代码解析:

GeandFather类独有的属性是money,

Father类独有的属性是antique,

Son类独有的属性是hobby,

 GeandFather类

package com.bdqn.demo05;public class GrandFather {private double money;// 钱public GrandFather() {super();// 调用父类Object类里的无参构造方法}public GrandFather(double money) {super();// 调用父类Object类里的无参构造方法this.money = money;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}// 定义一个普通方法public void print() {System.out.println("我是GrandFather类里的print()方法");}}

Father类

package com.bdqn.demo05;public class Father extends GrandFather {private String antique; // 古董public Father() {super();// 调用父类GrandFather类里的无参构造方法}public Father(double money, String antique) {super(money);// 调用父类GrandFather类里的有参构造方法this.antique = antique;}public String getAntique() {return antique;}public void setAntique(String antique) {this.antique = antique;}public void test() {System.out.println("我是Father类里的test()方法");}}

Son类

package com.bdqn.demo05;public class Son extends Father {private String hobby; // 爱好public Son() {super();// 调用父类Father类里的无参构造方法}public Son(double money, String antique, String hobby) {super(money, antique);// 调用父类Father类里的有参构造方法this.hobby = hobby;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public void demo() {System.out.println("我是Son类里的demo()方法");}
}

测试类Test

package com.bdqn.demo05;public class Test {public static void main(String[] args) {Son son1 = new Son();son1.setHobby("买跑车");// 调用Son类里的setXxx()方法son1.setAntique("蒙娜丽莎");// 调用Father类里的setXxx()方法son1.setMoney(10000000);// 调用GrandFather类里的setXxx()方法son1.print();son1.test();son1.demo();/** 继承是Java中实现代码重用的重要手段之一。* Java中只支持单根继承,即一个类只能有一个直接父类,但是可以多层次的继承,也就是子类可以继承父类的父类里的资源*/}}

  输出结果:

7.5、Super关键字浅谈

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

解析:

(1)super只能出现在子类的方法和构造方法中

(2)super调用构造方法时,只能是第一句

(3)super不能访问父类的private成员

7.6、继承条件下的构造方法

实例化子类对象

在Java中,一个类的构造方法在如下两种情况下总是会被执行。

  • 创建该类的对象(实例化)
  • 创建该类的子类的对象(子类的实例化)

因此,子类在实例化时,会首先执行其父类的构造方法,然后才执行子类的构造方法。换言之,当在Java语言中创建一个对象时,Java虚拟机会按父类--->子类的顺序执行一系列的构造方法。

子类继承父类时构造方法的调用规则如下:

(1)如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写"super();"语句,效果是一样的。

(2)如果子类的构造方法中通过super显式地调用了父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类的无参构造方法。

(3)如果子类的构造方法中通过this显式地调用自身的其他构造方法,在相应构造方法中遵循以上两条规则。

注意:一个类在创建对象的时候,至少会调用2次构造方法

补充:在类没有提供任何构造方法时,系统会提供一个无参的方法体为空的默认构造方法,一旦提供了自定义构造方法,系统将不再提供这个默认构造方法。如果要使用它,程序员必须手动添加。

        对以上规则通过代码进行解析:

(1)如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写"super();"语句,效果是一样的。

(2)如果子类的构造方法中通过super显式地调用了父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类的无参构造方法。

7.5、继承访问权限的问题

理解继承-1

(1)子类继承父类的什么?
                ①继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
                ②继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里

理解继承-2

(2)子类可以继承父类的所有资源吗?

不能被继承的父类成员

①:private成员

②:子类与父类不在同包,使用默认访问权限的成员

③:构造方法(构建对象)

上述进行代码解析:

(1)首先创建两个包:

com.bdqn.demo07(包括:父类Father、子类Son、测试类Test)

com.bdqn.demo08(包括:Son类)

com.demo.demo07包中的:父类Father

package com.bdqn.demo07;public class Father {//使用四种权限修饰符定义属性public String name;protected int age;double height;private double weight;}

com.demo.demo07包中的:子类Son

package com.bdqn.demo07;public class Son extends Father {}

com.demo.demo07包中的:测试类Test

package com.bdqn.demo07;public class Test {public static void main(String[] args) {Son son = new Son();son.name = "张三";   //name是使用public进行修饰的son.age = 18;       //age是使用protected进行修饰的son.height = 175;   //height是使用默认修饰符进行修饰的(默认修饰符包级私有)/** weight是使用private进行修饰的,* 不能直接访问(只能在本类中Father中进行直接访问,其他类中不能直接访问)* *///son.weight = 55;  }}

com.demo.demo08包中的:Son类

package com.bdqn.demo08;import com.bdqn.demo07.Father;public class Son extends Father {public static void main(String[] args) {Son son = new Son();/** name是使用public进行修饰的,age是使用protected进行修饰的,* 该Son类继承的属性是com.bdqn.demo07包里的父类Father的属性,* 即:继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里* */son.name = "李四"; son.age = 19;        /** height是使用默认修饰符进行修饰的(默认修饰符包级私有),* 该Son类是包com.bdqn.demo08包内的类,* 该Son类继承的是com.bdqn.demo07包里的父类Father的属性,* 但是该Son类(子类)和Father类不在同一个包内,故不能进行访问,访问失败* * *///son.height = 180;  /** weight是使用private进行修饰的,* 不能直接访问(只能在本类中Father中进行直接访问,其他类中不能直接访问)* *///son.weight = 70;}}

总结:       

七:面向对象-->继承(extends)(继承实现电子宠物系统为例)相关推荐

  1. 七:面向对象-->方法重写(重写优化电子宠物系统为例)

    目录 7.1.方法重写的概念 7.1.1.什么是方法重写 7.1.2.方法重写的规则 7.2.重载(Overloading)和重写(Overriding)的区别和联系 7.3.方法重写:(重写优化电子 ...

  2. 七:面向对象-->封装(电子宠物系统为例)

    通过以下案例对封装进行解析: 需求分析; 使用封装实现电子宠物系统的企鹅类正确输入健康值和亲密度 (1)保证健康值的有效性(0-100),否则取默认值60 (2)保证亲密度的有效性(0-100),否则 ...

  3. java之面向对象:继承extends、super、覆盖override的用法

    继承的好处: 1 )提高了代码的复用性. 2 )让类与类之间产生了关系,给第三个特征多态提供 了前提. java支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良. 单继承:一个子类只能有 ...

  4. 大数据必学语言Scala(三十):scala面向对象 继承(extends)

    文章目录 继承(extends) 简单继承 override和super isInstanceOf和asInstanceOf getClass和classOf 访问修饰符

  5. JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)

    第3节 面向对象高级 一.继承 1.1 概述和使用 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法 ...

  6. java 继承 冒号_java继承(extends)简单介绍

    继承相信很多人都有听说过,继承是面向对象的三个基本特征之一,下面的话就一起通过简单的文章来对java继承进行一下了解吧. 继承和现实生活中的"继承"的相似之处是保留一些父辈的特性, ...

  7. python面向对象思路_Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  8. Java基础之面向对象的概念 继承---组合----枚举类

    Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...

  9. 面向对象三大特征---继承

    继承的概念 继承是一种类与类的关系,就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性.相同的行为,继承是实现代码复用的一种方式,继承实现了面向对象模块的层次性.被继承的类叫做基类或父类, ...

最新文章

  1. Open vSwitch相关字段详解之L3:IPv4IPv6
  2. MapInfo之格式说明(转载)
  3. C++学习笔记:(二)函数重载 常量与引用
  4. Squid-4.1(最新)安装及构建代理服务器
  5. Angular 原理图 Schematics 学习 - 动手开发一个实际的例子
  6. python 垃圾回收机制
  7. 推荐几个常用的生物通路数据库
  8. 2007年noip普及组初赛试题
  9. 游戏迷必备桌面|穿越火线壁纸,燃动少年心
  10. 创建一个新的extender
  11. 一些基本的数学概念,LDA的表述
  12. hdu 1588 Gauss Fibonacci
  13. python实现简单购物系统
  14. 第十九届泳联水中运动世锦赛
  15. kindle_Kindle颂歌
  16. Redis 提示“Couldn‘t determine DBSIZE!”
  17. canvas 将两张图片叠加
  18. 关于glew.h / glut.h引用【转】
  19. 网页抖音批量取消关注JS代码
  20. 阿里被转载上100W次的Java面试题教程,已助我拿下9家大厂offer

热门文章

  1. 金融业数据质量评价体系
  2. nowcoder_A_放羊的贝贝_思维+数学
  3. 开发库存管理SaaS小程序(1) - 公司注册篇
  4. 【mpvue】小程序开发入门
  5. 【Unity】物体爆炸,碎片横飞
  6. CISCO无线AP修改默认管理员用户和密码
  7. 数据导入与预处理-第5章-数据清理
  8. 集合石总显示服务器连线中,魔兽世界集合石地下城挑战活动火热开启
  9. 在PC上通过手机发送短消息(续篇)
  10. 对标阿里P5—P8Java社招岗的面试题解析