多态性
什么是多态性
- 同一个动作与不同的对象产生的不同的行为
- 多态指的是一个对象的多种形态
多态的体现方式
- 使用继承:不同的子类重写父类方法后,体现出来的形式不一样
- 接口的实现
形成多态的必要条件
- 多态的前提必须有继承或接口的实现
- 继承:存在子类和父类的关系
- 接口实现:定义一个类实现对用的接口
- 重写:子类重写了父类的方法
- 重载:调用相同的方法名,实现的功能不一样
- 子类对象的多态性(重点)
程序的两种状态
- 一个是编译状态,一个是运行状态
- 对于多态来说编译时看左边,你这个对象定义的是什么类型就是什么类型;运行时看右边,真正执行的对象,也就是子类对象执行的是子类重写后的方法
对象的转型(向上转型、向下转型)
- 上转型
将子类对象交给父类引用,可以自动转换 - 下转型
把父类转成子类,强制类型转换
对象的多态性
- 父类的引用指向子类的实例
- 在编译期间调用的父类的方法,真正执行的时候执行的是子类的方法
- 编译时看左边,运行时看右边
instanceof运算符
instanceof 用于判断类型是否匹配 例如
。
// instanceof 用于判断类型是否匹配
if(pet instanceof Dog){//判断父类pet是否属于子类Dog的实例
Dog dog2=(Dog)pet;
dog2.sleep();
}else if(pet instanceof penguin){
Penguin pe1=(Penguin)pet;
pe1.swimming();
}
方法重写和重载的区别
final关键字、static关键字
final关键字
代表最终的意思
- 可以修饰什么?
- 修饰类
- 这个类有什么特点?
这个类不能被继承,它就是一个“太监类”,但是可以继承别的类
- 这个类有什么特点?
- 修饰方法
- 这个方法有什么特点?
代表这个方法是一个最终方法,不能被重写
- 这个方法有什么特点?
- 修饰成员变量
- 修饰成员变量有什么特点?
成员变量的值不可改变
成员变量不会再有默认值
如果使用final关键字,必须对成员变量进行赋值
- 修饰成员变量有什么特点?
- 修饰局部变量
1.修饰局部变量有什么特点?
局部变量的值不能改变,一般用它修饰一个常量
static关键字
静态的
- static修饰成员变量(类本身)
- 修饰成员变量,这个变量就不属于对象了 而属于类本身;我们可以通过“类名.属性名”的方式访问
- 只要通过我这个类创建的对象,这些对象都可以共享这个属性
- 当其中一个对象对类变量进行更改以后,其他对象的这个类变量也会更改,VS实例变量(非static的变量,属于对象本身,各个对象都各自有一套副本)
- 类变量是随着类的加载而加载
- 类变量放在方法区的静态域里面
类变量只会被加载一次,所有对象共享类变量。
- static 修饰方法(类方法)
- 修饰方法,这个方法就属于类本身了,我们可以通过“类名.方法名()”进行调用
- 随着类而加载(也是放在静态域里面)
- 在静态方法里面只能调用静态变量和静态方法,相反在普通方法里面可以调用静态方法和静态变量,因为静态方法或静态变量加载时机早于实例变量和实例方法
- 不能使用this和supper关键字
- static 修饰代码块
代码块的作用完成初始化
- 静态代码块
里面可以有输出语句
随着类的加载而加载,只会执行一次
静态代码块的加载时机早于非静态代码块 - 非静态代码块
可以给类的属性进行初始化的操作,同时还可以调用类的方法(静态、非静态的)
每创建一个对象,非静态代码块就加载一次 - 静态代码块里面只能调用类变量和类方法
作用:jdbc (四要素)驱动 用户名 密码 数据库的链接地址
对属性赋值:(1)默认初始化 (2)显示初始化 (3)通过set方法或者构造方法 (4)代码块
学习笔记