java面向对象的特征
1.抽象
抽象就是将一类事物的共性抽象出来构造成一个类,抽象只关注该类事物的属性和行为,而不关注细节,例如Person类,我们只关注它具有性别属性,而不去关注,具体应该是男是女。我们也只关注它具有吃饭属性,而不去关注它如何吃,吃什么的问题。
2.封装
封装简单来说就是隐藏一切可以隐藏的东西,只向外界提供最简单的编程接口。
3.继承
继承是指子类对父类进行继承,获取父类的功能,同时进行拓展。软件的发展也是一个不断变化拓展的过程,继承使的软件具有了延续性和拓展性。
4.多态
多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态分为编译时多态和运行时多态,方法重载属于编译时多态,方法重写属于运行时多态,这是多态的两种实现方式。感觉以代码描述更为直观。
编译时多态(方法重载):
下面是一个Person类,该类中有两个重载方法eat()
public class Person { //姓名 private String name; //性别 private char sex; //国家 private String nation; public Person(String name,char sex,String nation){ this.name = name; this.sex = sex; this.nation = nation; } public void eat() { System.out.println("吃饭中..."); } public void eat(String food) { System.out.println("吃" + food); } }
我们创建一个Person对象调用两个eat方法
public class Main { public static void main(String[] args){ Person p1 = new Person("马云",'男',"中国"); p1.eat(); p1.eat("苗条"); } }
运行结果:
吃饭中...
吃苗条
可见调用了同一个对象的相同方法,却由于重载具有了不同的表现,这体现了重载多态给程序带来的扩展性的提升。eat()方法的调用在编译期,代码就已经知道该执行哪个方法,因此称为编译时多态。
运行时多态(方法重写):
下面的Chinese类是Person类的子类,重写了Person类中的eat()方法
public class Chinese extends Person { public void eat() { System.out.println("吃面条中"); } }
下面的American类是Person类的子类,重写了Person类中的eat()方法
public class American extends Person { public void eat() { System.out.println("吃披萨中"); } }
我们分别创建引用为Person类型的两个对象Chinese和American的实例,然后分别调用eat()方法
public class Main { public static void main(String[] args){ Person ameri = new American(); Person chani = new Chinese(); ameri.eat(); chani.eat(); } }
运行结果:
吃披萨中
吃面条中
从运行结果可以看出,指向相同引用的两个对象调用相同的方法,但表现却不尽相同,这便是运行时多态,代码具体调用哪一个eat()只有在运行时才能知道,根据对应的引用所指向的内存中的对象,找到对应的该对象所实现的eat()方法进行调用执行。从上面的模拟中也可以看出多态所带来的强大的扩展性,这便是多态存在的意义。
不对之处请指正。