final
最终的变量,常量,可以有两种形式给他赋值
第一种,定义变量的同时,初始化一个值
第二种,定义变量的时候,不给值,但是可以通过构造方法里面赋值
但是永远记住,final的成员变量,只能被赋值一次
基本数据类型作为形式参数,使用final关键字,来修饰 形式参数
形式参数引用的对象不能改变(值)
引用类型(数组,类,接口)作为形式参数,加final修饰形式参数
形式参数引用的对象不能再改变(地址值)
但是是可以改变对象的成员变量的值的
protected:
子类可以直接访问,父类本身也可以访问,同一包下,也可以访问,但是不同包之间是不能访问的
抽象类
被abstract类修饰的类,就是抽象类
抽象类的特点:
A:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
B:抽象类不能实例化,不能创建抽象类的对象
我们可以通过多态的形式,让抽象类的引用,指向子类对象
C:抽象类的子类
要么还是抽象类
要么是 具体类,并实现所有的抽象方法.
抽象类的构造方法,是让子类对象,来通过构造方法初始化父类的成员变量用的。
注意事项:
1:private 不能和abstract 一起修饰方法或者修饰类
2:final 不能和abstract 一起修饰方法或者修饰类
3:static 不能和abstract 一起修饰方法
具体方法
public void eat(){
System.out.println("Animal类型 eat()方法");
}
抽象方法,没有方法体(没有{}),并且 用abstract修饰
多态
概念:同一个事物,在不同条件下的不同表现形式
举例:生活中的例子 水,固态,液态,气态
java世界中的例子:
Cat cat = new Cat();// 创建一个猫对象,猫是一只猫
Pet pet = new Cat();// 猫是一种宠物
多态发生的三个条件
A:类与类之间要有继承关系
B:要有方法重写
C:要有父类引用指向子类对象
// 左边是父类 父类对象 = 右边的子类对象
// 父类引用 指向了子类对象
Pet pet = new Cat();
多态情况下,成员的访问特点
A:成员变量 编译看左边,运行看左边
编译的时候,看父类,也就是左边;父类中存在成员变量也可以赋值
B:成员方法 编译看左边,运行看右边
C:静态方法 编译看左边,运行看左边
多态情况下,如何访问子类的特有方法?
// 父类引用指向子类对象
Person p1 = new Student();// 向上转型
// 父类引用指向子类对象
p1 = new Teacher();
// 父类对象 强制类型转换 为 子类对象
Teacher t1 = (Teacher) p1;// 向下类型转换
强制类型转换的时候的注意事项
向下类型转换的异常
java.lang.ClassCastException:
生活中的例子:
假如:父类形容为一个大黑猫
我们把一个香蕉 放到桶里面,不能拿出一个苹果
方法重写
重写父类方法时,访问权限,只能大于等于父类的成员方法访问权限,不能比父类的成员方法的访问权限更低
@Override 告诉jvm,我们这个方法是重写,请帮我检查这个方法的生命是否正确,不正确就报错
@Override 这个叫java中的注解,注解和注释类比的学
注释是给人解释程序的
注解是给jvm解释程序的