欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java多态性

程序员文章站 2024-03-21 18:49:46
...

面向对象的特征之三:多态性

一、理解

可以理解为一个事物的多种形态

二、何为多态性

父类的引用指向子类的对象(或子类的对象赋给父类的引用)

三、多态性的使用:虚拟方法的使用

有了对象的多态性以后,我们在编译期,只能调用父类中的声明,我们实际执行的是子类重写父类的方法

总结:编译:看左边;运行:看右边

四、多态性的使用前提

  1. 类的继承关系
  2. 要有重写的方法

注意:对象的多态性只适用于方法,不适用于属性

​ 属性:编译和运行都看左边

多态性运行时行为

package com.atguigu.java;

public class Person {
	String name;
	int age;
	
	int id = 1001;
	
	public void eat() {
		System.out.println("人:吃饭");
	}
	public void walk() {
		System.out.println("人:走路");
	}
}
package com.atguigu.java;

public class Man extends Person {
	
	boolean isSmoking;
	int id = 1002;
	public void earnMoney() {
		System.out.println("男人负责挣钱养家");
	}
	
	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("男人多吃,长肌肉");
	}
	
	@Override
	public void walk() {
		// TODO Auto-generated method stub
		System.out.println("男人霸气的走路");
	}
}
package com.atguigu.java;

public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person();
		p1.eat();
		
		Man man = new Man();
		man.eat();
		man.age = 25;
		man.earnMoney();
		
		//*************************************
		//对象的多态性:父类的引用指向子类的对象
		Person p2 = new Man();
		//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法
		//虚拟方法的使用
		p2.eat();
		p2.walk();
		System.out.println(p2.id);
		//The method earnMoney() is undefined for the type Person
//		p2.earnMoney();
		
		
//		Person p3 = new Woman();
		
		
	}
}

面试题

package com.atguigu.exer;

public class InterviewTest {
	public static void main(String[] args) {
		Base base = new Sub();
		base.add(1,2,3);//??????

		
		Sub s = (Sub)base;
		s.add(1, 2, 3);//????

	}
}

class Base{
	public void add(int a,int... arr) {
		System.out.println("base");
	}
}
class Sub extends Base{
	public void add(int a,int[] arr) {
		System.out.println("sub_1");
	}
	public void add(int a, int b, int c) {
		System.out.println("sub_2");
	}

}

第一个add函数输出sub_1

因为多态性的方法看右边

​ 参数中…arr和[] arr不能同时出现,因为编译器认为这两个对象一样,所以是重写

​ 多态只能调用父类中有的方法,add(int a, int b, int c)在父类中根本就没有

第二个add函数输出sub_2

​ 因为强转后调用的是sub的方法,确定参数的方法优先于[] arr和… arr

相关标签: java