继承(inheritance):是指一种编程中的能力,可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
作用:
1. 提高了代码的重用性
2. 让类与类之间产生了关系,提供了多态的前提
Java中不支持多继承,切忌为了使用某个类中的方法而是使得两个在逻辑上无关联的类产生继承关系
super 关键字:
与this用法一样,this表示本类的引用,super表示父类的引用。
当子类要调用父类中的方法的时候,用super.函数名() 即可。
子类的所有构造函数都会默认访问父类中空参数的构造函数,因为子类中每一个构造函数第一句都有一个隐式的super()。当父类中没有空参数的构造函数的时候,需要手动定义super语句形式来访问父类中的构造函数。
注意:super()语句一定定义在构造函数的第一行,所以不能与this()同时存在。
函数覆盖(Override):
子类和父类中出现一模一样的方法时候,会出现覆盖操作,也称为重写或复写。父类中的private方法不可以被复写。如需调用被复写的方法,只要用super即可,这样子类即可以调用父类的功能,也可以实现自己特有的功能。
注意:复写时子类方法的权限一定要大于父类方法的权限,而且静态只能覆盖静态。
多态(polymorphism):
体现:父类的引用指向子类的对象。
作用:提高了程序的扩展性和可维护性。
前提:需要存在继承或者实现关系,要有覆盖操作。
多态的出现使得程序的扩展性大规模提高,用起来更加灵活,这里用一个接口的例子来展示继承和多态的好处。
先用一个不用到实现接口和多态的方法写这个卖宠物粮食的例子:
class Cat {
public void buy(){
System.out.println("我是猫,我要买猫粮");
}
}
class Dog {
public void buy(){
System.out.println("我是狗,我要买狗粮");
}
}
//然后下面这个类就是店主
public class Person{
public static void main(String[] args){
Cat c = new Cat();
c.buy();
Dog d = new Dog();
d.buy();
}
}
这样,就成功的卖给了猫、狗粮食。但是,如果不是两个动物,而是几十个,甚至上百个种类的宠物来你的店里买粮食,就需要new上百个类,来实现其中的方法,而且最糟糕的是还必须知道是什么宠物来你的店里买粮食(也就是说必须知道是调用哪个类中的方法,比如这个类中有buy()方法,那个中没有,没有用接口标记,还要一行一行的去查原代码!),这个复杂程度可想而知。
接下来用接口和多态的方法来实现:
interface PetBuy{ //定义一个宠物购买粮食的接口
public void buy();
}
class Cat implements PetBuy{
public void buy(){
System.out.println("我是猫,我要买猫粮");
}
}
class Dog implements PetBuy{
public void buy(){
System.out.println("我是狗,我要买狗粮");
}
}
/*这个仍然是店主卖粮食,但是,这时店主觉得请一个售货员来卖比较好,这样根本就
不需要new什么各种宠物的对象,也不需要知道是什么宠物来买你的粮食*/
//接下来创建一个售货员类
class Salesclerk{
public void buy(PetBuy pet){
pet.buy(); //接收一个接口,以父类调用子类中的方法
}
}
//这个还是店主你的类
public class Person{
public static void main(String[] args){
PetBuy cat = new Cat(); //实例化一个猫
PetBuy dog = new Dog(); //实例化一个狗
Salesclerk s = new Salesclerk(); //实例化一个售货员
s.buy(cat); //把猫给售货员
s.buy(dog); //把狗给售货员
}
}
这样,就只创建了一个售货员,让售货员卖了猫粮、狗粮。如果上百个种类的宠物来你的店里买粮食,也只需要实例化宠物的对象即可,根本就不需要知道是什么宠物来买你的粮食,直接用 s 来调用各个对象的方法,这样是不是方便管理了很多呢。其实可以更加简化这个代码,直接把接收的参数定义成一个函数,返回的是PetBuy中的各种子类对象,这样只要创建一个函数就可以节省很多代码了!在实际中,比如我们要给用户写一个链接数据库的类,但是这么多用户,谁知道他们用的是sql、mysql、oracle中的那种呢?所以须给每个数据库的crud方法都写出来。而使用了接口,只需要接收一个数据库类型的参数,就可以只写一次crud的方法。当类中相同的方法越多,使用接口和多态就越简便。
总结:面向对象的三大特征封装、继承、多态是Java中最基础,也是最广泛的应用,必须牢牢掌握其中的每个知识点,这样才学习新的知识时更容易理解。