JAVA 面向对象编程之多态与接口
定义:
多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式,根据其实际了类型调用其相应的方法。
可以理解为:同一条命令被不同的对象接收做出的不同响应。
1.1多态实现方式:
1.1.1基于继承实现的多态
基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一个方法的重写可以表现出不同的行为。
1.1.2 基于接口实现多态
基于接口实现多态,指接口的引用必须是指向实现了该接口的一个实现类的实例。
在运行时,根据对象引用的实际类型来执行对于的方法。
示例:
package 多态练习01;
public class Person implements Skill {
//姓名
private String name;
//年龄
private int age;
//性别
private char sex;
public Person() {
}
public Person(String name,int age,char sex) {
this.name = name;
this.age =age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public void eating() {
System.out.println("人在吃饭...");
}
//注意这里是静态的方法 static void sleeping()
public static void sleeping() {
System.out.println("人正在睡觉...");
}
@Override
public void drinking() {
// TODO Auto-generated method stub
System.out.println("人在喝东西...");
}
}
package 多态练习01;
//技能接口
public interface Skill {
//喝酒接口 drinking接口
void drinking();
}
package 多态练习01;
public class Chinese extends Person {
public Chinese() {
super();
}
public Chinese(String name, int age, char sex) {
// TODO Auto-generated constructor stub
super(name,age,sex);
}
@Override
public void eating() {
// 中国人吃饭时一般是用筷子和汤勺 重写了Person类的eating方法
System.out.println(this.getName()+"是用筷子和汤勺进行吃饭的...");
}
@Override
public void drinking() {
// TODO 接口方法重写
System.out.println("中国人喝二锅头,高粱酒...");
}
//在这里写这个sleeping()方法 并不会对 Person类中的sleeping方法给覆盖重写
//记住因为方法是static 静态的,静态是属于类的,并不是属于对象的,所以这里在进行多态调用时
//还是调用Person类中的sleeping()方法
public static void sleeping() {
System.out.println("中国人在睡觉...");
}
}
package 多态练习01;
public class American extends Person {
public American() {
super();
}
public American(String name,int age,char sex) {
super(name,age,sex);
}
@Override
public void drinking() {
// TODO 接口方法重写
System.out.println("美国人和鸡尾酒,威士忌...");
}
@Override
public void eating() {
// 美国人吃饭时一般是用刀子和叉子来进行吃饭的 重写了Person类的eating方法
System.out.println(this.getName()+"吃饭是用刀子和叉子...");
}
//同样的 这里在进行多态调用时也是只调用Person类的sleep()方法...
public static void sleeping() {
System.out.println("美国人在睡觉....");
}
}
package 多态练习01;
public class Test {
/*
* 测试类 测试 Person方法中的多态调用
*/
public static void main(String[] args) {
//多态调用
Person yao = new Chinese("姚明", 33, '男');
Person harden = new American("哈登", 26, '男');
yao.eating(); //调用了子类重写父类的方法 eating()
harden.eating(); //调用了子类重写父类的方法 eating()
System.out.println("------------------------------------------");
//调用接口 实现多态
Skill s1 = new Chinese();
Skill s2 = new American();
s1.drinking();
s2.drinking();
System.out.println("----------------------------------");
//类的静态方法 可以用 类名.方法()进行调用
yao.sleeping(); // Chinese.sleeping();
harden.sleeping(); // American.sleeping();
}
}