继承(1):
--面向对象编程语言和面向过程的编程语言最突出的特点就是变量类型的继承
--继承更符合大自然规律:父亲有的,儿子就有
举个例子:
继承(2):
继承(3):
--面向过程编程语言没有继承,导致出现很多类型重复定义
--物以类聚,世间万物皆对象,对象也可以分成若干类别
--类别内的对象属性和方法都具有一定的共同点
--将共同点提取出来,即形成了父类/基类/超类(三种定义等价的)
Parent class / Base class / Super class
--而其他类则自动成为子类 / 派生类 (等价,用那个词都可以)
Child class / Derived class
继承(4):
注意:从多个类别(对象)中提取共性,
继承(5):
--Man extends Human表示Man继承于Human
--Human是父类,Man是子类
--子类继承父类所有的属性和方法(但是不能直接访问private成员)
--根据信息隐藏原则:子类会继承父类所有的方法。可以直接使用
--子类也会继承父类的父类的所有的属性和方法(但是不能直接访问private成员)
--子类可以通过调用父类的方法(如get、set方法)来访问父类的private私有属性
--在同样方法名和参数情况下,本类的方法会比父类的方法优先级高。当方法是父类的,就调用父类的方法;当方法是自己的,就优先调用自己的方法。
继承(6):
--单根继承原则:每个类都只能继承一个类(而C++支持一个类继承多个类,会产生指代不清的问题)
--如果不写extends,Java类都默认继承java.lang.Object类
--Java所有类从java.lang.Object开始,构建出一个类型继承树(换句话说,Java所有类都继承Object类,即使你不直接继承Object类,那你继承的父类也会继承Object类)
--Object类里面默认就有clone, equals, finalize, getClass, hashCode, toString方法
--任意类,即使空类。如class A{} 也是继承于Object类,所以类A也有clone(), equals()等方法
继承(7):
--每个Java类都必须有构造函数
--如果没有显式定义构造函数,Java编译器自动为该类产生一个空的无形参构造函数。如果已经有了显式的有参构造函数,编译器就不会越俎代庖了。
注意:
--子类构造函数默认第一句话都会调用父类的构造函数
--如果当前类的构造函数的第一句话不是super();,编译器会自动增加一句super(); 。如果构造函数第一句话是程序员自己写的super语句,编译器就不会自动增加了。
--super()的作用是调用父类的无参构造函数;super(x) 的作用是调用父类的某个有参构造函数。
--拗口的说法:每个子类的构造函数的第一句话,都默认调用父类的无参数构造函数super(),除非子类的构造函数第一句话自己写了super,自己决定调用父类的某个构造函数,而且super语句必须放在第一条,不会出现连续两条super语句。