Java寒假学习Day16:多态性(2)

Java寒假学习Day16:多态性(2),第1张

Java寒假学习Day16:多态性(2) 1. 什么是多态性?
 
2.对虚拟方法调用的理解: 

 虚拟方法调用
 (Virtual Method Invocation) 
 

  
 正常的方法调用 
 

 Person e = new Person(); 
 

 e.getInfo(); 
 

 Student e = new Student(); 
 

 e.getInfo(); 
 

  
 虚拟方法调用
 (
 多态情况下
 ) 
 

 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父 
 

 类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法 
 

 确定的。 
 

 Person e = new Student(); 
 

 e.getInfo(); 
 

 //
 调用
 Student
 类的
 getInfo()
 方法 
 

  
 编译时类型和运行时类型 
 

 编译时
 e
 为
 Person
 类型,而方法的调用是在运行时确定的,所以调用的是
 Student
 类 
 

 的
 getInfo()
 方法。
 ——
 动态绑定
 

 

3.多态属于运行时行为还是编译时行为?怎么证明?

答:多态是运行时行为,只有运行时才能确定实例化对象

举例如下:

import java.util.Random;

//面试题:多态是编译时行为还是运行时行为?
//证明如下:
class Animal  {
 
	protected void eat() {
		System.out.println("animal eat food");
	}
}

class Cat  extends Animal  {
 
	protected void eat() {
		System.out.println("cat eat fish");
	}
}

class Dog  extends Animal  {
 
	public void eat() {
		System.out.println("Dog eat bone");

	}

}

class Sheep  extends Animal  {
 

	public void eat() {
		System.out.println("Sheep eat grass");

	}

 
}

public class InterviewTest {

	public static Animal  getInstance(int key) {
		switch (key) {
		case 0:
			return new Cat ();
		case 1:
			return new Dog ();
		default:
			return new Sheep ();
		}

	}

	public static void main(String[] args) {
		int key = new Random().nextInt(3);

		System.out.println(key);

		Animal  animal = getInstance(key);
		
		animal.eat();
		 
	}

}

在没有执行之前,没有办法确认具体实例化了哪个对象

只有执行以后才能确定实例化的对象

 4.重载和重写的区别? 4.1定义上

重载: 同类同名不同参(参数类型,参数数量,参数顺序)

重写:子父类的子类中,对父类同名同参方法的方法体重写

4.2在机制上

重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不
同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了
不同的方法。它们的调用地址在编译期就绑定了。Java的重载是可以包括父类
和子类的,即子类可以重载父类的同名不同参数的方法。
所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,
这称为“早绑定”或“静态绑定”;

而对于多态中的 重写 ,只有等到方法调用的那一刻, 解释运行器才会确定所要调用的具体 方法 ,这称为 “晚绑定”或“动态绑定” 。

 

5.向下转型与instanceof关键字   5.1向下转型:把父类强制转换成子类对象 5.2instanceof关键字:a instanceof A:判断a是否是A类的一个实例
import java.util.Date;
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();
		
		/
		if(p2 instanceof Woman){
			Woman w1 = (Woman)p2;
			w1.goShopping();
			System.out.println("******Woman******");
		}
		
		if(p2 instanceof Man){
			Man m2 = (Man)p2;
			m2.earnMoney();
			System.out.println("******Man******");
		}
		
		if(p2 instanceof Person){
			System.out.println("******Person******");
		}
		if(p2 instanceof Object){
			System.out.println("******Object******");
		}
		
//		if(p2 instanceof String){
//			
//		}
		
		//练习:
		//问题一:编译时通过,运行时不通过
		//举例一:
//		Person p3 = new Woman();
//		Man m3 = (Man)p3;
		//举例二:
//		Person p4 = new Person();
//		Man m4 = (Man)p4;

		
		//问题二:编译通过,运行时也通过
//		Object obj = new Woman();
//		Person p = (Person)obj;
		
		//问题三:编译不通过
//		Man m5 = new Woman();
		
//		String str = new Date();
		
//		Object o = new Date();
//		String str1 = (String)o;
		
		
		
	}
}

其中Person类(父类)

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("人:走路");
	}
	
}

Man类(Person类的子类1)

package com.atguigu.java;

public class Man extends Person{
	
	boolean isSmoking;
	
	int id = 1002;
	
	public void earnMoney(){
		System.out.println("男人负责挣钱养家");
	}
	
	public void eat(){
		System.out.println("男人多吃肉,长肌肉");
	}
	
	public void walk(){
		System.out.println("男人霸气的走路");
	}

}

Woman类(Person类子类2)

package com.atguigu.java;

public class Woman extends Person{
	
	boolean isBeauty;
	
	public void goShopping(){
		System.out.println("女人喜欢购物");
	}
	
	public void eat(){
		System.out.println("女人少吃,为了减肥");
	}
	
	public void walk(){
		System.out.println("女人窈窕的走路");
	}
}

6.对多态性理解的测试题

package MultiTest;


class SuperClass{
	int id = 10;
	
	public void show() {
		System.out.println(this.id);
	}
}

class SubClass extends SuperClass{
	int id = 20;
	
	public void show() {
		System.out.println(this.id);
	}
}

public class Test1 {
	public static void main(String[] args) {
		SubClass s = new SubClass();
		System.out.println(s.id);
		s.show();
		
		SuperClass su = s;//多态
		System.out.println(su.id);
		System.out.println(su == s);
		su.show();
	}
}

 最后的答案为:

20/20/10/true/20

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5718295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存