day11.java

多态

多态体现的格式:

父类类型变量名= new子类对象;变量名.方法名();

父类类型: 指子类对象继承的父类类型,或者实现的父接口类型。代码如下:

Fuf=newZi();
f .method();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。

1.多态

多态的转型分为向上转型与向下转型两种

向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的
(当父类引用指向一个子类对象时,便是向上转型。)

父类类型 变量名 = new 子类类型(); 如:

Doutai yu= new Doutai();

向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。

子类类型 变量名 = (子类类型) 父类变量名;:
Cat cat =(Cat)doy;

(一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。)

1.2 转型

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥 有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子 类特有的方法,必须做向下转型。

public class Doutai {
    
    
	
	public void method(){
    
    
		System.out.println("fu lei fan fa");
	}
	public void methodp(){
    
    
		System.out.println("fu lei de te you fan fa");
	}
}


public class Doutai1 extends Doutai {
    
    
	
	public void method(){
    
    
		System.out.println("zi lei fan fa");
	}
	public void methodb(){
    
    
		System.out.println("zi lei de te you fan fa");
	}

}

public class Yu {
    
    

	public static void main(String[] args) {
    
    
		Doutai yu= new Doutai();
		yu.method();
		yu.methodp();
		
		Doutai1 xu =new Doutai1();
		xu.method();
		xu.methodb();		
		xu.methodp();
		
		
		Doutai Doutai =new Doutai1();//
		Doutai.method();//子类把父类中的重写就是子类方法
		Doutai.methodp();
		//Doutai.methodb();
	}

}

在这里插入图片描述

课堂案例

/* 成员方法
* new 的是谁,就先用谁
 * 对比
 * 成员变量   编译看左边  运行还看左边
 * 成员方法  编译看左边 运行 看右边
 * */
public class Fu {
    
    
	public static void main(String[] args) {
    
    
		Yt obj = new Yu();
		obj.method();
		obj.methodp();
	}
}

public class Yo {
    
    
	public static void main(String[] args) {
    
    
		/*直接访问  看等号左边是谁  就用谁 没有则向上找*/
		Yt obj = new Yu();//他认为是父类的  
		System.out.println(obj.num);//1.父类的
		//System.out.println(obj.age);
		/*成员方法访问  看该*/
		obj.showNew();
	}

}
public class Yt {
    
    
	
	
	int num =10;
	public void showNew() {
    
    
		System.out.println(""+num);
	}
	
	public void method(){
    
    
		System.out.println("fu lei fan fa");
	}
	public void methodp(){
    
    
		System.out.println("fu lei de te you fan fa");
	}

}
	}

}

public class Yu  extends Yt {
    
    
	int num=20;
	int age =16;
	public void showNew() {
    
    
		System.out.println("子类的方法"+num);
	}
	
	public void method(){
    
    
		System.out.println("zi lei fan fa");
	}
	public void methodq(){
    
    
		System.out.println("zi lei de te you fan fa");
	}

}
public class Cat extends Doot {
    
    
	
	@Override
public void eat() {
    
    
		System.out.println("猫够吃鱼");
	}
	public void eathom() {
    
    
		System.out.println("猫抓老鼠");
	}
}

```java
package Ling.java;

public abstract class  Doot {
    
    
	public abstract void eat();

}

package Ling.java;

public class Doy extends Doot{
    
    
	public void eat() {
    
    
		System.out.println("够吃骨头");
	}
	public void goyhom() {
    
    
		System.out.println("狗看门");
	}

}

package Ling.java;
/ 向上类型转换 总是安全的,但是也有缺陷  原来的子类的特有功能就不能使用了

public class Main {
    
    
	public static void main(String[] args) {
    
    
		// 类似于  隐式类型转换
		Doot yu =new Cat();
		yu.eat();
		// aniaml.catchMouse();
	
	// 向下类型转换  由父类型   转换成子类型   还原
		Cat cat =(Cat) yu;
		cat.eathom();
		//Doy doy =(Doy) yu;
			// java.lang.classCastException
	// Dog dog = (Dog)animal;
	}
}

在这里插入图片描述

package Ling.java;

public class M03 {
    
    
	public static void main(String[] args) {
    
    
		Doot doy = new Doy();
		doy.eat();
		if( doy instanceof Doy) {
    
    
			Doy  dog =(Doy)doy;
			dog.goyhom();
		}
		if(doy instanceof Cat ) {
    
    
			Cat cat =(Cat)doy;
			cat.eathom();
		}
	}
	public static void giveMeAPet() {
    
    
		
	}
}

在这里插入图片描述2020080605013

猜你喜欢

转载自blog.csdn.net/qq_55689246/article/details/115602072