Day08继承 2015/04/14 [size=10.5000pt]1、继承 把多个类中的相同属性和行为进行抽取,封装到一个类中然后再建立新类的时候就不需要从头做起,继承刚才定义的那个类即可。 格式: class 类A extend 类B //A类是子类,B类是父类。 注意: A:子类可以直接直接访问父类中的非私有的属性成员(成员变量和成员方法)。也就是说子类具有了父类中非私有的所有属性。 B:不要为了获取某个类的部分功能而定义继承关系,要遵循is a 的关系 特点: A:java只支持单继承,不支持多继承;因为如果可以多继承就回出现调用不明确问题。 B:java支持多层(重)继承(继承体系)。 好处: A提高了代码的复用性; B让类与类之间产生了一个关系,是多态的前提 什么时候把类的关系定义成继承关系呢? 由于继承体现了一种关系 is a 的关系,以后在定义类的时候(A,B),如果A is a(has a //雁群中has a 大雁/use a) B的一种,或者B is a A,那么他们之间就存在继承关系。前者A是子类,后者B是子类。 [size=10.5000pt]2、子父类的成员变量的关系 通过子类访问一个成员变量的时候: A:先在局部范围内找,如果有就用; B:再在成员变量位置找,如果有就用; C:再在父类成员变量位置找,如果有就用; D:如果找不到就报错。 现在要在子类中输出局部范围的值,输出成员范围 A:局部范围的值,直接输出变量名即可; B:成员范围的值,输出this.变量名 //如果在本类中没有找到就去父类找 C:父类的成员变量 输出super.变量名即可。 //super就是跳过本类去父类找成员变量 [size=10.5000pt]3、Super 和this的用法很像,super代表的是父类的内存空间的标示。(可以理解为父类的对象引用) This和super的使用: 成员变量: This.变量 --- 当前类的变量 Super.变量 ---父类的变量 构造方法:用在构造方法 成员方法: This.方法名()---本类的方法 Super.方法名()---父类的方法 [size=10.5000pt]4、方法的重写(覆盖) 子类中出现和父类中一模一样的方法时会出现覆盖操作,也叫做方法的重写 //原因是先调用本类的方法再调用父类中的。 方法重写和方法重载的区别: 方法重写:子父类中,出现方法相同的情况。返回值类型、方法名、参数列表都相同 方法重载:同一个类中,方法名相同,参数列表不同。 方法声明:返回值类型、方法名、参数列表、修饰符 方法签名:方法名、参数列表 注意事项: A:父类中的私有方法不可以被重写; B:重写时子类方法的访问权限一定要大于等于父类方法访问权限; C:静态的方法只能被静态方法重写。这个其实不能算是对象的关系。 D:在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取 重写的应用: A:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样即沿袭了父类的功能又定义了子类特有的内容。用super.方法名()来调用。 B:父类的功能过时需要重新写入。 [size=10.5000pt]5、继承中的构造方法问题 子类的构造方法实例化时会默认都去访问父类的无参构造方法,因为在子类中的构造方法都有一条默认语句super()。 因为子类会自动具备父类中的非私有化数据,那么这个数据初始化要靠父类完成,所以会去先调用父类的构造方法对数据进行初始化。 注意:如果父类中没有无参构造方法(有带参构造),那该怎么办呢? A:可以通过super(参数)去访问父类中的带参构造方法; B:可以通过this(参数···) 构造方法不能进行方法重写。 [size=10.5000pt]6、继承中代码块的执行顺序 一个类中有静态代码块、构造代码块和构造方法,那么运行顺序是静态代码块 ——> 构造代码块——>构造方法,而且静态代码块只执行一次(因为类只执行一次)。
[size=10.5000pt]7、Final关键字 很多时候,父类中的有些内容是不能被子类重写的。然而只要方法声明相同,子类就可以重写父类方法。这样父类的方法就不安全。针对这种情况,就需要做一个标记,那么这个方法就可以不被重写了。 final可以修饰成员类、成员方法、成员变量。 特点: 它修饰的成员方法不可以被重写; 它修饰的类是不能被继承的。 它修饰的成员变量其实就是一个常量,不能重新赋值但是它的值是可以改变的。
|