一、多态
接下来,我们学习面向对象三大特征的的最后一个特征——多态。
1.1 多态概述
什么是多态?
多态是在继承、实现情况下的一种现象,表现为:对象多态、行为多态。
比如:Teacher和Student都是People的子类,代码可以写成下面的样子
1.2 多态的好处
各位同学,刚才我们认识了什么是多态。那么多态的写法有什么好处呢?
在多态形式下,右边的代码是解耦合的,更便于扩展和维护。
- 怎么理解这句话呢?比如刚开始p1指向Student对象,run方法执行的就是Student对象的业务;假如p1指向Student对象 ,run方法执行的自然是Student对象的业务。
定义方法时,使用父类类型作为形参,可以接收一切子类对象,扩展行更强,更便利。
public class Test2 { public static void main(String[] args) { // 目标:掌握使用多态的好处 Teacher t = new Teacher(); go(t); Student s = new Student(); go(s); } //参数People p既可以接收Student对象,也能接收Teacher对象。 public static void go(People p){ System.out.println("开始------------------------"); p.run(); System.out.println("结束------------------------"); } }
1.3 类型转换
虽然多态形式下有一些好处,但是也有一些弊端。在多态形式下,不能调用子类特有的方法,比如在Teacher类中多了一个teach方法,在Student类中多了一个study方法,这两个方法在多态形式下是不能直接调用的。
多态形式下不能直接调用子类特有方法,但是转型后是可以调用的。这里所说的转型就是把父类变量转换为子类类型。格式如下:
//如果p接收的是子类对象 if(父类变量 instance 子类){ //则可以将p转换为子类类型 子类 变量名 = (子类)父类变量; }
如果类型转换错了,就会出现类型转换异常ClassCastException,比如把Teacher类型转换成了Student类型.
关于多态转型问题,我们最终记住一句话:原本是什么类型,才能还原成什么类型
二、final关键字
各位同学,接下来我们学习一个在面向对象编程中偶尔会用到的一个关键字叫final,也是为后面学习抽象类和接口做准备的。
2.1 final修饰符的特点
我们先来认识一下final的特点,final关键字是最终的意思,可以修饰类、修饰方法、修饰变量。
- final修饰类:该类称为最终类,特点是不能被继承 - final修饰方法:该方法称之为最终方法,特点是不能被重写。 - final修饰变量:该变量只能被赋值一次。
- 接下来我们分别演示一下,先看final修饰类的特点
- 再来演示一下final修饰方法的特点
- 再演示一下final修饰变量的特点
- 情况一
- 情况二
- 情况三
2.2 补充知识:常量
刚刚我们学习了final修饰符的特点,在实际运用当中经常使用final来定义常量。先说一下什么是Java中的常量?
- 被 static final 修饰的成员变量,称之为常量。
- 通常用于记录系统的配置信息
接下来我们用代码来演示一下
public class Constant { //常量: 定义一个常量表示学校名称 //为了方便在其他类中被访问所以一般还会加上public修饰符 //常量命名规范:建议都采用大写字母命名,多个单词之前有_隔开 public static final String SCHOOL_NAME = "西亚斯"; }
public class FinalDemo2 { public static void main(String[] args) { //由于常量是static的所以,在使用时直接用类名就可以调用 System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); System.out.println(Constant.SCHOOL_NAME); } }
- 关于常量的原理,同学们也可以了解一下:在程序编译后,常量会“宏替换”,出现常量的地方,全都会被替换为其记住的字面量。把代码反编译后,其实代码是下面的样子
public class FinalDemo2 { public static void main(String[] args) { System.out.println("西亚斯"); System.out.println("西亚斯"); System.out.println("西亚斯"); System.out.println("西亚斯"); System.out.println("西亚斯"); System.out.println("西亚斯"); System.out.println("西亚斯"); } }
三、抽象
同学们,接下来我们学习Java中一种特殊的类,叫抽象类。为了让同学们掌握抽象类,会先让同学们认识一下什么是抽象类以及抽象类的特点,再学习一个抽象类的常见应用场景。
3.1 认识抽象类
我们先来认识一下什么是抽象类,以及抽象类有什么特点。
- 在Java中有一个关键字叫abstract,它就是抽象的意思,它可以修饰类也可以修饰方法。
- 被abstract修饰的类,就是抽象类 - 被abstract修饰的方法,就是抽象方法(不允许有方法体)
接下来用代码来演示一下抽象类和抽象方法
//abstract修饰类,这个类就是抽象类 public abstract class A{ //abstract修饰方法,这个方法就是抽象方法 public abstract void test(); }
- 类的成员(成员变量、成员方法、构造器),类的成员都可以有。如下面代码
// 抽象类 public abstract class A { //成员变量 private String name; static String schoolName; //构造方法 public A(){ } //抽象方法 public abstract void test(); //实例方法 public String getName() { return name; } public void setName(String name) { this.name = name; } }
- 抽象类是不能创建对象的,如果抽象类的对象就会报错
- 抽象类虽然不能创建对象,但是它可以作为父类让子类继承。而且子类继承父类必须重写父类的所有抽象方法。
//B类继承A类,必须复写test方法 public class B extends A { @Override public void test() { } }
- 子类继承父类如果不复写父类的抽象方法,要想不出错,这个子类也必须是抽象类
//B类基础A类,此时B类也是抽象类,这个时候就可以不重写A类的抽象方法 public abstract class B extends A { }
最新Java基础系列课程--Day08-面向对象高级(二)https://developer.aliyun.com/article/1423505