final()
在JAVA中final被称为终接器,可以使用final来定义类方法及常量
1.如果使用final定义的类不能有子类
2.使用final定义的方法不能子类覆写
错误代码演示
final class A{ //A类不允许有子类,此时会错误
public final void fun(){
}
}
class B extends A{
public void fun(){}//会出现错误
}
public class TestDemo{
public static void main(String args[]){
}
}
3.使用final定义的变量就变为常量,必须在声明时候赋值且不许修改
通常用public static final 来定义全局常量
常量的标识符全部使用大写表示
多态性
核心:
1.方法的多态性:
方法重载上同一个方法名称可以根据参数的类型及个数的不同调用不同的方法体
方法覆写,同一个父类的方法,可能根据实例化的子类不同有不同的实现
2.对象的多态性(前提:方法的覆写)
对象的向上转型:父类 父类对象 = 子类实例;可以实现接收参数的统一(见最后一个代码例子)
对象的向下转型:子类 子类对象 = (子类)父类实例;,可实现子类方法扩充的调用(但很少操作,存在安全隐患,所以开发中不要用向下转型)
例子:
int(下级) + long(上级) = long
例子
class A{
public void print(){
System.out.println("【A】public void print(){}");
}
}
final class B extends A{
public void print(){
System.out.println("【B】public void print(){}");
}
}
public class TestDemo{
public static void main(String args[]){
B b = new B();
b.print();
}
}
如果向下转型会有隐患,那么如何转型才靠普?应该先进行判断,而后再转型:
instanceof
子类对象 instanceof类,返回的是布尔
例子
class A{
public void print(){
System.out.println("【A】public void print(){}");
}
}
final class B extends A{
public void print(){
System.out.println("【B】public void print(){}");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B();
System.out.println(a instanceof A);
System.out.println(a instanceof B);
}
}
表明可以AB转换
instanceof可以避免ClassCastException问题:如下
class A{
public void print(){
System.out.println("【A】public void print(){}");
}
}
final class B extends A{
public void print(){
System.out.println("【B】public void print(){}");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B();
System.out.println(a instanceof A);
System.out.println(a instanceof B);
if (a instanceof B)
{
B b = (B) a;
b.print();
}
}
}
思考:多态性的意义
要求定义一个方法,可以接收Person类的所有子类实例并调用Person类的方法:
class Person{
public void takeoff(){
System.out.println("脱衣服");
}
}
class Student extends Person{
public void takeoff(){
System.out.println("一件件脱衣服");
}
}
class Worker extends Person{
public void takeoff(){
System.out.println("直接卷了");
}
}
public class TestDemo{
public static void main(String args[]){
in(new Student());
in(new Worker());
}
public static void in(Person per){
per.takeoff();//所有的人不管什么人都按照统一方式碱性
}
}
通过以上的分析;对象的向上转型有一个最核心的用处:操作参数统一