面向对象具有封装、继承和多态3 个核心特性
继承
一、介绍
程序中继承:子类可以使用父类中的属性和方法
好处:
代码可以复用
可以提高开发效率
是多态的前提
二、语法
类继承另一个类的语法
public class A extends B {
}
读作:A类继承B类,A类是B类的子类,B类是A类的父类
继承的特点
继承后子类可以使用父类的属性和方法
不能多继承,只能单继承
支持层次继承(子→父→爷...)
继承中属性的问题
子类可以使用父类的非私有属性
父类不可以使用子类的属性
如果子类和父类有相同的属性,默认使用子类自己的属性
继承中方法的问题
子类可以使用父类非私有的方法
父类不可以使用子类的方法
如果子类和父类有相同的方法,默认使用子类自己的方法
继承中构造方法的问题
构造方法都不能被直接调用
子类构造方法执行,会先调用父类的构造方法,因为子类构造方法内会有隐藏的super()调用父类的无参构造方法,且必须放在构造方法的第一行
即创建子类对象时,会先创建父类对象再创建子类对象
三、继承中创建对象的过程
在堆中开启空间,分配地址值
属性和方法被初始化默认值
然后执行构造方法内部的代码
然后再初始化子类属性和方法,初始化默认值
然后执行子类构造方法内代码
对象创建成功,将地址值(子类)赋值给变量(对象名)
final
final可以修饰类、属性、方法
final修饰类,类不能被继承
final修饰属性即变量,变量不再变化,为常量(常量命名全大写,单词间用 '_' 分隔,常量不可被重新赋值)
final修饰方法,方法不可被重写
static静态修饰符
1、静态修饰属性和方法
2、一旦修饰属性和方法,那么属性和方法就会变成 类属性、类方法
3、被static修饰的属性和方法随着类加载而初始化
4、且被static修饰的属性和方法在内存中只有一份,被所有该类对象共享
5、静态修饰的属性和方法,不会随着创建对象进堆中,就存在于静态域中
以前每次创建对象,每个对象都有属于自己的属性,这些属性叫对象属性。
现在static修饰了属性和方法后,这些属性和方法不再属于某个对象,还是属于类,称为类属性、类方法。
语法应用
静态修饰的属性和方法建议直接通过类名调用;
因为:静态的属性和方法随着类加载就已经出现在内存中,并初始化成功,意味着可以使用了,就没有必要再通过创建对象后使用对象去调用,这样会浪费时间和空间
例如Arrays类的方法
静态方法只能调用静态方法和静态属性
因为:静态修饰的属性和方法,会随着类加载就已经出现在内存中,并初始化成功。
而对象属性 对象方法(非静态属性和方法)是需要创建对象才会出现
即 有静态属性和静态方法时候,那些没静态的属性和方法还没出现
sum:静态只能调用静态
非静态方法能不能调用静态方法和对象
static方法内部不能调用非静态方法,反过来是可以的。
多态:
某个方法的多种形态,同一个方法,执行时出现不同的结果
多态的前提条件:
1、有继承关系(或者实现接口)
2、子类重写父类方法
3、父类引用指向子类对象,也叫向上转型
![](https://img-blog.csdnimg.cn/img_convert/459d8bad16c30b288f0dc742c8c7f9f3.png)
![](https://img-blog.csdnimg.cn/img_convert/e0620e5c98338efff75c1f8961ea8c81.png)
编译看父类,执行看子类
实现多态:
![](https://img-blog.csdnimg.cn/img_convert/a0612c034e27b45b1928a61b238d8191.png)
![](https://img-blog.csdnimg.cn/img_convert/0f6c8e0dfd05f7a407de4eb358fa9ec6.png)
向上转型&向下转型
向上转型:父类引用指向子类对象,子类对象向上转型成为了父类
向下转型:父类引用向下转型成为子类默认不允许,但是可以通过强制类型转换完成
eg:Dog dog = (Dog)animal;
什么时候需要向下转型?
当需要调用子类特有的方法时,就需要将父类引用向下转型成子类对象,才可以使用子类特有的方法!
总结:多态到底怎么用?在什么地方用?
大部分的多态的使用场景就是将方法的参数列表设计成父类类型,调用方法时传入子类类型,运行得到子类的效果
PS:子类的访问修饰符范围可以大于父类的。