Java入门:09.Java中三大特性(封装、继承、多态)03
5 多态
首先,什么是多态呢?
多态即事物的多种表现形态。
就像生活中,人就有多种表现形态:学生,老师,警察,医生等。
那么在Java中也有类似的概念
它的作用就是:在封装时,可以更灵活的切换具体的执行功能
那么该怎样实现多态呢?
就需要:继承、重写、上转型
5.1 重写
重写只能发生在子父类关系中。
在子类中,重新编写与父类相同的属性和方法。 称为方法重写,属性重写
属性重写
-
只需要在子类中定义父类同名的属性即可, 类型可以不同
-
使用上: 类的内部的使用super指定使用的是子类的属性还是父类的属性
类的外部使用时,默认使用的是子类重写的属性
只有在上转型时,可以使用父类的属性。
属性的重写又称为属性的隐藏。
方法重写
-
子类中的方法与父类中的方法名称相同,参数列表相同,执行不同的操作
-
一般情况下 访问权限,返回类型,异常声明 都建议相同。
-
实际上
-
子类重写方法的访问权限要大于等于父类方法的访问权限。
-
子类重写方法的返回类型要小于等于父类方法的返回类型 (基于子父关系)
class A{} class A1 extends A{} class A2 extends A1{} class B1{ public A1 t1(){} } class B2 extends B1{ public A2 t1(){} }
-
子类重写方法的异常声明类型或个数 小于等于父类方法
class E41 extends E4{} class B1{ public A1 t1()throws E1,E2,E3,E41{} } class B2 extends B1{ public A2 t1()throws E4{} }
-
-
关于修饰符
-
static关键字修饰的方法不存在重写(概念)
-
final关键字修饰的方法不能被重写
-
abstract关键字修饰的方法必须被重写
-
-
使用上:类的内部可以使用super指定父类的方法
类的外部,只能使用子类重写的方法,无法使用从父类继承的方法,即使上转型也不行
方法的重写又称为方法的覆盖
5.2 上转型
将子类对象的地址存储在父类型的变量中 , 将子类对象当成父类型对象来用(本质还是子类对象)
class A{}
class B extends A{}
B b = new B();
A a = b ;
----------
A a = new B();
-
使用时,因为用的是A类型的变量, 所以以为用的是A类型的对象,所以只能用A类型中才有的属性和方法
-
但实际上, a变量中存储的是B类型的对象, 所以调用的方法都是B类型的方法
-
由于B类型的对象中,既包含B的属性,也包含父类A中的属性, 而使用时又以为使用的是A类型的对象,所以属性调用的就是从A中继承的属性,也就是父类的属性
5.3 下转型
在下转型之前,一定先存在上转型
所谓的下转型,是将之前因为上转型,存储在父类型变量中的子类型对象的地址重新存储在子类型的变量中。类似与强转一样,需要使用()来指定下转的类型。
class A{}
class B extends A{}
A a= new B();
B b = (B)a ;
几种情况:
-
两个类型不存在子父关系,无法下转型(不能强转),此时会出现语法编译错误
User u = new User(); Phone p = (Phone)u ; //语法错误
-
两个类型存在子父关系,但本质类型不相同。 此时语法编译通过,运行出错
class A{} class A1 extends A{} class A2 extends A{} A a = new A1(); A2 a2 = (A)a ; //运行错误 , 类型转化错误
-
两个类型存在子父关系,本质类型也是相同的。此时可以正常编译运行
class A{} class A1 extends A{} class A2 extends A{} A a = new A1(); A1 a1 = (A)a ;
-
6 final关键字
final关键字可以修饰变量, 方法 和 类
final修饰变量
-
可以是局部变量,也可以是属性变量,也可以是静态变量
-
表示常量,只能被赋值一次,之后不能被改变。
class A{
final static int a = 10;
final int b = 20;
public void t1(final int d){
final int c = 30;
}
}
常量变量和常量值
-
使用final修饰的变量,就成为常量变量
-
在为变量赋值时,=右边那个具体的数值,就称为常量值 10 , 20 , "abc" , 'a' , true
-
final修饰方法
称为最终方法, 不能被重写
class A{
public void t1(){}
public final void t2(){}
}
class B extends A{
public void t1(){}
public void t2(){} //错误
}
final修饰类
称为最终类,不能被继承
final class A{}
class B extends A{} //报错
原文地址:https://blog.csdn.net/a2018204587/article/details/142416054
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!