/*父子类之间的继承关系
* 1.子类继承父类的关键字:extends
* 2.除外父类中的被private修饰的成员变量和方法不可以被子类继承,其它都可以被子类继承
* 3.子类继承父类后又出现和父类相同的成员变量,则父类中的成员变量被隐藏,子类只能通过从父类继承过来的方法去修改它
* 4.子类继承父类中的方法,可以对其进行重写,父类中的方法则被隐藏起来了。方法重写规则为:
* (1)必须存在继承关系 (2)重写后的方法必须和父类保持一致(包括返回值类型,方法名和修饰符列表)
* (3)重写后的方法的访问权限不得低于父类中的方法的访问权限,可以更高
* 5.子类除继承父类中的成员变量和方法之外,还可以自定义自己的成员变量和方法。
* 6.所有的类都是Object类的子类,因此可以称Object类为超类
* 7.关于子类的上转型对象:
* 将子类的赋值给父类的引用,这种情况被认为是子类的上转型,子类对象也因此变为上转型对象
* (1)子类的上转向对象可以访问父类中被隐藏的成员变量
* (2)子类的上转型对象访问父类中被隐藏的方法时,调用的依然是子类中重写的方法。
* (3)对比子类和子类的上转型对象之间的区别(关于访问父类中的成员变量和方法)
* 子类的上转型对象可以访问:
* 从父类中继承的变量;父类中被子类隐藏的变量;从父类中继承的但未被重写的方法
* 子类的上转型对象不可以访问:
* 从父类中继承的已被子类重写的方法;子类新增的成员变量和方法
* 子类可以访问:
* 从父类继承的成员变量和方法,除外父类中的私有变量和方法;
* 子类不可以访问:
* 父类中被隐藏的成员变量和方法,以及父类中的私有变量和方法
* 8.对象的上转型对象有点类似于面向对象中的多态。
* 9.关于final 关键字:
* (1)修饰成员变量时,被final 修饰的成员变量必须在声明的时候就赋予初始值;并且不允许再做任何修改,包括在被子类继承之后
* (2)修饰方法时,子类从父类中继承的被final修饰的方法不允许重写
* (3)修饰类时,被final修饰的类不可以被继承,即没有子类。
* 10.关于抽象类:abstract class 类名{}
* (1)抽象类和普通类类似,修饰符列表多了一个abstract,类体中可以有成员变量,普通方法和抽象方法
* (2)抽象类中的抽象方法没有方法体,需要继承该抽象类的子类重写抽象方法,否则抽象类和抽象方法都毫无意义
* (3)抽象类不能实例化对象,必须由普通类去继承它,抽象类中的属性和方法的存在才具有意义
* (4)抽象类中也可以没有抽象方法
* (5)abstract不可以用来修饰成员变量,并且抽象类中的成员变量必须赋予初始值
* (6)抽象类存在的意义:
* 将其它多个普通类*同存在的属性和方法,集中体现在一个抽象类中,并且这些类共同的需求又有一些小小的区别:例如计算一个柱体的体积,
* 而柱体的底又存在多种形状的,但无论是哪一种形状,都需要有计算面积的功能,因此可以将计算面积这一功能封装在一个抽象类当中,让不同形状的底去
* 继承该抽象类,并实现里面的抽象方法,这样也使得每一个类型的底不用重读写计算面积的功能代码,因此抽象类的使用也实现了代码的复用性。
* 11.关于接口:
* 接口是一种特殊的抽象类,抽象类是一种不完全的抽象类,因为其里面可以不包含抽象方法,而接口里必须全部为成员必须全部是抽象的,
* 因此接口是一种特殊的,完全的抽象类
* (1)接口是一种抽象类,因此接口也是一种引用
* (2)修饰接口的修饰符: interface
* (3)接口支持多实现,即一个类可以同时实现多个接口,一个接口也可以同时被多个类实现
* (4)接口中的方法全部都是抽象的,并且必须是公开的(public),因此实现了接口的类必定要重写里面全部的抽象方法;
* 语法格式:[public abstract] 返回值类型 方法名();
* (5)接口中的成员包括常量(没有变量)和抽象方法,其中常量的声明语法格式为:
* [public fianl static] 类型 常量名=常量值;
* (6)注意方法重写的时候,不可以降低方法的访问权限,只可以提高,为了方便不同的类都可以实现接口,因此接口中的方法全部都是公开的
* 所以实现了接口的类在重写接口中的方法的时候也就不存在可以修改访问权限的情况了。
* (6)接口存在的意义:接口类似抽象类,都是把其它几个毫无关联但是又具有相同需求的集合在一个接口当中,
* 这样其它类就可以通过实现接口来达到各自的需求,而又不会存在关耦合度过高,代码复用性低的缺陷,相反,抽象类和接口的优点就是降低程序的耦合度,
* 提高程序可扩展性,所以推荐面向抽象编程,实质上是推荐面向接口编程
* 12.抽象类和接口之间的区别:
* (1)抽象类中的成员可以是非抽象的,而接口中的成员则必须全部是抽象的
* (2)抽象类不支持多继承,而接口支持多实现,即接口的可扩展性高于抽象类,一个类可以同时不同的接口里的不同的功能。
* 因此我们一般更多地采用面向接口编程的方式
* 13.关于构造方法:
* 构造方法的作用是方便实例化对象,在实例化对象的时候也可以向其传递参数。
* (1)构造方法分为有参构造和无参构造,一个类在没有写构造方法的情况下就是默认一个无参构造函数
* 类实例化对象其实就是根据这个构造方法创建的新对象。
* (2)有参构造函数是根据类中的属性定义的,即可以在实例化对象的时候就给属性赋予参数指定的值
* (3)构造方法不能够被子类继承。子类要想调用服了中的构造函数,需要使用super关键字
*14.关于super关键字:
* super关键字的作用:
* (1)子类可以使用super关键字操作父类中被隐藏的成员变量和方法(当子类中的成员变量和父类中的相同,子类重写父类中的方法,
* 则父类中的成员变量和方法被隐藏),并且是在子类中的某个方法里面通过super去调用。
* (2)使用super 关键字可以调用父类中的构造方法。每当一个类实例化对象的时候,实际上都是在调用其构造方法
* 而子类在实例化对象的时候不需要首相实例化其父类就可以拥有父类的属性和方法,原因是因为子类的构造方法的第一条语句是super();/super(参数列表);
* 即子类在调用自身的构造方法创建对象时,会先执行super();语句,调用父类中的构造方法首先创建父类对象,只是该对象没有赋值给一个引用,但其实在
* 堆内存中已经为父类的实例化对象开辟了一个空间。
* (3)若子类中的构造方法的第一条语句没有super();语句,则默认被隐藏起来了,实际上是存在的。
* (4)构造方法中super();语句只能有一条,super()可以带参数也可以不带参数,只是创建出来的父类对象上有些差别
关于子类和父类之间的继承关系