之前介绍了java面向对象三大特性之一封装,现在来说说三大特性之一继承和抽象类。这些只是我个人的认识,不足之处还请见谅。
1、 继承是面向对象的三大特征之一,那么何为继承呢?
继承是指一个对象直接使用另一个对象的属性与方法,是通过extends关键字让类与类之间产生继承关系。而被继承的类称为父类,继承父类的类称为子类(派生类)。
//父类
class Animal {
//如果属性需要被子类继承,那么可以使用protected关键字,方法也一样
protected String name;
protected void dec(){}
}
//子类
class Dog extends Animal{
System.out.println("name"+name);
}
2、继承的利弊:
通过继承可以提高了代码的复用性,且让类与类之间产生了关系,给面向对象第三个特征多肽提供了前提。当然,继承也有它的限制:在java中只能实现单继承,也就是一个类只能有一个父类。但是呢,java中却允许多层继承,即一个子类可以有一个父类,而父类可以再有父类。并且继承只能继承父类中非私有的属性和方法。且构造方法不能被继承。
3、什么是单继承,多继承?
所谓单继承就是一个子类只能有一个父类。而多继承就是一个子类可以有多个父类(java中不允许,但是可以进行改良,不直接继承,因为多个父类中有可能有相同成员,会产生调用的不确定性,在java中通过“多实现”来体现)。java中支持的多层继承就是:C继承B,B继承A,就会出现所谓的继承体系。而使用一个继承体系的时候先要查看该体系中的顶层楼,了解该体系的基本功能;二是创建体系中的最子类对象,完成功能的使用。
4、那么我们什么时候可以定义继承呢?当类与类之间存在所属关系的时候,就定义继承。XXX是YYY中的一种。xxx extends yyy所属关系:is a 关系。
5、使用继承可以继承父类的方法和属性,那当我们不需要父类中的方法,或者需要重新定义时,那就可以使用方法的重载了。也就是覆盖。什么叫覆盖呢?现在来说说:当子类出现成员函数和父类一摸一样的情况时,会运行子类中的函数,这种现象称为覆盖操作。覆盖操作需要注意的事项:一是覆盖父类方法的时,子类权限必须大于等于父类中的权限;
二是静态方法只能覆盖静态,或被静态覆盖。现在问题来了,那么什么时候使用覆盖操作呢?当对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就是用覆盖功能。如下;
1 class Phone{
2 String name;
3 void call (){}
4 void show(){}
5 System.out.println("number");
6 }
7 class NewPhone extends Phone {
8 void show {
9 System.out.println("name"+name);
10 super.show();
11 }
12
13
14 }
6、在继承之后,子父类中构造函数的特点:在子类构造对象时,发现访问子类构造函数时,父类中的构造函数也运行了。为什么会出现这种情况呢?原因是在子类的构造函数中的第一行有一个默认的隐式语句:super();而子类的实例化过程中所有的子类都会访问父类中的空参数的构造函数。
注意:父类中的私有方法不可以被覆盖,父类中的为static的方法无法覆盖;覆盖时,子类权限一定要大于等于弗雷方法权限。
7、在定义属性和方法时都会用到一个关键字final:在程序中,一个数据是固定的,直接使用也可以了,但是阅读性差,所以给数据起个名字,并且这个变量的值不会变,所以加上final修饰固定,不会在改变。而使用final的关键字可以声明一个类,一个方法,一个常量。当然,使用final声明的类不能被继承,声明的方法不能被重写,声明的属性为常量,只能赋值一次。
public static final double MY_PI=3.14;
static final int x=7;
void method(){
final int Number=5;
}
8、抽象类的概念:很多具有相同特征和行为的对象可以抽象为一个类,而很多具有相同特征和行为的类可以抽象为一个抽象类。抽象类是使用abstract关键字声明的类。
注意:具体类继承抽象类必须要实现抽象类中所有的抽象方法。
声明一个抽象类:
1 public abstract class Animal {
2 private String name;
3 public abstract void say();//抽象方法,没有实现体
4
5 }
6 class cat extends Animal{
7 public void say(){
8 System.out.println("I am a cat!");
9
10 }
11
12 }
9、使用抽象类必须遵循的规则:抽象类可以没有抽象方法,但是有抽象方法的类必须是抽象类;非抽象类继承抽象类必须实现所有的抽象方法;抽象类可以有方法实现和属性;
抽象类不能被实例化(调用抽象方法没有意义);抽象类不能用final修饰。抽象类具有的特点:方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类也必须是抽象类;抽象类必须有其子类覆盖了所有的抽象方法后才能实例化,否则该子类还是抽象类。
注意:抽象类中可以有构造函数,用于子类对象的初始化;抽象类可以不定义抽象方法,但是比较少见,其目的就是不让该类创建对象。通常这个类有方法体,却没有内容,AWT的适配器就是这种。抽象关键字abstract不可以和private、static、final关键字共存。抽象类一定是个父类,因为子类需要覆盖父类中的所有方法后才能实例化。
10、抽象类和一般类的异同点:
相同点:抽象类和一般类都是用来描述事物时,都在内部定义了成员。
不同点:一般类有足够的信息描述事物,而抽象类描述事物的信息有可能不足;一般类中不能定义抽象方法,只能定义非抽象方法,而抽象类中可以定义抽象方法,也可以定义非抽象方法;一般类可以实例化,抽象类不可以被实例化。
11、抽象方法的由来:多个对象都具备相同的功能,但是功能具体的内容不同,在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法就称为抽象方法。