static
静态,修饰符,可以修饰成员方法,成员变量 随着类的加载而加载
- 修饰成员变量 静态变量
- 特点:被该类所有对象共享
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
- 调用方式:类名调用(!!) 对象名调用
- 特点:被该类所有对象共享
- 修饰成员方法 静态方法
- 特点:多用在测试类和工具类中 javabean很少用
- 调用方式:类名调用(!!) 对象名调用
三种类
- javabean类 用来描述一类事物的类
- 测试类 用来检查其他类是否正确,带有main方法的类,程序的入口
- 工具类 帮助做一些事情的类 不描述任何事物
- 类名见名知意
- 私有化构造方法 不让外界创建它的对象
- 方法都定义为静态
static注意事项总结
- 静态方法中,只能访问静态变量和静态方法
- 非静态方法可以访问所有
- 静态方法中没有this关键字
继承
- extends 关键字
public class Student extents Person {}
- Student 成为子类,person成为父类
- 继承可以把多个子类中重复的代码抽取到父类中,提高代码复用性
- 子类可以在父类的基础上,增加其他功能,使子类更强大
自己设计 继承
-
什么时候用继承
- 当类与类之间,存在相同的内容,并满足子类是父类中的一种,使用继承
-
继承的特点
- java只支持单继承,不支持多继承,但支持多层继承
- 多层继承:子类A继承父类B,父类B继承父类C C是A的间接父类 B是A的直接父类
- 每个类都直接或间接继承于 Object (不写继承时默认继承Object )
- 子类只能访问父类中非私有的成员
- java只支持单继承,不支持多继承,但支持多层继承
画图法
画图从子类往父类画 抽取共性 写代码 从父类往子类写
-
子类能继承父类的哪些内容
- 构造方法 无论私有还是非私有,子类都不能继承 (构造方法名字要与类名一致)
- 成员变量 私有和非私有子类都可以继承下来,但私有的子类不能调用
- 调用父类私有成员变量 需要用get/set方法
- 成员方法 虚方法表里的方法可以继承,其他的不可以继承
- 虚方法表,非 private、static、final 修饰的方法 Object 虚方法表 5个方法 子类继承父类的虚方法表,然后符合要求的方法加载到虚方法表中
-
继承学习点
- 成员变量/方法的访问特点
- 就近原则 局部->本类成员(this)->父类成员super) 逐级往上找
- 方法的重写 子类覆盖从父类继承的虚方法表里的方法
- 当父类的方法不能满足子类现在的需求时,需要进行方法重写 可以调用父类
- 在继承体系中,子类出现和父类一样的方法声明,称子类的方法是重写的方法
- 重写方法时,方法上面加 @Override 注解
- 重写的方法尽量与父类保持一致, 名称、形参列表必须一致
- 只有被添加到虚方法表里的方法才能被重写
- 构造方法访问特点
- 子类不能继承父类的构造方法,但可以通过 super 调用
- 子类构造方法第一行,有一个默认的· super()
- 默认先通过super() 访问父类中的无参构造,再执行自己的
- 如果想访问父类的有参构造,需要手动书写 super(参数)
- 成员变量/方法的访问特点
- this super
- this 看做局部变量 当前方法调用者的地址值
- this() 访问本类其他构造方法 给数据赋默认值时使用
- super 父类存储空间
- this 看做局部变量 当前方法调用者的地址值
多态
基础概念
同类型的对象,表现出的不同形态
多态的表现形式:
父类类型 对象名 = 子类对象;
多态的前提
- 有继承关系
- 有父类引用指向子类对象 Fu f = new Zi()
- 有方法重写
多态调用成员的特点
创建对象 Fu f = new Zi();
- 变量调用 编译看左边(父类对象) 运行也看左边
- 方法调用 编译看左边 运行看右边(子类对象)
多态优点
方法中,使用父类类型作为参数,可以接收所有子类对象
多态弊端
不能使用子类的特有功能
引用数据类型转换
- 自动类型转换 Fu f = new Zi();
- 强制类型转换 Zi z = (Zi) f ;
强制类型转换后解决的问题
- 可以转成真正的子类类型,从而调用子类独有功能
- 转换类型与真实对象类型不一致会报错
- instanceof 判断类型后再进行强转
if(f instanceof Zi z){
z.method();
}
//判断 f 是不是 Zi类型的 是的话 强转成Zi类,转换后变量名为 z
//不是的话,不强转,结果为 false
包,final,权限修饰符,代码块
包
- 使用同一个包中的类,不需要导包
- 使用java.lang包中的类,不需要导包
- 其他情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
- 全类名,com.it.domain.类名
final
- 方法 最终方法,不能被重写
- 类 最终类,不能被继承
- 变量 常量,只能被赋值一次
- 实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
- 常量 单个单词 全部大写 多个单词 全部大写 单词之间用下划线_隔开
- final 修饰基本类型 数据值不能改变
- final 修饰引用类型, 变量存储的地址值不能改变,内部属性值可变
改写学生系统代码
权限修饰符
- private 私有 只能本类中用
- 默认 空着不写 只能本包中用
- protected 本包和其他包中的子类可用
- public 所有都能用
代码块
- 局部代码块 出了代码块就释放内存
- 构造代码块
- 写在成员位置的代码块。可以把多个构造方法中重复的代码抽取出来
- 在创建本类对象时会先执行构造代码块再执行构造方法
- 静态代码块 static{}
- 随着类的加载而加载,只执行一次
- 应用场景 数据初始化