栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础-继承和多态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基础-继承和多态

Java基础 01.面向对象的程序设计-java

面向对象:即OOP,可以说是对现实世界理解和抽象的方法,是基于面向过程而言,面向对象简单来说就是***将功能封装到对象(数据和操作结合)里,我们面向对象,让对象去完成这些功能***。
万物皆对象。(在我们程序员眼中,一切皆对象)

三大特性: 封装 继承 多态

继承

子类继承父类,可以得到父类中的***公开(public)*和受保护(protected)的属性和方法,以及在同一个包下父类中的*缺省(default)***属性和方法,其他的访问权限修饰的属性和方法,子类无法通过继承的方式得到。

在不同包中,子类不能访问父类中default修饰的属性的方法

访问修饰符

  • 父类属性一般设置为protected
    • 如果在开发中,一个父类想让子类去获取成员属性和方法的话,尽量定义成protected
    • 如果父类的成员属性和方法私有的,就可以通过公开get方法进行获取私有属性
    • 如果要给父类的私有属性要初始化或者赋值。你可以通过super方法进行给私有属性赋值,或者公开的set方法
  • 父类中private属性可以在子类中通过super关键字来赋值
   public son(String name, int age, int age1) {
        super(name, age);
        this.age1 = age1;
    }
  • 子类***覆盖父类方法的时候***访问权限必须***大于等于***父类本身的访问权限
super关键字

一个普通的类没有继承时,通过构造器来创建对象,但在一个类中存在继承关系时,先构造父类对象,再构造子类对象,也就是在子类的构造函数中,必须先调用父类构造器,在构造父类完成之后再构造其子类对象

子类中的中没写调用父类构造操作,默认调用了父类的无参构造,若是调用有参构造器,则需要传递参数,并且使用super关键字来调用父类中构造器。

  • 每个子类继承父类以后,每个子类的都会有一个默认的隐式super()方法

  • 如果一个类没有继承父类,它父类就是Object,这个时候super()方法执行的就是Object的构造功函数

  • 这个super()方法的作用,其实大部分的作用:就给父类的私有成员变量进行赋值使用

  • 但是如果父类的无参构造函数一旦被定义成有参数的,子类构造函数的super()方法就必须显示的声明。如果不什么编译不通过。

类的代码执行顺序

注意:创建对象之前一定要先有一个类对象(编译阶段)


将静态代码块加载到方法区中,先调用父类静态代码块,再调用子类的静态代码块

然后再执行父类的代码块,再执行父类的构造方法

代码块先于构造函数执行,

子类和父类有相同的属性

相互隔离,互不影响

继承的总结和好处
  • 父类除了能够很好的把一些公共的方法和属性进行封装,让其子类继承达到复用以外。

  • 继承还有一个很重要的意义:就是分担职责

  • 复用,封装,职责分担
多态
  • Java中的任何一个类都是多态的,它们能保存不止一种类型的对象。

  • 它们可以保存的是除了自身对象以外,还可以保存声明类型的子类的对象

  • 当把子类对象赋值给父类对象的引用的时候,就会引发多态。(也称之为:向上转型)。

向上造型(cast)
  • 子类的对象可以赋值给父类的变量,就会引发向上造型cast

    • Java中不存在对象对对象分覆盖和赋值操作
  • 父类的对象不能直接赋值给子类的变量

    Item item = new Item();
    Video video = new Video();
    item = video; // 这个是正确的
    video = item;//编译错误
    
  • 可以使用强制类型转换

前提条件:只有类信息相同的类才能进行强制转化

强转有一个前提条件 Class类型必须要相同类型的Object的才可以强转

向上造型总结:

  • 父类型引用指向子类对象
  • 对象本身并没有任何变化,所以不是“类型转换”
  • 运行时如果不合理就会出现类型转化异常
  • 向上转型总是安全的,也就是父=》子
  • 向上转型时默认的

强制类型转换的理解:

存在一个父类型Father,两个子类型Son1,Son2,

Father f = new Son1();
Father f1 = new Son2();
//举例一:
 Son1 s1;
 Son2 s2;
S1 = (Son1)f;//可以强转
S2 = (Son2)f1;//可以强转
Father f1 = new Son();//这个时候可以把f1看成是Son类型
Father f2 = new Son2();//可以把f1看成是Son2类型
Son s1  = (Son)f1;//正确
Son2 s2 = (Son2)f2;//正确
Son s3 = (Son)f2;//出现.ClassCastException,原因是f2是Son2类型的对象,只能被强转为Son2类型,不能转为Son类型
      


函数的绑定(多态)

一个父类存在多个子类型的时候,父类型的变量是一个多态变量

for(Item item : itemList){
   item.println(); // 而这种多态变量,会根据自身的数据类型,自动去匹配子类的方法
   // 也就是说:item.这个动作的时候,java会自动去匹配实际的类型。而这个事情就称之为多态。
}

多态变量:会根据自身的数据类型,自动去匹配子类的方法 也就是说:item.这个动作的时候,java会自动去匹配实际的类型。而这个事情就称之为多态.

函数绑定:

  • 当通过对象变量调用函数的时候,调用哪个函数这个事情叫做绑定、

  • 静态绑定:根据变量的声明类型来决定(也就是说你这个变量的申明类型,我就调用这个申明类型的函数。

  • 动态绑定*:多态变量在调用方法的时候,会在运行阶段自动匹配其子类,并调用子类中的该方法

  • 对于java这样的程序语言来说,默认所有的绑定都是:动态绑定。

面试:什么是多态
首先java语言是基于动态函数绑定的一种机制,如果要实现多态,必须先有继承,我对多态其实就指当一个父类去调用一个子类的方法时候,并不能立即确定具体的数据类型,而是在运行的时候去自动去确定具体数据类型的过程。
覆盖override
- 覆盖前提:继承关系
- 子类和父类中存在名字和参数表完全相同的函数,那么就存在覆盖关系
- 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的子类的函数

个子类的方法时候,并不能立即确定具体的数据类型,而是在运行的时候去自动去确定具体数据类型的过程。

 覆盖override

- 覆盖前提:继承关系
- 子类和父类中存在名字和参数表完全相同的函数,那么就存在覆盖关系
- 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的子类的函数

文章参考 学相伴-飞哥
如有错误,敬请指出

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324565.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号