继承面向对象:即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()方法
-
如果一个类没有继承父类,它父类就是Object,这个时候super()方法执行的就是Object的构造功函数
-
这个super()方法的作用,其实大部分的作用:就给父类的私有成员变量进行赋值使用
-
但是如果父类的无参构造函数一旦被定义成有参数的,子类构造函数的super()方法就必须显示的声明。如果不什么编译不通过。
注意:创建对象之前一定要先有一个类对象(编译阶段)
将静态代码块加载到方法区中,先调用父类静态代码块,再调用子类的静态代码块
然后再执行父类的代码块,再执行父类的构造方法
代码块先于构造函数执行,
子类和父类有相同的属性继承的总结和好处相互隔离,互不影响
-
父类除了能够很好的把一些公共的方法和属性进行封装,让其子类继承达到复用以外。
-
继承还有一个很重要的意义:就是分担职责
- 复用,封装,职责分担
-
Java中的任何一个类都是多态的,它们能保存不止一种类型的对象。
-
它们可以保存的是除了自身对象以外,还可以保存声明类型的子类的对象
-
当把子类对象赋值给父类对象的引用的时候,就会引发多态。(也称之为:向上转型)。
-
子类的对象可以赋值给父类的变量,就会引发向上造型cast
- Java中不存在对象对对象分覆盖和赋值操作
- 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 - 覆盖前提:继承关系 - 子类和父类中存在名字和参数表完全相同的函数,那么就存在覆盖关系 - 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的子类的函数
文章参考 学相伴-飞哥
如有错误,敬请指出



