Java SE 020 多态详解

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Java SE 020 多态详解

文章目录

  • Java SE 020 多态详解
    • 1.多态
      • 1.1注意
    • 2.为什么要使用多态?
    • 3.新问题
    • 4.解决办法

1.多态

(1)多态是一种运行期的行为,而不是编译期的行为。

(2)换句话说,java执行环境,只有到真正运行程序的时候,才知道这个Animail b = new Cat();b到底指向的是什么。

(3)在编译的时候,它只知道b是一个Animal类型的,但是它具体指向的是谁,它其实不知道。

(4)虽然在源程序里面我们知道它指向的是谁,但是java编译器是不知道它指向的是谁的。

1.1注意

多态可以实现晚绑定,由父类的引用指向子类的对象,这只是它的一个表面现象。

2.为什么要使用多态?

(1)示例代码:

public class PolyTest5{
	public void run(){
		
	}
}

class Car{
	public void run(){
		System.out.println("car is runing!");
	}
}

class BMW extends Car{
	public void run(){
		System.out.println("BMW is running!");
	}
}

class QQ extends Car{
	public void run(){
		System.out.println("QQ is running!");
	}
}

(2)需求,PolyTest5中的run方法,既要处理BMW的run(),又要处理QQ的一个run()。那么按照通常的写法

public class PolyTest5{
    public void run(BMW bmw){
            bmw.run();
    }

    public void run(QQ qq){
        qq.run();  
    }
}

3.新问题

public class PolyTest5{
	public void run(BMW b){
		b.run();
	}

	public void run(QQ qq){
		qq.run();
	}

	public static void main(String[] args){
		PolyTest5 test = new PolyTest5();
		//要处理BMW的run(),那么先生成BMW的对象
        BMW bmw = new BMW();
        test.run();
        QQ qq = new QQ();
		qq.run();
	}
}

class Car{
	public void run(){
		System.out.println("car is runing!");
	}
}

class BMW extends Car{
	public void run(){
		System.out.println("BMW is running!");
	}
}

class QQ extends Car{
	public void run(){
		System.out.println("QQ is running!");
	}
}
public class PolyTest5{
	public void run(BMW b){
		b.run();
	}

	public void run(QQ qq){
		qq.run();
	}

	public static void main(String[] args){
		PolyTest5 test = new PolyTest5();
		//要处理BMW的run(),那么先生成BMW的对象
        BMW bmw = new BMW();
        bmw.run();
        QQ qq = new QQ();
		qq.run();
	}
}

class Car{
	public void run(){
		System.out.println("car is runing!");
	}
}

class BMW extends Car{
	public void run(){
		System.out.println("BMW is running!");
	}
}

class QQ extends Car{
	public void run(){
		System.out.println("QQ is running!");
	}
}

(1)车不可能只有这两辆,如果新增加一些车辆,如奔驰。

(2)增加一个车就要增加一个子类,去继承Car。

(3)然后在PolyTest5类中要处理run方法,就需要增加新的车辆的run方法。

(4)不是说不行,增加一百个方法也可以,但是这显然不是一个好的办法。

(5)为什么不写一个方法,能处理所有的情况呢?来一个车,就搞定一个,再来一个车,就再搞定一个,一个方法能解决所有的车,这能体现出来多态的特点。

4.解决办法

public class PolyTest5{
	/*
	public void run(BMW b){
		b.run();
	}

	public void run(QQ qq){
		qq.run();
	}
	*/
	/**
		一个方法搞定所有的变化
		因为以上注释了的方法中所有方法签名参数的类,都继承了Car这个类,所以在方法签名中,只需要将参数换为这些类的父类即可,用它们父类的引用,去指向
具体的子类。即在方法运行期去决定使用哪一个具体的子类。  由new 出来的具体子类对象给下面的这个run方法签名中的参数父类引用car赋值,即用car去指向具体的子类对象。
	*/

	public void run(Car car){
		car.run();
	}

	public static void main(String[] args){
		/*
		PolyTest5 test = new PolyTest5();
		//要处理BMW的run(),那么先生成BMW的对象
                BMW bmw = new BMW();
                test.run();

                QQ qq = new QQ();
	        qq.run();
		*/
		PolyTest5 test = new PolyTest5();
		Car car = new BMW();
		/*
		因为run()方法接收的是一个Car类型的变量,相当于把Car赋值给了car
		*/
		test.run(car);
		QQ qq = new QQ();
		test.run(qq);
		
	}

}

class Car{
	public void run(){
		System.out.println("car is runing!");
	}
}

class BMW extends Car{
	public void run(){
		System.out.println("BMW is running!");
	}
}

class QQ extends Car{
	public void run(){
		System.out.println("QQ is running!");
	}
}

(1)增加一百辆车,类肯定是省不了的,增加一百种车就要增加一百个子类,但是1个方法可以搞定后面所有的车了。因为只要extends Car这个父类的话,我都可以作为这个参数传进去。

(2)根据多态,子类数据都可以传进去。所以一个方法就可以应付所有的车。所以不用增加100个方法。这是多态给我们带来的一个好处。它屏蔽掉了子类之间的差异性。

(3)我用一个公共的父类去标识着我的方法的参数,不管子类如何变化,增加多少子类,还是发生什么变化,只要增加的这些子类都继承了我的这个父类,你都可以作为参数传递到我的方法里面去。

但是1个方法可以搞定后面所有的车了。因为只要extends Car这个父类的话,我都可以作为这个参数传进去。

(2)根据多态,子类数据都可以传进去。所以一个方法就可以应付所有的车。所以不用增加100个方法。这是多态给我们带来的一个好处。它屏蔽掉了子类之间的差异性。

(3)我用一个公共的父类去标识着我的方法的参数,不管子类如何变化,增加多少子类,还是发生什么变化,只要增加的这些子类都继承了我的这个父类,你都可以作为参数传递到我的方法里面去。

(4)如果没有多态,传什么类型,就声明什么类型,代价太大,也是可以做出来的,但是这个动作太大了,得不偿失。所以对于这种情况,最好是声明一个父类型的引用作为一个引用的参数,然后将子类具体的对象,传过去就可以了。

你可能感兴趣的