Java的final和多态

*************************简述一下final(面试题)*********************************


一.修饰变量


1. 基本类型


final double PI = 3.14;// 最终变量 表示常量 只能被赋值一次

PI = 3.15;//编译报错 无法为最终变量PI分配值


2.引用类型


final String s = "aaa";//最终引用 表示s只能引用 "aaa" 不能再引用其他对象了

s = "bbb";//编译报错


二. 修饰类

最终类 最终类不能被继承 相当于类的最终版本

程序员如果编写一个类,不想让别人继承,可以使用final 修饰这个类

扫描二维码关注公众号,回复: 3933179 查看本文章


一般jdk中的类 都是最终类 String、Integer、System..

final public class Bird{


}

三.修饰方法


修饰方法 最终方法


最终方法不能被重写


***************************************最终方法可以被继承吗???*******************************


可以被继承. 能不能被继承 和final没关系, 能不能被继承是看 访问控制权限修饰符..

***************************************向上转型******************************************

向上转型: 建立在继承的基础上, 把子类型的对象 赋值给父类型的引用。 可以理解成 引用类型的宽转换


向上转型会 "丢失" 子类 独有的行为

演示代码:

package com.chapter8.演示向上转型;

/**
* 作者: zhangzy
* 公司: 蓝桥软件学院
* 时间: 2017年7月6日 下午3:11:21
* 功能: 演示向上转型
* 向上转型: 把子类的对象 赋值给父类的引用 叫做向上转型
*
* 向下转型: 父类型的引用 赋值给 子类型的引用

*/
public class Teacher extends Person{

public void teach(){
System.out.println("讲课");
}

public static void main(String[] args) {

Person person = new Teacher();
/* Teacher teacher = new Teacher();


Person person = teacher;//向上转型 是安全的 自动的
*/
//向上转型 会 "丢失" 子类独有的行为
//父类型 不能调用 子类中独有的方法
//person.teach();
//Teacher teacher2 = (Teacher)person;//向下转型 不安全的 也不是自动的

//ClassCastException 运行的时候抛出一个异常 类转换异常
//Teacher cannot be cast to Student
//Student student = (Student)person;
}
}

*************************************多态*********************************


一.why


好处: 可以写出 可维护的 通用性代码,能应对需求的不断变化...

public class BlueBridgeCollege{
public void makeTeacherWork(JavaTeacher teacher){
teacher.teach();
}
}


一开始蓝桥软件学院只教java,让老师工作的方法需要定义 JavaTeacher 类型,业务扩容以后

又讲CSharp,以前的方法不能满足需求了,需要再添加一个方法


public void makeTeacherWork(CSharpTeacher teacher){
teacher.teach();
}


如果讲100门课,需要编写100个类似的方法,显然是比较傻.如何解决??


其实这100个方法方法,区别在于类名不同,有没有一种类型,可以兼容100种类型?

是有的.父类型


用多态来解决这个问题


二. what 什么是多态


一份代码、多种形态. 以1当10,以1当100


多态: 实例方法的动态绑定...、动态联编、后期绑定....


绑定: 给定一个方法名,通过该方法名决定到底执行哪块代码的过程叫做绑定...


动态绑定: 运行的时候 决定 到底执行哪一块代码...

根据传入对象的不同,传入的是javaTeacher对象 调用javaTeacher对象的teach() 打印 我在讲java
//传入的是csharpTeacher对象 调用csharpTeacher对象的teach() 打印 我在讲c#


三. how 编写多态的代码


1. 定义一个父类型(父类、抽象类、接口)


2. 定义一个子类型

(1)子类来继承父类 重写父类的方法

(2)子类继承抽象类 重写抽象类的方法

(3)子类实现接口 实现接口的方法

3. 定义一个测试方法, 方法的参数一定要是 父类型


运行的时候 传入子类的对象


***************************************几个小的面试题*****************************************

1.静态方法有多态吗??


没有.静态方法是静态绑定的, 不管运行的时候传哪个对象,都是调用的父类型的方法..

2. private 修饰的方法有多态吗?


没有.


3.final 修饰的方法有多态吗??


没有

4. 属性有多态吗?


没有.

猜你喜欢

转载自www.cnblogs.com/MrTanJunCai/p/9906784.html