小白的JAVA学习笔记(五)----继承与多态,重载,抽象类

一、继承

我们知道一个类的成员有实例变量和方法。如果有多个类,它们有共同的一些方法,意味着我们编写程序时需要重复敲很多代码,这还不算烦,如果想要修改这些相同的方法还要重复修改很多内容,如何解决这个问题呢?继承。

简单来说,就是把多个类中共同的部分提取出来,形成一个新的类作为父类,其他类作为子类。用关键字extends表示继承关系,例如:class Dog extends Animal  意思是Dog继承了Animal,Animal是父类,Dog是子类。

继承的到底是啥呢?子类继承的是父类的所有public类型的方法和实例变量,但不会继承private类型的方法和实例变量!!深入说一下,未标记公有的类只能有同一个包的子类,并不是默认为公有!!根据子类的需要,可以更改父类的方法,实现覆盖。由于实例变量并未定义特殊的行为,所以无需覆盖。除此之外,子类还可以加入新的实例变量与方法。

覆盖也有规矩:覆盖后参数必须一样,返回类型必须相同!!不能降低方法的存取权限,也就是说:可以private改成public,但不可以public改成private!!

如何避免父类方法被子类覆盖呢?final关键字!!在方法或类前加一个final即可。事实上,final加在类之前,表示是继承树的末端,不能被继承。

类具有继承层次,比如说:Small_dog继承了Dog,Dog继承了Animal。如果现在想要调用某个方法,JAVA虚拟机会从Small_dog开始找,没找到的话就找Dog,还没找到就找Animal。无需担心压根不存在这个方法,编译器会报错哒。

子类如何调用父类的方法?super关键字!比如在Dog类中,super.show()表示调用Animal中的方法。

二、多态

Dog d=new Dog()//如果没有继承,引用类型与对象类型必须相同

Animal d=new Dog()//多态下,引用类型与对象类型可以不同

简单说,运用多态时,引用类型可以是实际对象类型的父类。除此之外,参数和返回类型也可以多态,比如一个函数的参数如果是Animal d,那么实际应用时可以传入Dog d。

三、重载

重载的意义就在于两个方法名称相同,但是参数不同。

参数改变要求:可以改变返回类型,可以改变存取权限,但不能只改变返回类型!!!!

比如:int add(int a,int b){

return a+b;

}

double add(double a,int b){

return a+b;

}

四、抽象类

1、抽象类代表无法创建出该类的实例,所以抽象类不一定必须被继承,但如果没有子类意味着无法实例化,即无法使用,失去了定义的意义。

2、抽象类(方法)的声明:abstract关键字!只要在类(或方法)前加一个abstract就代表抽象类(抽象方法)。

抽象方法无实体,即public abstract void show();没有方法体,直接以分号结束。

如果声明了一个抽象方法,就必须把该方法所在类标记为抽象类,非抽象类不能拥有抽象方法!!

抽象类可以既带有抽象方法,也带有非抽象方法。

3、抽象类不可以用自身初始化,只能用子类进行初始化!比如:Animal是抽象类,Dog是它的子类。

Animal a;

a=new Animal()//错误

a=new Dog()//正确

4、抽象类与方法存在的意义:当无法给出对任何子类都有意义的共同程序代码时,抽象方法可以在无法实现方法内容的前提下,定义出一组子类共同遵守的协议。而将该可继承的方法放入类中就成为了抽象类。

5、抽象类一旦定义,继承树结构下第一个具体类必须实现所有尚未实现的抽象方法!!并且继承树下的每一个具体类都必须实现抽象父类的所有抽象方法!!

                                                                                                                                       BY   ZJQ

猜你喜欢

转载自blog.csdn.net/qq_41641805/article/details/81456234