本文内容:

  • 继承
  • 多态

首发时期:2018-03-23


继承:

介绍:

  • 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类(父类/超类/基类)即可。【比如,泰迪狗类也是狗类,狗的属性,泰迪狗也应该是有的,那么泰迪狗类在定义的时候就不必要添加那些与狗类重复的属性了,而是直接继承狗类即可。在多个狗类的子类(泰迪狗,二哈,柴犬)的时候,直接继承狗类可以省去很多代码,提高代码复用性。】
  • 继承关系是通过extends来产生的,继承的格式:class 子类名 extends 父类名{}
  • 子类可以直接访问父类中的非私有的属性和行为(因为私有的并非子父类共性属性、行为,父类并不一定只包含父子类共有的属性,还会包含自己应该有的属性,比如虽然哺乳类跟人类是父子类关系,但我们都能清楚,哺乳类有一些特别的特征我们人类是没有的)
  • 继承的出现让类与类之间产生了关系,为第三个特征多态提供了前提。
  • JAVA只支持单继承,不能有多个父类,但支持多实现(接口)(多继承可能因为多个父类中有同名变量或函数而发生调用的不确定性)
  • JAVA支持多层继承
  • 当子父类不同包时,子类无法继承父类的友好变量(默认无权限修饰),只能继承public 或 protected的。
class Person{
String gender="unknown";//为了测试继承,先赋值
int age;
String family_address;
private String children;
} class Student extends Person{
} public class Demo { public static void main(String[] args) {
Student st=new Student();
System.out.println(st.gender);//unknown
// System.out.println(st.children);//报错,children是父类私有
} }

