JAVA中多态的简单理解

文章目录

前言

李刚老师《JAVA疯狂讲义》第5版,第5章学习笔记。

JAVA中的多态

JAVA中的多态指的是,相同的变量,调用相同的方法,结果却不一样。具体如下:

//定义一个Person类
public class Person{
	//Person类的成员变量
	int age = 10;
	//Person类的方法
	public void eat() {
		System.out.println("我是人的吃饭方法");
	}
}
//定义一个Person类的子类,Police类
public class Police extends Person{
	//Police类的成员变量
	int age = 20;
	//Police类的方法
	public void eat() {
		System.out.println("我是警察的吃饭方法");
	}
	public void goOut() {
		System.out.println("我是警察的巡逻方法");
	}
}
//定义一个Person类的子类,Doctor类
public class Doctor extends Person{
	int age = 30;
	public void eat() {
		System.out.println("我是医生的吃饭方法");
	}
	public void work() {
		System.out.println("我是医生的工作方法");
	}
}

上述代码中,定义了三个类:Person、Police、Doctor,其中,Person是Police和Doctor类的父类。三个类中均定义了一个成员变量age,但取值不同。三个类中均定义了一个方法eat(),但输出不同。Police类还有一个独有的方法goOut(),Doctor类还有一个独有的方法work()。
接下来,运行以下代码:

public class Demo01 { 
	public static void main(String[] args) {
		Person A = new Police();
		//输出:我是警察的吃饭方法
		A.eat();
		Pearson B = new Doctor();
		//输出:我是医生的吃饭方法
		B.eat();
	}
}

可以见到,同样的两个Person类的引用变量A、B,调用同样的eat()方法,得到的结果不同,这就是多态。

那么为什么会这样呢?
在JAVA中,引用变量存在两种类型,一种是编译时的类型,一种是运行时的类型,例如:
Person A = new Police();
引用变量A在编译时的类型为Person,在运行时的类型为Police。因为子类是一种特殊的父类,因此JAVA允许把一个子类对象赋值给一个父类引用变量。这种类型转换由系统自动完成。
当运行时调用该引用变量的方法时,其方法行为总是表现出子类的特征,而并非父类的特征。因此出现了上述结果。

但是,A并不能调用Police()所独有的方法,例如:

public class Demo01 { 
	public static void main(String[] args) {
		Person A = new Police();
		//下面语句将会报错
		A.goOut();
	}
}

这段代码将会报错:
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method goOut() is undefined for the type Person
就是说Person类里面,没有定义goOut()这个方法。

同时,成员变量也不会呈现出多态的特性,例如:

public class Demo01 { 
	public static void main(String[] args) {
		Person A = new Police();
		//输出:10
		System.out.println(A.age);
		Person B = new Doctor();
		//输出:10
		System.out.println(B.age);
	}
}

两个都会输出10,而不会一个输出20,一个输出30。

同时,静态方法不会呈现出多态的特性,因为静态方法不能被重写,例如:

public class Person {
	int age = 10;
	public static void eat() {
		System.out.println("我是人的吃饭方法");
	}
}
public class Police extends Person {
	int age = 20;
	public static void eat() {
		System.out.println("我是警察的吃饭方法");
	}
	public void goOut() {
		System.out.println("我是警察的巡逻方法");
	}
}
public class Demo01 { 
	public static void main(String[] args) {
		Person A = new Police();
		//输出:我是人的吃饭方法
		A.eat();
	}
}

可以看到,由于eat()是静态方法,因此并没有呈现出多态的特性。

综上,对于JAVA中的多态总结如下:

  1. 父类中的非静态方法被子类重写后,可以呈现出多态的特征
  2. 父类中的静态方法不能被重写,不会呈现出多态的特征
  3. 父类中的成员变量也不会呈现出多态的特征
  4. 引用类型能够调用的方法取决于其编译类型,引用类型调用方法的具体结果取决于其运行类型。

对于第4条,例如:

Person A = new Police();

A在编译时的类型为Person ,因此只能调用Person 类中包含的方法,而不能调用Police()这个子类所特有的goOut()方法。A在运行时的类型为Police,因此执行eat()这个方法时,是按照Police这个类中定义的方法去执行的。(其实对于这一块笔者也有些疑问,因为笔者不清楚JAVA运行的底层机制,所以不清楚为什么会出现这种情况,如果有大佬知道的话,希望能告诉俺一下!)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的多是指同一个方法可以被不同类型的对象调用,产生不同的结果。简单来说,就是一个对象可以表现出多种形。多是面向对象编程的重要特性之一,也是Java语言的核心概念之一。 在Java,多实现的基础是继承和方法重写。当一个子类继承自父类,并重写了父类的某个方法时,子类的对象可以调用该方法,根据实际调用的对象类型的不同,会产生不同的结果。这个过程称为动绑定或运行时绑定。 例如,我们有一个Animal类和一个Dog类,Dog类继承自Animal类,并重写了Animal类的speak方法,如下所示: ``` public class Animal { public void speak() { System.out.println("Animal is speaking..."); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog is barking..."); } } ``` 现在我们创建一个Animal类型的对象a1和一个Dog类型的对象d1,调用它们的speak方法: ``` Animal a1 = new Animal(); Dog d1 = new Dog(); a1.speak(); // 输出:Animal is speaking... d1.speak(); // 输出:Dog is barking... ``` 可以看到,虽然a1和d1都调用了speak方法,但是它们输出的结果不同,这就是多的表现。在调用a1的speak方法时,由于a1是Animal类型的对象,所以调用的是Animal类的speak方法;在调用d1的speak方法时,由于d1是Dog类型的对象,所以调用的是Dog类重写的speak方法。 Java的多机制可以使代码更加灵活和可扩展,提高了代码的重用性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值