Java三大特性:封装,继承,多态。
请记住这三个词语,重要的事情说三遍。封装和继承查看我之前的文章。
其实不是很想写多态的,自认为能力不够,无法解释清楚多态优越性,或者说为什么Java会有这种特性能做什么的,对于初学者来说,Java三大特性好像体现不出什么优势的。但我还是厚着脸皮写了,三大特性需要写完的,不能半途而废。
什么是多态?
相同的行为在运行时表现出不同的形态,或者执行不相同的行为。
很多初学者,包括当初的我都会有这样的疑问,为什么相同行为会在运行期表现出不同的行为。下面上一组代码。
首先定义一个接口interface,Person里面有三个方法grow(),eat(),showMine(),定义两个类Woman和Man两个类实现Person接口。
Person接口
public interface Person {
void grow();
void eat();
void showMine();
}
Man类
public class Man implements Person {
private static final String sex = "男";
private String name;
private int age;
public Man(String name, int age) {
this.name = name;
this.age = age;
}
public void grow() {
System.out.println("男人成长");
}
public void eat() {
System.out.println("男人吃东西");
}
public void showMine() {
System.out.println("当前男人姓名是:" + name + ",年龄是:" + age);
}
public static String getSex() {
return 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;
}
}
Woman类
public class Woman implements Person {
private static final String sex = "女";
private String name;
private int age;
public Woman(String name, int age) {
this.name = name;
this.age = age;
}
public void grow() {
System.out.println("女人成长");
}
public void eat() {
System.out.println("女人吃东西");
}
public void showMine() {
System.out.println("当前女人姓名是:" + name + ",年龄是:" + age);
}
public static String getSex() {
return 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 static void main(String[] args) {
Person person1 = new Man("小明", 12);
person1.grow();
person1.eat();
person1.showMine();
Person person2 = new Woman("小红", 14);
person2.grow();
person2.eat();
person2.showMine();
}
运行结果
不知道你们看完这组代码过后,对上面的相同的行为运行时具有不相同的操作这个说法了解没有。或许你们看过很多教程,那些教程都是用继承(extends)来讲解的。但我觉得基于继承(extends)来讲多态,完全就是一种对多态的浪费,发挥不出多态的优越性。直到我学了面向接口编程,我才发现多态应该是这样用的。
实现(implements)接口(interface),从某种意义上面来说也是算一种继承(extends)的。看一组代码.
Man man = new Man("张三", 22);
if (man instanceof Person){
System.out.println("Man 是Person的子类");
}
运行结果
随着Java8的发布,接口里面的方法可以拥有默认实现,好像看起来,抽象类和接口在代码层面的差距越来越小了,但是了解的深入,你会发现从某些设计思想来说还是具有不可逾越的鸿沟。
多态我就准备写到这里了,至于什么向上转型,向下转型之类的,我觉得完全没有必要写那么多,直白点说就是强制转化的,还说什么向上转型是安全,向下转型是不安全等等。不管向上转型还是向下转型都是有风险的,但是这点风险和多态的优势相比,可以忽略不计的。
总结:Java三大特性都不是给初学者准备的,但对有一定编程基础的人来说,这些特性就非常有用!