继承中的构造函数:

  • 默认是有调用父类的构造函数的,如果想要显式调用父类的构造函数,可以使用super(参数列表)
    • 为了测试有默认super()的例子
    • class Person{
      String gender="unknown";//为了测试继承,先赋值
      int age;
      String family_address;
      private String children;
      Person(){
      System.out.println("为了测试默认有super()");
      } } class Student extends Person{ } public class Demo { public static void main(String[] args) {
      Student st=new Student(); } } -------------------结果:
      为了测试默认有super()
    • 显示调用构造函数的例子:
      • class Person{
        String gender;
        int age;
        String family_address;
        private String children;
        Person(String gender,int age,String family_address){
        this.gender=gender;
        this.age=age;
        this.family_address=family_address;
        } } class Student extends Person{
        Student(String gender,int age,String family_address){
        super(gender,age,family_address);
        }
        } public class Demo { public static void main(String[] args) {
        Student st=new Student("男",18,"M78星云");
        System.out.println(st.gender+st.family_address);//男M78星云 } }
  • 注意:默认的super()在第一行,而用this调用构造函数时也必须在第一行,那么super()会默认在最终调用的构造函数的第一行。

继承中成员变量的隐藏和方法的重写:

  • 对于子类中继承父类的成员变量,只要子类中对于同名的成员变量进行私有化,便能隐藏父类的成员变量。 【如果只是子类的成员变量是可见的,那么直接定义同名变量覆盖父类变量即可】
  • 方法重写/覆盖:重写父类方法的时候不能降低方法的访问权限,也不能改变static修饰符。 【子类重写后的方法的权限必须大于等于父类的,非静态不能覆盖静态的,静态只能覆盖静态的】
    • 重写就是子类中定义与父类中已有函数同名的函数,那么这个子类中的函数就将父类的函数覆盖了(不影响其他子类),当调用函数时,是调用子类中的该函数,而不是父类的。
    • 如果想要使用被覆盖了的父类方法,要添加super
    • package 重写;
      
      class Person{
      void show() {
      System.out.println("run in Fu");
      }
      }
      class Student extends Person{
      void show() {
      System.out.println("override in Zi");
      super.show();
      }
      } public class Demo { public static void main(String[] args) {
      Student st=new Student();
      st.show();
      //结果:override in Zi
      //run in Fu
      }
      }

注意:

  1. 当子父类出现同名变量,用super来区分

  2. 子类无法重写父类的private方法
  3. 用super.XXX来显式获取父类的成员变量或调用父类的方法

多态:

介绍:

  • 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。【或者说指父类的某个方法被子类重写时,可以各自产生自己的功能行为。】
  • 一种体现是函数的重载;一种体现是函数的重写。
  • 另一种一种显示形式:向上转型,子类转成父类对象,比如:
    • 上转型对象不能操作子类新增的函数,但可以调用子类继承的成员变量或继承或重写的函数【注意的是不能调用子类隐藏父类的成员变量】。

使用:

向上转型:

package 多态_usage;

class Animal{
int age=4;
void show() {
System.out.println("run in Fu");
}
}
class Tiger extends Animal{
int age=6;
void show() {
System.out.println("ao ao ao");
}
} class Cat extends Animal{
void show() {
System.out.println("miao miao miao");
}
} public class Demo2{ public static void main(String args[]) {
Animal a=new Tiger();//把老虎转型成父类-动物
Animal b=new Cat();
System.out.println(a.age);//4
a.show();//run in Zi
b.show();//miao miao miao } }

注意:

  1. 成员变量子父类同名时,成员变量的调用看“.”所属的对象的类。比如是父类.成员变量那么就是父类的。


Java:[面向对象:继承,多态]的更多相关文章

  1. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  2. Java面向对象 继承(上)

       Java面向对象 继承 知识概要:         (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...

  3. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  4. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

  5. Java面向对象㈡ -- 继承与多态

    Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆 ...

  6. Java面向对象的多态

    Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...

  7. java面向对象之 多态 Polymorphism

    多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...

  8. Java 封装 继承 多态

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

  9. java面向对象--继承与多态

    可以为一个变异单元中的每个类创建一个main方法,只有命令行所调用的那个类的main方法才会被调用,这样方便进行单元测试.继承时,一般将所有的数据成员都指定为private,将所有的方法指定为publ ...

  10. Java面向对象特性--多态

    Java是一种面向对象的编程语言,面向对象的三大特性就是继承,封装,多态.下面细细说一说多态. 多态的定义:一个事物的多种形态,指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而 ...

随机推荐

  1. I2C软件调试思路并知识总结

    I2C是一种只使用两根线的串行通信协议.一根线是串行数据线SDA,另外一种是串行时钟线SCL. I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v. I²C的参考设计使用一个7比特长 ...

  2. Tools - Windows系统下的命令行工具Cmder

    cmder简介 官网:http://cmder.net/ GitHub:https://github.com/cmderdev/cmder Cmder是一个windows下的命令行工具,用来替代win ...

  3. Docker - 常用基础命令

    Docker命令分布 帮助信息 查看docker基本信息:docker info 查看docker版本信息:docker version 查看docker的所有命令及选项:docker --help ...

  4. 课程三(Structuring Machine Learning Projects),第二周(ML strategy(2)) —— 1.Machine learning Flight simulator:Autonomous driving (case study)

    [中文翻译] 为了帮助您练习机器学习的策略, 在本周我们将介绍另一个场景, 并询问您将如何行动.我们认为, 这个工作在一个机器学习项目的 "模拟器" 将给一个任务, 告诉你一个机器 ...

  5. Hive的union和join操作

    建表语句: create table  tb_in_base (    id  bigint,    devid bigint,     devname string  ) partitioned b ...

  6. dart之旅(二)- 内建类型

    目录 number 类型 字符串 布尔类型 像大多数语言一样,dart 也提供了 number,string,boolean 等类型,包括以下几种: numbers strings booleans ...

  7. CentOS部署pyspider

    0x00 环境 阿里云ECS云服务器 CPU:1核 内存:2G 操作系统:Centos 7.3 x64 地域:华北 2(华北 2 可用区 A) 系统盘:40G 0x01 安装依赖 yum instal ...

  8. Zabbix4.2.0使用Python连接企业微信报警

    目录 1. 配置企业微信 2. 脚本配置 2.1 安装python依赖的库 2.2 编写脚本 2. 搭建FTP 3. 配置Zabbix监控FTP 3.1 添加FTP模板 3.2 添加报警媒介 3.3 ...

  9. redis 集群搭建: redis-cluster

    前言 redis数据存储在内存中, 就会受到内存的限制, 大家都知道, 一台电脑, 硬盘可以有1T, 但是内存, 没有听说有1T的内存吧. 那如果数据非常多, 超过一台电脑的内存空间, 怎么办呢? 正 ...

  10. SpringMVC教程1

    一.SpringMVC介绍 1.MVC介绍 ==模型-视图-控制器(MVC== 是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中 ...