Java中的面向对象(下)
##面向对象的特点
1.封装
2.继承
3.多态
4.抽象
###多态
多态的概念:
多态即是多种形态。比如学生和人,假如一个具体的学生张三,那么张三既是学生也属于人,即我们说的多种种状态。体现在Java中即是Student类继承了Person类,那么Student类的一个具体对象既属于Student类也属于Person类。
多态概述:
同一个引用类型,使用不同的实例而执行不同操作,即父类引用指向子类对象。
实现多态的必要条件
1.存在继承关系
2.存在方法重写
3.运行时使用父类的引用子类的对象
public static void main(String[] args) {
Man m = new Doctor();
m.cut();
m = new Director();
m.cut();
m = new Man();
m.cut();
}
}
class Man {
public void cut() {
System.out.println("Man");
}
}
//继承关系
class Doctor extends Man{
//方法重写
public void cut() {
System.out.println("动手术");
}
}
//继承关系
class Director extends Man{
//方法重写
public void cut() {
System.out.println("卡");
}
多态的优点与缺点
优点:提高了程序的维护性;提高了程序的扩展性。
缺点:无法访问子类所特有的功能
解决方法:使用多态中的转型。
多态的转型:向上转型和向下转型
向上转型(自动转换):
格式:<父类> <引用变量名> = new <子类型>();
特点:
子类转为父类,父类的引用指向子类对象,自动进行类型转换;
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法;
此时通过父类引用变量无法调用子类特有的属性和方法。
向下转型 (强制转换)
格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
特点:
父类转为子类,父类引用转为子类,强制类型转换。
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常。
instanceof关键字
用来测试它左边的对象是否是它右边的类的实例,返回值为boolean类型;instanceof通常和向下转型结合使用。
###抽象
在Java中,一个没有方法体,没有实现的方法定义为抽象方法,一个类中一旦出现抽象方法,该类一定为抽象类;但是抽象类中不一定有抽象方法。
抽象类概述
被abstract关键字所修饰的类被称为抽象类。
格式:abstract class 类名 {}
特点:
抽象类不能被实例化,只需一个引用即可,实例化的工作应交由子类来完成;
抽象类有构造方法用来被子类继承。
抽象方法特点:
抽象方法没有方法体;
抽象方法必须在抽象类中;
抽象方法必须在子类中被实现,除非子类是抽象类。
注意:在类中没有方法体的方法就是抽象方法;如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类;构造方法,静态方法,私有方法,final方法不能被声明为抽象的方法。
private final static native 可以用来修饰抽象方法吗?
1.private修饰的方法不能够被子类继承,更不可能被重写,abstract修饰的方法强制子类重写,二者冲突。
2.final修饰的方法不能够被子类继承,更不可能被重写,abstract修饰的方法强制子类重写,二者冲突。
3.static修饰的方法一般方便调用,一般都是用来实现功能的,抽象方法没有方法体,二者没有意义。
4.native修饰的方法不是Java实现的,有方法体,抽象方法没有方法体,二者没有意义。
//abstract修饰符修饰抽象类
abstract class Vehicle {
public abstract void run();
public abstract void run(Hoster hoster);
}
//存在继承关系
class Bike extends Vehicle {
//子类中方法重写
@Override
public void run() {
System.out.println("自行车在跑");
}
//子类中方法重写
@Override
public void run(Hoster hoster) {
System.out.println(hoster.getName() + "骑着自行车回家");
}
}