1.子类对象和父类对象的转换
- 子类对象可以视为其父类对象的有一个对象
- 父类对象不能被当作是某一个子类的对象
- 如果一个方法的形参定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数
- 如果父类对象与引用指向的实际是一个子类对象,那么这个父类对象的引用可以强制转换成子类对象的引用;格式为:(子类名)父类名
Person p2 = new Student();
System.out.println("Person变量p2.str=" + p2.str);//p2.str显示结果为Person类中定义的结果,因为///子类可以隐藏父类的成员变量,所以把子类对象转换成父类对象是,访问的是被隐藏的成员变量
p2.print();//如果子类重写的print()方法,则调用子类重写的方法。否则调用父类的print()方法
2.final修饰符
- final关键字可以修饰类、变量和方法,被修饰的类、变量和方法无法发生改变
1.final修饰成员变量
- 类属性:可在静态初始化块中声明该属性时指定初始值
- 实例属性:可在定义该属性时指定初始值、非静态初始化块中声明该属性、构造方法中指定初始值,否则都没有定义的话,成员变量一直默认为系统指定的0、'\u000'、false或null,它们失去了存在的意义
- 类中的普通方法中不能对 final修饰的成员变量赋值
- final成员变量必须由程序员进行显示初始化,即系统不会对final成员进行隐式初始化。而且在初始化final成员变量前,不能访问该变量,否则会出错
2.final修饰局部变量
- 系统不会对局部变量进行初始化,局部变量必须由程序员手动赋值,
- final修饰的局部变量可以在定义的时候不指定默认值,而在后面只能定义一次默认值。也可以定义的时候指定默认值。
3.final修饰引用类型变量和基本类型变量区别
- final修饰的基本类型变量,不能对其重新赋值,因此基本类型变量不会被改变
- final修饰的引用类型变量,保存的仅仅是一个引用,只能保证这个指向类对象的引用的地址不会改变,已知指向同一个对象,即不能被重新赋值,但是对象本身的内容却完全可以发生改变
4.final修饰的方法和类
- final修饰的方法不能被重写,因此,如果不希望子类重写父类的某个方法,可以使用final修饰该方法
- final修饰的方法虽然不能被重写,但是可以被重载
- final修饰的类不能被继承
3.抽象类 abstract
- 用abstract修饰的类为抽象类,他拥有所有子类的共同属性和方法
- 用abstract修饰的方法为抽象方法,该方法只有声明,没有实现的方法体,方法声明后以";"结束。
- 抽象类中不一定有抽象方法,含有抽象方法的类一定是抽象类
- 抽象类不能被实例化,只能被子类继承,如果子类实现了抽象类的全部抽象方法,则,子类不再是抽象类,都是子类还是抽象类。
- 含有抽象方法的类:1.直接定义了一个抽象方法;2.继承了一个抽象父类,但没有完全实现父类包含的抽象方法;3.实现了一个接口,但是没有完全实现接口包含的抽象方法
- 抽象方法和空方法体不是一个概念 例如:public abstract void test();为一个抽象方法,而public void test(){}方法是一个普通的空方法,有方法体{};
- final和abstract永远不能同时使用,因为abstract修饰的抽象方法需要被子类重写,而final修饰的方法,不能被重写,两者冲突
- abstract不能修饰属性和构造方法.
- static和abstract不能同时使用,因为static修饰的方法是类方法,通过类调用这个方法肯定出错,因为没有方法体,因此没有类抽象方法
- private和abstract不能同时使用.