多态
多态体现的格式:
父类类型变量名= 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