面向对象-继承与抽象类

* Java中继承的特点:

*   Java语言只支持单一继承,只能继承一个父类

*   Java语言支持多层继承

* 继承中成员变量的特点

*   子类只能获取父类非私有成员

*   super:可以获取父类的成员变量和成员方法,用法和this是相似的

class Dad3 {
String name = "建霖";
}

class Kid3 extends Dad3 {
String name = "四葱";

public void show() {
String name = "五葱";

System.out.println(super.name);   //建霖
System.out.println(this.name);  //四葱
System.out.println(name);  //五葱
}
}

* 继承中成员方法的特点
* 子类中没有这个方法,调用父类的
* 子类中重写了这个方法,调用子类的
*

方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法之后,使用子类对象调用的就是子类的方法
方法的重载:在一个类中,有多个重名的方法,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值无关

* 方法重写的应用场景:当父类的方法不能完全满足子类使用,这个时候子类重写父类的方法,
* 并可以在方法中使用关键字super调用父类的方法,这样做即可以保有父类的功能,也可以拥有子类特有的功能
* 方法重写的注意事项:
* 不能重写父类私有的方法
* 权限必须大于等于父类方法的权限, 比如父类方法是public, 子类重写父类方法不能用private 
*
* 注解:@override 重写注解

//构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。

* 继承中构造方法的执行顺序
* 在子父类中,创建子类对象,调用子类的构造方法,
* 在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
* 为什么要调用父类构造?
* 因为需要给父类的成员变量初始化
* 肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码
*
* 以下代码执行结果:我是父类无参构造 --- 我是子类有参构造 --- 我是子类无参构造

 1 public class ExtendsDemo6 {
 2     public static void main(String[] args) {
 3         //Die d = new Die();
 4         Zi6 z = new Zi6();
 5     }
 6 }
 7 
 8 class Die6 {
 9     public Die6() {
10         System.out.println("我是父类无参构造");
11     }
12     
13     public Die6(int num) {
14         System.out.println("我是父类有参构造");
15     }
16 }
17 
18 class Zi6 extends Die6 {
19     public Zi6() {
20         //super(1);
21         //super();
22         
23         this(1);//不会再调用父类的无参构造了
24         
25         System.out.println("我是子类无参构造");
26     }
27     
28     public Zi6(int num) {
29         //会默认调用父类无参构造
30         System.out.println("我是子类有参构造");
31     }
32 }

* abstract:关键字,用于修饰方法和类
* 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
* 抽象类:有抽象方法的类必须是抽象类
*
* 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类 

//非抽象方法子类可以不重写

* 抽象类的特点:
* 抽象方法只能在抽象类里面
* 抽象类和抽象方法必须被abstract修饰
* 抽象类不能创建对象(不能实例化)
* 抽象类中可以有非抽象的方法
* 抽象类和类的关系也是继承
* 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类

* 抽象类的成员特点:

 *      成员变量

 *        可以有成员变量

 *        可以有常量

 *      成员方法

 *        可以有抽象方法

 *        可以有非抽象方法

 *      构造方法

 *        可以有构造方法的,需要对抽象类的成员变量进行初始化

 *

 * final:修饰类、成员变量、成员方法

抽象类的细节

 A:抽象类关键字abstract可以和哪些关键字共存?

1.private:

私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。

2.final:

  抽象类不能和final共存,因为抽象类自身无法创建对象,我们需要通过子类创建对象,一旦抽象类使用final关键字,那么抽象类就没有子类

  抽象方法不能和final共存,因为抽象方法后期需要被子类重写,一旦加final无法重写  

3.static:

  抽象方法不能和static关键字共存,因为一旦加static我们就可以通过类名直接访问抽象方法,由于抽象方法没有方法体,没有任何意义,也不允许这样做

B:抽象类中是否可以不定义抽象方法?

是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用

C:抽象类是否有构造函数?
       有,抽象类的构造函数,是由子类的super语句来调用,用于给抽象类中的成员初始化

原文地址:https://www.cnblogs.com/samuraihuang/p/9767555.html