方法的重写运用在子类继承父类,使用父类方法的时候!所谓重写,从程序设计的角度来说就是在子类中定义和实现一个返回值类型、方法名称、参数列表和父类的被继承的方法完全相同的,但是方法实现的内容(代码)不同的方法,这个方法运用于子类,是面向对象多态性的体现!
从自然世界规律来理解的话,就是生物进化、变异的过程。比如假设最原始的动物都是吃肉的,那么父类在饮食方面的能力(就是eat();方法),肯定就是食肉,但是随着沧桑巨变,动物太少了,植物很多,光吃肉已经不适应社会自然了,就得进化出吃草的动物,于是有了食草动物这个子类,那么这个子类的eat();方法虽然也是继承了父类,但是还能够和父类的实现方式一样吗?想必是不可以的!所以就需要修改父类的方法的实现!
这两条原则我们先记录在此,后续再来讨论研究!
重载这个之前就说过了,和c++里差不太多。就是要求参数列表不同,也就是说,方法的参数个数或者参数的数据类型不同。这是c++里的重载,那么Java的有何区别呢?
Java的重载方法:
第一:
参数列表不同这是必须要求的
第二:
方法的返回值可以不同,这个是与c++不同的!但是光是返回值类型不同是不能区分重载的!
第三:
方法的访问控制符可以不同
第四:
方法可在类内部和子类中被重载,这说明这是一种保护类型!
重写与重载的区别?
二、抽象类在类的继承中,我们说了可以由基类(父类),派生出子类,可以在保留父类的精华(对当前子类对象有用)的属性和方法,还可以拓展出适合当前子类对象的新方法、甚至是重写父类的方法。
但是Java中还有一种抽象类的机制,这个抽象类是专门用来作为父类的类。这个有点类似c++的template模板,这个抽象类本身不能被实例化成对象,只能从抽象类去派生,目的是要求设计者用抽象类的格式去创建、修改新的类!
public class abstractTest { public static void main(String[] args) { /********* begin *********/ // 分别实例化Student类与Worker类的对象,并调用各自构造方法初始化类属性。 Student s = new Student("张三", 20, "学生"); Worker w = new Worker("李四", 30, "工人"); // 分别调用各自类中被复写的talk()方法 打印信息。 s.talk(); w.talk(); /********* end *********/ } } // 声明一个名为Person的抽象类,在Person中声明了三个属性name age occupation和一个抽象方法——talk()。 abstract class Person { /********* begin *********/ String name; int age; String occupation; Person(String name, int age, String occupation){ this.name = name; this.age = age; this.occupation = occupation; } void talk(){ System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",职业:" + this.occupation + "!"); } /********* end *********/ } // Student类继承自Person类,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息 class Student extends Person { /********* begin *********/ Student(String name, int age, String occupation){ super(name, age, occupation); } void talk(){ System.out.print(this.occupation + "——>"); super.talk(); } /********* end *********/ } // Worker类继承自Person类,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息 class Worker extends Person { /********* begin *********/ Worker(String name, int age, String occupation){ super(name, age, occupation); } void talk(){ System.out.print(this.occupation + "——>"); super.talk(); } /********* end *********/ }
抽象类可以写一般的方法、构造方法、抽象方法!
但是抽象类本身不能被实例化为具体的对象,那么它的作用是什么呢?抽象类的抽象方法可以限定所有继承它的类的对象都具有这样的方法,避免这个类在继承的过程中失去了最根本的方法。然后这个抽象类的使用可以很方便实现代码复用。因为每个对象的特性只需要在抽象方法中去修改一点点即可,不需要大规模写重复的代码。