修饰符
修饰符的分类
权限修饰符
状态修饰符
权限修饰符
状态修饰符
final(最终态)
static(静态)
final
final 关键字是最终的意思,可以修饰成员方法,成员变量,类
final修饰的特点:
修饰方法:表明该方法是最终方法,不能被重写
修饰变量:表明该变量是常量,不能被再次赋值
修饰类: 表明该类是最终类,不能被继承
final修饰局部变量
变量是基本类型:final 修饰指的是基本类型的 数据值 不能发生改变
变量是引用类型:final 修饰指的是引用类型的 地址值 不能发生改变,但是地址里面的内容是可以发生改变的
static
static 关键字是静态的意思,可以修饰成员方法,成员变量
static 修饰的特点:
被类的所有对象共享
这也是我们判断是否使用静态关键字的条件
也可以通过类名调用
当然,也可以通过对象名调用
推荐使用类名调用
static访问特点
非静态的成员方法:
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态额成员方法
静态成员方法:
能访问静态的成员变量
能访问静态的成员方法
总结一句话就是: 静态成员方法只能访问静态成员
多态
多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物: 动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就多态
多态的前提和实现:
有继承/实现关系
有方法重写
有父类引用指向子类对象
多态中成员的访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而成员变量没有
多态的好处和弊端
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能
多态中的转型
向上转型
从子到父
父类引用 指向 子类对象
向下转型
从父到子
父类引用 转为 子类对象
多态转型内存图解
案例
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
思路:
1 定义动物类(Animal)
成员变量:姓名,年龄
构造方法:无参 带参
成员方法: get/set方法,吃饭()
2 定义猫类
构造方法:无参 带参
成员方法:重写吃饭()
3 定义狗类
构造方法:无参 带参
成员方法:重写吃饭()
4 定义测试类(AnimalDemo),写代码测试
抽象类
抽象类概述
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
抽象类的特点
抽象类和抽象方法必须使用 abstract 关键字修饰
public abstract class 类名{}
public abstract viod eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
抽象类如何实力化呢?参照多态的方式,通过子类对相实例化,这叫抽象类多态
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
抽象类的成员特点
成员变量:
可以是变量
也可以是常量
构造方法:
有构造方法,但是不能实例化
那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化
成员方法:
可以有抽象方法,限定子类必须完成某些动作
也可以有非抽象方法:提高代码的复用性
案例
需求:请采用抽象类的思想实现猫和狗的案例,并在测试类中进行测试
思路:
1 定义动物类(Animal)
成员变量:姓名,年龄
构造方法:无参 带参
成员方法: get/set方法,吃饭()
2 定义猫类
构造方法:无参 带参
成员方法:重写吃饭(...)
3 定义狗类
构造方法:无参 带参
成员方法:重写吃饭(...)
4 定义测试类(AnimalDemo),写代码测试