ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java多态

2022-01-04 19:04:29  阅读:182  来源: 互联网

标签:Java void 多态 System println Male public out


一、多态概论

1.定义

面向对象程序设计的三大支柱是封装,继承和多态。不同类的对象对同一消息作出不同的响应就叫做多态。

2.满足的条件

a.子类继承父类
b. 子类重写父类方法
c. 子类对象指向父类声明(最关键一点)

3.多态的定义与使用格式

定义格式:父类类型 变量名=new 子类类型();

二、向上转型和向下转型

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

向上转型不要强制转型

父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定

向上转型后父类引用不能调用子类自己的方法

public class Human {
	public void sleep() {
	    System.out.println("Human sleep..");
	}
	
    public static void main(String[] args) {
    	Male m = new Male();
	    m.sleep();
	    
	    Human h = new Male();// (1) 向上转型
	    h.sleep();   //(2)动态绑定
	    //h.speak();  //(3)此方法不能编译,报错说Human类没有此方法
    }
}
	    
	
	class Male extends Human {
		@Override
		public void sleep() {
			System.out.println("Male sleep.");
		}
		public void speak () {
			System.out.println("I am Male");
	}
}
	
	class Female extends Human {
		
	@Override
	public void sleep() {
		System.out.println("Female sleep.");
	}
	public void speak() {
		System.out.println("I am Female");
	}
 
}

运行结果为:Male sleep.

                      Male sleep.

2.向下转型(用的比较少):父类类型向子类类型向下转换的过程(强制)。一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,就是向下转型。

//接上段
 
//向下转型:成功
Male m2 = new Male();
Human h2 = m2;       //向上转型
m2 = (Male)h2;       //向下转型
m2.speak();
 
//向下转型:失败
Human h3 = new Human();
Male m3 = (Male)h3;
m3.speak();         //运行时会出现错误,可以用instanceof诊断
 
//向下转型:类型防护
Human h4 = new Human();
if (h4 instanceof Male){  //因为h4不是Male的实例,所以不执行if内部代码
    Male m4 = (Male)h4;
    m4.speak;
}

三、instanceof关键字

作用:用来判断某个对象是否属于某种数据类型。

注意: 返回类型为布尔

四、多态的应用

一个完整的 代码实例:

1.首先,创造动物类

// 动物类
class Animal {
    int age;
    String name;
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    // 动物类里面有叫和吃两个方法
    public void cry() {
        System.out.println("我不知道叫什么");
    }
 
    public void eat() {
        System.out.println("我不知道吃什么");
    }
}

2.2.其次,分别创造猫类和狗类(他们继承于动物类):

// 狗类继承于动物类
class Dog extends Animal {
    // 覆盖(重写)方法
    public void cry() {
        System.out.println("旺旺");
    }
 
    public void eat() {
        System.out.println("我是狗,我爱吃骨头");
    }
}
// 猫类继承于动物类
class Cat extends Animal {
    // 覆盖(重写)方法
    public void cry() {
        System.out.println("喵喵");
    }
 
    public void eat() {
        System.out.println("我是猫,我爱吃鱼");
    }
}

3.再者,创建食物类:

// 食物类
class Food {
 
    String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    // 食物类里面让它有一个方法
    public void showName() {
 
    }
}

4.再者,猫和狗都有自己不同的爱吃的食物(他们继承于食物类):

// 鱼(食物的一种)继承于食物
class Fish extends Food {
    public void showName() {
        System.out.println("食物:鱼");
    }
}
// 骨头(食物的一种)继承于食物
class Bone extends Food {
    public void showName() {
        System.out.println("食物:骨头");
    }
}

5.主人类(就可以将动物和对应的食物统一起来):

// 主人类 存在一种喂食方法
class Master {
    // 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
    // 有了多态,以后即使再来好多动物,用这一个函数就可以了
    public void feed(Animal an, Food f) {
        an.eat();
        f.showName();
 
    }
}

6.最后,方法的调用(测试):

public class DuoTaiDemo {
 
    public static void main(String args[]) {
 
        Master master = new Master();
        master.feed(new Dog(), new Bone());
 
        master.feed(new Cat(), new Fish());
 
    }
}

结果

 五、引用

 Java 多态 ——一个案例 彻底搞懂它_vaychen的博客-CSDN博客

标签:Java,void,多态,System,println,Male,public,out
来源: https://blog.csdn.net/For_Forever__/article/details/122308842

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有