本文内容:

  • 继承
  • 多态

首发时期: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. 推荐一个实用的 .gitignore 文件

    为什么要忽略文件? 常用的版本控制工具,不管是使用 git 还是 svn,我们都需要排除一些与程序代码无关的文件,如像 eclipse/ intellij idea 等 IDE 工具留下来的 .set ...

  2. vue moment库格式化处理后端传的日期

    开篇 日期时间格式前端和后端都可以处理,我比较推荐前端来处理(定制化高),下面我就介绍下两种处理的方式 后端处理 django默认不经处理传给前端的日期格式为2018-08-26T19:53:36.5 ...

  3. Python模块——PrettyTable 模块

    简介 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,十分实用. 安装 pip install prettytable 示例 从已有文件创建 CSV fr ...

  4. “大话架构”阿里架构师分享Java程序员需要突破的技术要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...

  5. 课程四(Convolutional Neural Networks),第三 周(Object detection) —— 1.Practice questions:Detection algorithms

    [解释] tree的两个bounding boxes 都要保留,因为交并比小于0.5:car 0.73保留:pedestrain 0.98保留:motorcycle 0.58保留.一共5个. [解释] ...

  6. MLlib之NaiveBayes算法源码学习

    package org.apache.spark.mllib.classification import breeze.linalg.{DenseMatrix => BDM, DenseVect ...

  7. Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript

    Java 8 Nashorn JavaScript Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java ...

  8. javascript中的iterable

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...

  9. 一个简单的特效引发的大战之移动开发中我为什么放弃jquery mobile

    我本想安静的做一个美男子,可是,老板不涨工资,反而,一月不如一月. 我为什么放弃jquery mobile插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...

  10. MySQL中的事务及读写锁实现并发访问控制

    一.并发控制中锁的概念 锁是并发控制中最核心的概念之一,在MySQL中的锁分两大类,一种是读锁,一种是写锁,读锁也可以称为共享锁(shared lock),写锁也通常称为排它锁(exclusive l ...