多态:
- Java的多态是面向对象编程的三大特性之一,另外两个分别是封装和继承。**多态允许一个对象具有多种形态。**在Java中,多态的实现主要依赖于继承、接口和方法重写。
- 多态的作用主要体现在以下几个方面:
-
- 增加了代码的可扩展性:多态允许我们将子类对象当作父类对象来使用,这样在程序中就可以很容易地添加新的子类,而不需要修改原有的代码。
-
- 提高了代码的可维护性:多态使得我们可以将一组相关的操作抽象为一个通用的接口或基类,这样在修改或添加新的功能时,只需要修改或添加相应的类,而不需要修改所有的具体实现。
-
- 提高了代码的复用性:多态允许我们在不修改原有代码的基础上,重用已有的类和方法,从而减少代码的重复性。
-
如何理解多态:
例如:一个运动员可以分为篮球运动员和足球运动员,在篮球运动员的情况下,工作就是打篮球。在足球运动员的情况下,工作就是踢足球。
如何使用多态:
-
在使用多态之前我们需要学习一个知识点:转型
-
转型:Java中的转型(Casting)和多态(Polymorphism)是密切相关的概念。转型是将一个对象从一种类型转换为另一种类型的过程,而多态则是允许一个对象具有多种形态的特性。在Java中,多态主要通过继承和接口实现,而转型则是实现多态的一种手段。
-
Java中的转型和多态是密切相关的。多态允许我们将子类对象当作父类对象来使用,而转型则是在运行时将父类对象转换为子类对象的过程。这两者共同实现了Java的动态性和灵活性
-
基本数据类型的转型:
- 强制转型:
- int i = 1.2;// int i = (int)1.2;
- double d = 1.2;int i = (int)d;
- 自动转型:
- int i =1000; double d = i;
- 强制转型:
-
引用数据类型: 类 接口 数组
- 自动转型:
- A a = new A();
- B b = a;// 这行代码成立的前提是什么? B 是A的父类
- 一个学生是一个大学生? 不一定
- 一个大学生一定是一个学生
- 子类创建对象,对象的地址一般会存在子类类型对应的对象变量名中
- A a = new A(); // a是对象变量名 对象是内存中具体的一份数据体
- 子类对象的引用地址 也可以存在一个父类类型的对象变量名中
- A extends B | B b=a;
- A extends B | B b=a;
- 自动转型:
-
子类继承父类时,可以继承父类的属性和方法
- 子类还可以定义自己的属性和方法
- 子类还可以重写父类的方法
- 子类对象转型之后,调用时有无变化
- 可以调用继承的方法,,如果继承的方法被子类重写了,那就调用子类重写的方法
- 不能调用子类独有的属性和方法
public class User {
String name;
String password;
int age;
boolean isVip;
boolean isAdmin;
boolean isUser;
public void home() {
System.out.println("欢迎登录XX系统");
System.out.println("这里是您个人主页,用户等级:普通用户");
}
}
class AdminUser extends User {
public void home() {
System.out.println("欢迎登录xx系统后台");
System.out.println("这里是您个人主页,用户等级:管理员");
}
}
class VIPUser extends User {
public void home() {
System.out.println("欢迎登录xx系统后台");
System.out.println("这里是您个人主页,用户等级:VIP");
}
}
class SystemMain {
public static void login(User user, String pwdIn) {
if (user.password.equals(pwdIn)) {
user.home();
}
}
public static void main(String[] args) {
User user = new User();
user.password = "123";
AdminUser aduser = new AdminUser();
aduser.password = "123";
VIPUser vipuser = new VIPUser();
vipuser.password = "123";
// 调用相同的方法 出来不同的结果
login(user, "123");
login(aduser, "123");
login(vipuser, "123");
}
}